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

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* 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 __WIDL_INLINE HRESULT IHTMLFiltersCollection_QueryInterface(IHTMLFiltersCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFiltersCollection_AddRef(IHTMLFiltersCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFiltersCollection_Release(IHTMLFiltersCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFiltersCollection_GetTypeInfoCount(IHTMLFiltersCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFiltersCollection_GetTypeInfo(IHTMLFiltersCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFiltersCollection_get_length(IHTMLFiltersCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFiltersCollection_get__newEnum(IHTMLFiltersCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IIE70DispatchEx_QueryInterface(IIE70DispatchEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IIE70DispatchEx_AddRef(IIE70DispatchEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IIE70DispatchEx_Release(IIE70DispatchEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IIE70DispatchEx_GetTypeInfoCount(IIE70DispatchEx* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IIE70DispatchEx_GetTypeInfo(IIE70DispatchEx* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IIE70DispatchEx_GetDispID(IIE70DispatchEx* This,BSTR bstrName,DWORD grfdex,DISPID *pid) {
    return This->lpVtbl->GetDispID(This,bstrName,grfdex,pid);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IIE70DispatchEx_DeleteMemberByName(IIE70DispatchEx* This,BSTR bstrName,DWORD grfdex) {
    return This->lpVtbl->DeleteMemberByName(This,bstrName,grfdex);
}
static __WIDL_INLINE HRESULT IIE70DispatchEx_DeleteMemberByDispID(IIE70DispatchEx* This,DISPID id) {
    return This->lpVtbl->DeleteMemberByDispID(This,id);
}
static __WIDL_INLINE HRESULT IIE70DispatchEx_GetMemberProperties(IIE70DispatchEx* This,DISPID id,DWORD grfdexFetch,DWORD *pgrfdex) {
    return This->lpVtbl->GetMemberProperties(This,id,grfdexFetch,pgrfdex);
}
static __WIDL_INLINE HRESULT IIE70DispatchEx_GetMemberName(IIE70DispatchEx* This,DISPID id,BSTR *pbstrName) {
    return This->lpVtbl->GetMemberName(This,id,pbstrName);
}
static __WIDL_INLINE HRESULT IIE70DispatchEx_GetNextDispID(IIE70DispatchEx* This,DWORD grfdex,DISPID id,DISPID *pid) {
    return This->lpVtbl->GetNextDispID(This,grfdex,id,pid);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IIE80DispatchEx_QueryInterface(IIE80DispatchEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IIE80DispatchEx_AddRef(IIE80DispatchEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IIE80DispatchEx_Release(IIE80DispatchEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IIE80DispatchEx_GetTypeInfoCount(IIE80DispatchEx* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IIE80DispatchEx_GetTypeInfo(IIE80DispatchEx* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IIE80DispatchEx_GetDispID(IIE80DispatchEx* This,BSTR bstrName,DWORD grfdex,DISPID *pid) {
    return This->lpVtbl->GetDispID(This,bstrName,grfdex,pid);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IIE80DispatchEx_DeleteMemberByName(IIE80DispatchEx* This,BSTR bstrName,DWORD grfdex) {
    return This->lpVtbl->DeleteMemberByName(This,bstrName,grfdex);
}
static __WIDL_INLINE HRESULT IIE80DispatchEx_DeleteMemberByDispID(IIE80DispatchEx* This,DISPID id) {
    return This->lpVtbl->DeleteMemberByDispID(This,id);
}
static __WIDL_INLINE HRESULT IIE80DispatchEx_GetMemberProperties(IIE80DispatchEx* This,DISPID id,DWORD grfdexFetch,DWORD *pgrfdex) {
    return This->lpVtbl->GetMemberProperties(This,id,grfdexFetch,pgrfdex);
}
static __WIDL_INLINE HRESULT IIE80DispatchEx_GetMemberName(IIE80DispatchEx* This,DISPID id,BSTR *pbstrName) {
    return This->lpVtbl->GetMemberName(This,id,pbstrName);
}
static __WIDL_INLINE HRESULT IIE80DispatchEx_GetNextDispID(IIE80DispatchEx* This,DWORD grfdex,DISPID id,DISPID *pid) {
    return This->lpVtbl->GetNextDispID(This,grfdex,id,pid);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMConstructor_QueryInterface(IHTMLDOMConstructor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMConstructor_AddRef(IHTMLDOMConstructor* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMConstructor_Release(IHTMLDOMConstructor* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMConstructor_GetTypeInfoCount(IHTMLDOMConstructor* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructor_GetTypeInfo(IHTMLDOMConstructor* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMConstructor_get_constructor(IHTMLDOMConstructor* This,IDispatch **p) {
    return This->lpVtbl->get_constructor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructor_LookupGetter(IHTMLDOMConstructor* This,BSTR propname,VARIANT *ppDispHandler) {
    return This->lpVtbl->LookupGetter(This,propname,ppDispHandler);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructor_LookupSetter(IHTMLDOMConstructor* This,BSTR propname,VARIANT *ppDispHandler) {
    return This->lpVtbl->LookupSetter(This,propname,ppDispHandler);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructor_DefineGetter(IHTMLDOMConstructor* This,BSTR propname,VARIANT *pdispHandler) {
    return This->lpVtbl->DefineGetter(This,propname,pdispHandler);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_QueryInterface(IHTMLCSSStyleDeclaration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCSSStyleDeclaration_AddRef(IHTMLCSSStyleDeclaration* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCSSStyleDeclaration_Release(IHTMLCSSStyleDeclaration* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_GetTypeInfoCount(IHTMLCSSStyleDeclaration* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_GetTypeInfo(IHTMLCSSStyleDeclaration* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_length(IHTMLCSSStyleDeclaration* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_parentRule(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_parentRule(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_getPropertyValue(IHTMLCSSStyleDeclaration* This,BSTR bstrPropertyName,BSTR *pbstrPropertyValue) {
    return This->lpVtbl->getPropertyValue(This,bstrPropertyName,pbstrPropertyValue);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_getPropertyPriority(IHTMLCSSStyleDeclaration* This,BSTR bstrPropertyName,BSTR *pbstrPropertyPriority) {
    return This->lpVtbl->getPropertyPriority(This,bstrPropertyName,pbstrPropertyPriority);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_removeProperty(IHTMLCSSStyleDeclaration* This,BSTR bstrPropertyName,BSTR *pbstrPropertyValue) {
    return This->lpVtbl->removeProperty(This,bstrPropertyName,pbstrPropertyValue);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_setProperty(IHTMLCSSStyleDeclaration* This,BSTR bstrPropertyName,VARIANT *pvarPropertyValue,VARIANT *pvarPropertyPriority) {
    return This->lpVtbl->setProperty(This,bstrPropertyName,pvarPropertyValue,pvarPropertyPriority);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_item(IHTMLCSSStyleDeclaration* This,LONG index,BSTR *pbstrPropertyName) {
    return This->lpVtbl->item(This,index,pbstrPropertyName);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_fontFamily(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_fontFamily(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_fontFamily(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_fontFamily(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_fontStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_fontStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_fontStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_fontStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_fontVariant(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_fontVariant(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_fontVariant(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_fontVariant(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_fontWeight(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_fontWeight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_fontWeight(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_fontWeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_fontSize(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_fontSize(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_fontSize(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_fontSize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_font(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_font(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_font(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_font(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_color(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_color(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_color(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_color(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_background(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_background(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_background(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_background(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_backgroundColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundImage(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_backgroundImage(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundImage(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_backgroundImage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundRepeat(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_backgroundRepeat(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundRepeat(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_backgroundRepeat(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundAttachment(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_backgroundAttachment(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundAttachment(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_backgroundAttachment(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundPosition(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_backgroundPosition(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundPosition(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_backgroundPosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundPositionX(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_backgroundPositionX(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundPositionX(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundPositionY(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_backgroundPositionY(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundPositionY(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_wordSpacing(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_wordSpacing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_wordSpacing(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_wordSpacing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_letterSpacing(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_letterSpacing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_letterSpacing(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_letterSpacing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_textDecoration(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textDecoration(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_textDecoration(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textDecoration(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_verticalAlign(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_verticalAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_verticalAlign(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_verticalAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_textTransform(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textTransform(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_textTransform(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textTransform(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_textAlign(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_textAlign(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_textIndent(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_textIndent(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_textIndent(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_textIndent(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_lineHeight(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_lineHeight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_lineHeight(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_lineHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_marginTop(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_marginTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_marginTop(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_marginTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_marginRight(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_marginRight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_marginRight(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_marginRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_marginBottom(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_marginBottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_marginBottom(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_marginBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_marginLeft(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_marginLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_marginLeft(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_marginLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_margin(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_margin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_margin(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_margin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_paddingTop(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_paddingTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_paddingTop(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_paddingTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_paddingRight(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_paddingRight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_paddingRight(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_paddingRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_paddingBottom(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_paddingBottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_paddingBottom(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_paddingBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_paddingLeft(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_paddingLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_paddingLeft(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_paddingLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_padding(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_padding(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_padding(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_padding(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_border(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_border(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_border(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_border(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderTop(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderTop(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderRight(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderRight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderRight(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderBottom(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderBottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderBottom(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderLeft(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderLeft(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderColor(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderColor(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderTopColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderTopColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderTopColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderRightColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderRightColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderRightColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderBottomColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderBottomColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderBottomColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderLeftColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderLeftColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderLeftColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderWidth(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderWidth(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderTopWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderTopWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderTopWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderRightWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderRightWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderRightWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderBottomWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderBottomWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderBottomWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderLeftWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_borderLeftWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderLeftWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderTopStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderTopStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderTopStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderTopStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderRightStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderRightStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderRightStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderRightStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderBottomStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderBottomStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderBottomStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderBottomStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderLeftStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderLeftStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderLeftStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderLeftStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_width(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_width(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_height(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_height(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_styleFloat(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_styleFloat(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_styleFloat(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_styleFloat(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_clear(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_clear(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_clear(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_clear(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_display(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_display(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_display(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_display(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_visibility(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_visibility(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_visibility(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_visibility(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_listStyleType(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_listStyleType(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_listStyleType(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_listStyleType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_listStylePosition(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_listStylePosition(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_listStylePosition(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_listStylePosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_listStyleImage(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_listStyleImage(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_listStyleImage(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_listStyleImage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_listStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_listStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_listStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_listStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_whiteSpace(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_whiteSpace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_whiteSpace(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_whiteSpace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_top(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_top(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_top(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_top(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_left(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_left(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_left(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_left(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_zIndex(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_zIndex(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_zIndex(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_zIndex(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_overflow(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_overflow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_overflow(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_overflow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_pageBreakBefore(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_pageBreakBefore(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_pageBreakBefore(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakBefore(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_pageBreakAfter(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_pageBreakAfter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_pageBreakAfter(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakAfter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_cssText(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_cssText(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_cssText(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_cssText(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_cursor(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_cursor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_cursor(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_cursor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_clip(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_clip(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_clip(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_clip(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_filter(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_filter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_filter(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_filter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_tableLayout(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_tableLayout(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_tableLayout(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_tableLayout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderCollapse(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderCollapse(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderCollapse(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderCollapse(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_direction(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_direction(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_direction(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_direction(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_behavior(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_behavior(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_behavior(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_behavior(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_position(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_position(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_position(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_position(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_unicodeBidi(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_unicodeBidi(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_unicodeBidi(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_unicodeBidi(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_bottom(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_bottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_bottom(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_bottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_right(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_right(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_right(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_right(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_imeMode(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_imeMode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_imeMode(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_imeMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_rubyAlign(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_rubyAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_rubyAlign(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_rubyAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_rubyPosition(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_rubyPosition(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_rubyPosition(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_rubyPosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_rubyOverhang(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_rubyOverhang(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_rubyOverhang(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_rubyOverhang(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_layoutGridChar(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_layoutGridChar(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_layoutGridChar(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridChar(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_layoutGridLine(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_layoutGridLine(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_layoutGridLine(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridLine(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_layoutGridMode(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_layoutGridMode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_layoutGridMode(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_layoutGridType(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_layoutGridType(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_layoutGridType(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_layoutGrid(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_layoutGrid(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_layoutGrid(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_layoutGrid(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_textAutospace(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textAutospace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_textAutospace(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textAutospace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_wordBreak(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_wordBreak(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_wordBreak(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_wordBreak(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_lineBreak(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_lineBreak(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_lineBreak(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_lineBreak(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_textJustify(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textJustify(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_textJustify(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textJustify(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_textJustifyTrim(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textJustifyTrim(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_textJustifyTrim(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textJustifyTrim(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_textKashida(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_textKashida(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_textKashida(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_textKashida(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_overflowX(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_overflowX(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_overflowX(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_overflowX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_overflowY(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_overflowY(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_overflowY(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_overflowY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_accelerator(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_accelerator(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_accelerator(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_accelerator(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_layoutFlow(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_layoutFlow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_layoutFlow(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_layoutFlow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_zoom(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_zoom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_zoom(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_zoom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_wordWrap(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_wordWrap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_wordWrap(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_wordWrap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_textUnderlinePosition(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textUnderlinePosition(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_textUnderlinePosition(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textUnderlinePosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbarBaseColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarBaseColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbarBaseColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarBaseColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbarFaceColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarFaceColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbarFaceColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarFaceColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbar3dLightColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbar3dLightColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbar3dLightColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbar3dLightColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbarShadowColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarShadowColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbarShadowColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarShadowColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbarHighlightColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarHighlightColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbarHighlightColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarHighlightColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbarDarkShadowColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarDarkShadowColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbarDarkShadowColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarDarkShadowColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbarArrowColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarArrowColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbarArrowColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarArrowColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_scrollbarTrackColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarTrackColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_scrollbarTrackColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarTrackColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_writingMode(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_writingMode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_writingMode(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_writingMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_textAlignLast(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textAlignLast(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_textAlignLast(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textAlignLast(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_textKashidaSpace(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_textKashidaSpace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_textKashidaSpace(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_textKashidaSpace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_textOverflow(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textOverflow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_textOverflow(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textOverflow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_minHeight(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_minHeight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_minHeight(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_minHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_msInterpolationMode(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_msInterpolationMode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_msInterpolationMode(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_msInterpolationMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_maxHeight(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_maxHeight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_maxHeight(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_maxHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_minWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_minWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_minWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_minWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_maxWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_maxWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_maxWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_maxWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_content(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_content(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_content(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_content(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_captionSide(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_captionSide(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_captionSide(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_captionSide(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_counterIncrement(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_counterIncrement(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_counterIncrement(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_counterIncrement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_counterReset(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_counterReset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_counterReset(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_counterReset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_outline(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_outline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_outline(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_outline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_outlineWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_outlineWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_outlineWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_outlineWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_outlineStyle(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_outlineStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_outlineStyle(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_outlineStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_outlineColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_outlineColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_outlineColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_outlineColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_boxSizing(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_boxSizing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_boxSizing(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_boxSizing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderSpacing(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderSpacing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderSpacing(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderSpacing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_orphans(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_orphans(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_orphans(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_orphans(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_widows(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_widows(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_widows(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_widows(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_pageBreakInside(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_pageBreakInside(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_pageBreakInside(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakInside(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_emptyCells(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_emptyCells(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_emptyCells(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_emptyCells(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_msBlockProgression(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_msBlockProgression(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_msBlockProgression(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_msBlockProgression(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_quotes(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_quotes(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_quotes(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_quotes(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_alignmentBaseline(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_alignmentBaseline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_alignmentBaseline(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_alignmentBaseline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_baselineShift(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_baselineShift(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_baselineShift(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_baselineShift(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_dominantBaseline(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_dominantBaseline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_dominantBaseline(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_dominantBaseline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_fontSizeAdjust(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_fontSizeAdjust(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_fontSizeAdjust(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_fontSizeAdjust(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_fontStretch(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_fontStretch(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_fontStretch(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_fontStretch(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_opacity(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_opacity(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_opacity(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_opacity(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_clipPath(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_clipPath(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_clipPath(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_clipPath(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_clipRule(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_clipRule(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_clipRule(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_clipRule(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_fill(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_fill(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_fill(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_fill(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_fillOpacity(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_fillOpacity(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_fillOpacity(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_fillOpacity(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_fillRule(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_fillRule(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_fillRule(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_fillRule(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_kerning(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_kerning(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_kerning(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_kerning(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_marker(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_marker(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_marker(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_marker(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_markerEnd(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_markerEnd(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_markerEnd(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_markerEnd(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_markerMid(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_markerMid(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_markerMid(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_markerMid(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_markerStart(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_markerStart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_markerStart(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_markerStart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_mask(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_mask(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_mask(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_mask(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_pointerEvents(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_pointerEvents(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_pointerEvents(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_pointerEvents(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_stopColor(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_stopColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_stopColor(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_stopColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_stopOpacity(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_stopOpacity(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_stopOpacity(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_stopOpacity(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_stroke(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_stroke(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_stroke(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_stroke(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_strokeDasharray(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_strokeDasharray(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_strokeDasharray(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_strokeDasharray(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_strokeDashoffset(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_strokeDashoffset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_strokeDashoffset(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_strokeDashoffset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_strokeLinecap(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_strokeLinecap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_strokeLinecap(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_strokeLinecap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_strokeLinejoin(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_strokeLinejoin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_strokeLinejoin(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_strokeLinejoin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_strokeMiterlimit(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_strokeMiterlimit(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_strokeMiterlimit(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_strokeMiterlimit(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_strokeOpacity(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_strokeOpacity(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_strokeOpacity(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_strokeOpacity(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_strokeWidth(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_strokeWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_strokeWidth(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_strokeWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_textAnchor(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_textAnchor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_textAnchor(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_textAnchor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_glyphOrientationHorizontal(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_glyphOrientationHorizontal(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_glyphOrientationHorizontal(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_glyphOrientationHorizontal(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_glyphOrientationVertical(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_glyphOrientationVertical(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_glyphOrientationVertical(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_glyphOrientationVertical(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderRadius(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderRadius(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderRadius(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderRadius(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderTopLeftRadius(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderTopLeftRadius(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderTopLeftRadius(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderTopLeftRadius(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderTopRightRadius(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderTopRightRadius(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderTopRightRadius(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderTopRightRadius(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderBottomRightRadius(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderBottomRightRadius(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderBottomRightRadius(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderBottomRightRadius(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_borderBottomLeftRadius(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_borderBottomLeftRadius(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_borderBottomLeftRadius(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_borderBottomLeftRadius(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_clipTop(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_clipTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_clipTop(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_clipTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_clipRight(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_clipRight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_clipRight(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_clipRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_clipBottom(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_clipBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_clipLeft(IHTMLCSSStyleDeclaration* This,VARIANT v) {
    return This->lpVtbl->put_clipLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_clipLeft(IHTMLCSSStyleDeclaration* This,VARIANT *p) {
    return This->lpVtbl->get_clipLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_cssFloat(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_cssFloat(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_cssFloat(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_cssFloat(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundClip(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_backgroundClip(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundClip(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_backgroundClip(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundOrigin(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_backgroundOrigin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundOrigin(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_backgroundOrigin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_backgroundSize(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_backgroundSize(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_backgroundSize(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_backgroundSize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_boxShadow(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_boxShadow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_boxShadow(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_boxShadow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_msTransform(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_msTransform(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_get_msTransform(IHTMLCSSStyleDeclaration* This,BSTR *p) {
    return This->lpVtbl->get_msTransform(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration_put_msTransformOrigin(IHTMLCSSStyleDeclaration* This,BSTR v) {
    return This->lpVtbl->put_msTransformOrigin(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_QueryInterface(IHTMLCSSStyleDeclaration2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCSSStyleDeclaration2_AddRef(IHTMLCSSStyleDeclaration2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCSSStyleDeclaration2_Release(IHTMLCSSStyleDeclaration2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_GetTypeInfoCount(IHTMLCSSStyleDeclaration2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_GetTypeInfo(IHTMLCSSStyleDeclaration2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollChaining(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollChaining(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollChaining(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollChaining(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZooming(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msContentZooming(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZooming(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msContentZooming(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZoomSnapType(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msContentZoomSnapType(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZoomSnapType(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msContentZoomSnapType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollRails(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollRails(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollRails(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollRails(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZoomChaining(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msContentZoomChaining(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZoomChaining(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msContentZoomChaining(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollSnapType(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollSnapType(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollSnapType(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollSnapType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZoomLimit(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msContentZoomLimit(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZoomLimit(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msContentZoomLimit(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZoomSnap(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msContentZoomSnap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZoomSnap(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msContentZoomSnap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZoomSnapPoints(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msContentZoomSnapPoints(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZoomSnapPoints(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msContentZoomSnapPoints(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZoomLimitMin(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msContentZoomLimitMin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZoomLimitMin(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msContentZoomLimitMin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msContentZoomLimitMax(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msContentZoomLimitMax(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msContentZoomLimitMax(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msContentZoomLimitMax(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollSnapX(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollSnapX(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollSnapX(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollSnapX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollSnapY(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollSnapY(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollSnapY(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollSnapY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollSnapPointsX(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollSnapPointsX(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollSnapPointsX(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollSnapPointsX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollSnapPointsY(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollSnapPointsY(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollSnapPointsY(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollSnapPointsY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridColumn(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msGridColumn(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridColumn(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msGridColumn(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridColumnAlign(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msGridColumnAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridColumnAlign(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msGridColumnAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridColumns(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msGridColumns(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridColumns(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msGridColumns(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridColumnSpan(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msGridColumnSpan(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridColumnSpan(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msGridColumnSpan(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridRow(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msGridRow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridRow(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msGridRow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridRowAlign(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msGridRowAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridRowAlign(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msGridRowAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridRows(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msGridRows(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridRows(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msGridRows(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msGridRowSpan(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msGridRowSpan(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msGridRowSpan(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msGridRowSpan(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msWrapThrough(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msWrapThrough(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msWrapThrough(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msWrapThrough(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msWrapMargin(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msWrapMargin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msWrapMargin(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msWrapMargin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msWrapFlow(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msWrapFlow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msWrapFlow(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msWrapFlow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationName(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationName(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationName(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationName(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationDuration(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationDuration(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationDuration(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationDuration(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationTimingFunction(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationTimingFunction(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationDelay(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationDelay(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationDelay(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationDelay(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationDirection(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationDirection(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationDirection(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationDirection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationPlayState(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationPlayState(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationPlayState(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationPlayState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationIterationCount(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationIterationCount(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationIterationCount(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationIterationCount(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimation(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimation(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimation(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimation(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msAnimationFillMode(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msAnimationFillMode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msAnimationFillMode(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msAnimationFillMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_colorInterpolationFilters(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_colorInterpolationFilters(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_colorInterpolationFilters(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_colorInterpolationFilters(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnCount(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_columnCount(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnCount(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_columnCount(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnWidth(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_columnWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnWidth(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_columnWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnGap(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_columnGap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnGap(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_columnGap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnFill(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_columnFill(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnFill(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_columnFill(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnSpan(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_columnSpan(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnSpan(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_columnSpan(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_columns(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_columns(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_columns(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_columns(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnRule(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_columnRule(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnRule(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_columnRule(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnRuleColor(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_columnRuleColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnRuleColor(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_columnRuleColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnRuleStyle(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_columnRuleStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnRuleStyle(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_columnRuleStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_columnRuleWidth(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_columnRuleWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_columnRuleWidth(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_columnRuleWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_breakBefore(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_breakBefore(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_breakBefore(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_breakBefore(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_breakAfter(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_breakAfter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_breakAfter(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_breakAfter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_breakInside(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_breakInside(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_breakInside(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_breakInside(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_floodColor(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_floodColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_floodColor(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_floodColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_floodOpacity(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_floodOpacity(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_floodOpacity(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_floodOpacity(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_lightingColor(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_lightingColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_lightingColor(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_lightingColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollLimitXMin(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msScrollLimitXMin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollLimitXMin(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msScrollLimitXMin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollLimitYMin(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msScrollLimitYMin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollLimitYMin(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msScrollLimitYMin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollLimitXMax(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msScrollLimitXMax(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollLimitXMax(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msScrollLimitXMax(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollLimitYMax(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msScrollLimitYMax(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollLimitYMax(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msScrollLimitYMax(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollLimit(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollLimit(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollLimit(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollLimit(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_textShadow(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_textShadow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_textShadow(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_textShadow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlowFrom(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlowFrom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlowFrom(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlowFrom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlowInto(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlowInto(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlowInto(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlowInto(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msHyphens(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msHyphens(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msHyphens(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msHyphens(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msHyphenateLimitZone(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msHyphenateLimitZone(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msHyphenateLimitZone(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msHyphenateLimitZone(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msHyphenateLimitChars(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msHyphenateLimitChars(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msHyphenateLimitChars(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msHyphenateLimitChars(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msHyphenateLimitLines(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msHyphenateLimitLines(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msHyphenateLimitLines(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msHyphenateLimitLines(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msHighContrastAdjust(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msHighContrastAdjust(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msHighContrastAdjust(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msHighContrastAdjust(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_enableBackground(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_enableBackground(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_enableBackground(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_enableBackground(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFontFeatureSettings(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFontFeatureSettings(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFontFeatureSettings(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFontFeatureSettings(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msUserSelect(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msUserSelect(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msUserSelect(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msUserSelect(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msOverflowStyle(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msOverflowStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msOverflowStyle(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msOverflowStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTransformStyle(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTransformStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTransformStyle(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTransformStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msBackfaceVisibility(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msBackfaceVisibility(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msBackfaceVisibility(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msBackfaceVisibility(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msPerspective(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msPerspective(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msPerspective(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msPerspective(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msPerspectiveOrigin(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msPerspectiveOrigin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msPerspectiveOrigin(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msPerspectiveOrigin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTransitionProperty(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTransitionProperty(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTransitionProperty(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTransitionProperty(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTransitionDuration(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTransitionDuration(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTransitionDuration(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTransitionDuration(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTransitionTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTransitionTimingFunction(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTransitionTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTransitionTimingFunction(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTransitionDelay(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTransitionDelay(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTransitionDelay(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTransitionDelay(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTransition(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTransition(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTransition(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTransition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTouchAction(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTouchAction(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTouchAction(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTouchAction(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msScrollTranslation(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msScrollTranslation(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msScrollTranslation(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msScrollTranslation(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlex(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlex(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlex(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlex(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexPositive(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msFlexPositive(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexPositive(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msFlexPositive(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexNegative(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msFlexNegative(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexNegative(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msFlexNegative(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexPreferredSize(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msFlexPreferredSize(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexPreferredSize(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msFlexPreferredSize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexFlow(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlexFlow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexFlow(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlexFlow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexDirection(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlexDirection(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexDirection(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlexDirection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexWrap(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlexWrap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexWrap(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlexWrap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexAlign(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlexAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexAlign(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlexAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexItemAlign(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlexItemAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexItemAlign(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlexItemAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexPack(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlexPack(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexPack(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlexPack(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexLinePack(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msFlexLinePack(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexLinePack(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msFlexLinePack(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msFlexOrder(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_msFlexOrder(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msFlexOrder(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_msFlexOrder(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_msTouchSelect(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_msTouchSelect(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_msTouchSelect(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_msTouchSelect(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_transform(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transform(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_transform(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transform(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_transformOrigin(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transformOrigin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_transformOrigin(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transformOrigin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_transformStyle(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transformStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_transformStyle(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transformStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_backfaceVisibility(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_backfaceVisibility(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_backfaceVisibility(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_backfaceVisibility(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_perspective(IHTMLCSSStyleDeclaration2* This,VARIANT v) {
    return This->lpVtbl->put_perspective(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_perspective(IHTMLCSSStyleDeclaration2* This,VARIANT *p) {
    return This->lpVtbl->get_perspective(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_perspectiveOrigin(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_perspectiveOrigin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_perspectiveOrigin(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_perspectiveOrigin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_transitionProperty(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transitionProperty(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_transitionProperty(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transitionProperty(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_transitionDuration(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transitionDuration(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_transitionDuration(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transitionDuration(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_transitionTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transitionTimingFunction(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_transitionTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transitionTimingFunction(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_transitionDelay(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transitionDelay(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_transitionDelay(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transitionDelay(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_transition(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_transition(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_transition(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_transition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_fontFeatureSettings(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_fontFeatureSettings(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_fontFeatureSettings(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_fontFeatureSettings(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationName(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationName(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationName(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationName(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationDuration(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationDuration(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationDuration(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationDuration(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationTimingFunction(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationTimingFunction(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationTimingFunction(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationDelay(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationDelay(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationDelay(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationDelay(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationDirection(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationDirection(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationDirection(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationDirection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationPlayState(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationPlayState(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationPlayState(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationPlayState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationIterationCount(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationIterationCount(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_animationIterationCount(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animationIterationCount(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_animation(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animation(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_get_animation(IHTMLCSSStyleDeclaration2* This,BSTR *p) {
    return This->lpVtbl->get_animation(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSStyleDeclaration2_put_animationFillMode(IHTMLCSSStyleDeclaration2* This,BSTR v) {
    return This->lpVtbl->put_animationFillMode(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleEnabled_QueryInterface(IHTMLStyleEnabled* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleEnabled_AddRef(IHTMLStyleEnabled* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleEnabled_Release(IHTMLStyleEnabled* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleEnabled_GetTypeInfoCount(IHTMLStyleEnabled* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleEnabled_GetTypeInfo(IHTMLStyleEnabled* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleEnabled_msGetPropertyEnabled(IHTMLStyleEnabled* This,BSTR name,VARIANT_BOOL *p) {
    return This->lpVtbl->msGetPropertyEnabled(This,name,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLCSSStyleDeclaration_QueryInterface(DispHTMLCSSStyleDeclaration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLCSSStyleDeclaration_AddRef(DispHTMLCSSStyleDeclaration* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLCSSStyleDeclaration_Release(DispHTMLCSSStyleDeclaration* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLCSSStyleDeclaration_GetTypeInfoCount(DispHTMLCSSStyleDeclaration* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLCSSStyleDeclaration_GetTypeInfo(DispHTMLCSSStyleDeclaration* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyle_QueryInterface(IHTMLStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyle_AddRef(IHTMLStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyle_Release(IHTMLStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyle_GetTypeInfoCount(IHTMLStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyle_GetTypeInfo(IHTMLStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyle_put_fontFamily(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_fontFamily(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_fontFamily(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontFamily(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_fontStyle(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_fontStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_fontStyle(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_fontVariant(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_fontVariant(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_fontVariant(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontVariant(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_fontWeight(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_fontWeight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_fontWeight(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontWeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_fontSize(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_fontSize(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_fontSize(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_fontSize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_font(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_font(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_font(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_font(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_color(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_color(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_color(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_color(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_background(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_background(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_background(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_background(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_backgroundColor(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_backgroundColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_backgroundColor(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_backgroundImage(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundImage(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_backgroundImage(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundImage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_backgroundRepeat(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundRepeat(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_backgroundRepeat(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundRepeat(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_backgroundAttachment(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundAttachment(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_backgroundAttachment(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundAttachment(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_backgroundPosition(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundPosition(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_backgroundPosition(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundPosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_backgroundPositionX(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_backgroundPositionX(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_backgroundPositionX(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_backgroundPositionY(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_backgroundPositionY(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_backgroundPositionY(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_wordSpacing(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_wordSpacing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_wordSpacing(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_wordSpacing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_letterSpacing(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_letterSpacing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_letterSpacing(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_letterSpacing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_textDecoration(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_textDecoration(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_textDecoration(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_textDecoration(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_textDecorationNone(IHTMLStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationNone(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_textDecorationNone(IHTMLStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationNone(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_textDecorationUnderline(IHTMLStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationUnderline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_textDecorationUnderline(IHTMLStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationUnderline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_textDecorationOverline(IHTMLStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationOverline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_textDecorationOverline(IHTMLStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationOverline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_textDecorationLineThrough(IHTMLStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationLineThrough(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_textDecorationLineThrough(IHTMLStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationLineThrough(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_textDecorationBlink(IHTMLStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationBlink(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_textDecorationBlink(IHTMLStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationBlink(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_verticalAlign(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_verticalAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_verticalAlign(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_verticalAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_textTransform(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_textTransform(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_textTransform(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_textTransform(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_textAlign(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_textAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_textAlign(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_textAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_textIndent(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_textIndent(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_textIndent(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_textIndent(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_lineHeight(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_lineHeight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_lineHeight(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_lineHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_marginTop(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_marginTop(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_marginRight(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginRight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_marginRight(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_marginBottom(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginBottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_marginBottom(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_marginLeft(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_marginLeft(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_margin(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_margin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_margin(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_margin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_paddingTop(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_paddingTop(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_paddingRight(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingRight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_paddingRight(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_paddingBottom(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingBottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_paddingBottom(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_paddingLeft(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_paddingLeft(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_padding(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_padding(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_padding(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_padding(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_border(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_border(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_border(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_border(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderTop(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderTop(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderRight(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderRight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderRight(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderBottom(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderBottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderBottom(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderLeft(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderLeft(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderColor(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderColor(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderTopColor(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderTopColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderTopColor(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderRightColor(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderRightColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderRightColor(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderBottomColor(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderBottomColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderBottomColor(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderLeftColor(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderLeftColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderLeftColor(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderWidth(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderWidth(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderTopWidth(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderTopWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderTopWidth(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderRightWidth(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderRightWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderRightWidth(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderBottomWidth(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderBottomWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderBottomWidth(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderLeftWidth(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderLeftWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderLeftWidth(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderStyle(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderStyle(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderTopStyle(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderTopStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderTopStyle(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderTopStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderRightStyle(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderRightStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderRightStyle(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderRightStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderBottomStyle(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderBottomStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderBottomStyle(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderBottomStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_borderLeftStyle(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_borderLeftStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_borderLeftStyle(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderLeftStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_width(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_width(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_height(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_height(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_styleFloat(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_styleFloat(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_styleFloat(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_styleFloat(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_clear(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_clear(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_clear(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_clear(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_display(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_display(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_display(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_display(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_visibility(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_visibility(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_visibility(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_visibility(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_listStyleType(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_listStyleType(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_listStyleType(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyleType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_listStylePosition(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_listStylePosition(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_listStylePosition(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStylePosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_listStyleImage(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_listStyleImage(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_listStyleImage(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyleImage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_listStyle(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_listStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_listStyle(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_whiteSpace(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_whiteSpace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_whiteSpace(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_whiteSpace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_top(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_top(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_top(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_top(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_left(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_left(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_left(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_left(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_position(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_position(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_zIndex(IHTMLStyle* This,VARIANT v) {
    return This->lpVtbl->put_zIndex(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_zIndex(IHTMLStyle* This,VARIANT *p) {
    return This->lpVtbl->get_zIndex(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_overflow(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_overflow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_overflow(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_overflow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_pageBreakBefore(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_pageBreakBefore(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_pageBreakBefore(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakBefore(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_pageBreakAfter(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_pageBreakAfter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_pageBreakAfter(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakAfter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_cssText(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_cssText(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_cssText(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_cssText(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_pixelTop(IHTMLStyle* This,LONG v) {
    return This->lpVtbl->put_pixelTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_pixelTop(IHTMLStyle* This,LONG *p) {
    return This->lpVtbl->get_pixelTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_pixelLeft(IHTMLStyle* This,LONG v) {
    return This->lpVtbl->put_pixelLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_pixelLeft(IHTMLStyle* This,LONG *p) {
    return This->lpVtbl->get_pixelLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_pixelWidth(IHTMLStyle* This,LONG v) {
    return This->lpVtbl->put_pixelWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_pixelWidth(IHTMLStyle* This,LONG *p) {
    return This->lpVtbl->get_pixelWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_pixelHeight(IHTMLStyle* This,LONG v) {
    return This->lpVtbl->put_pixelHeight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_pixelHeight(IHTMLStyle* This,LONG *p) {
    return This->lpVtbl->get_pixelHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_posTop(IHTMLStyle* This,float v) {
    return This->lpVtbl->put_posTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_posTop(IHTMLStyle* This,float *p) {
    return This->lpVtbl->get_posTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_posLeft(IHTMLStyle* This,float v) {
    return This->lpVtbl->put_posLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_posLeft(IHTMLStyle* This,float *p) {
    return This->lpVtbl->get_posLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_posWidth(IHTMLStyle* This,float v) {
    return This->lpVtbl->put_posWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_posWidth(IHTMLStyle* This,float *p) {
    return This->lpVtbl->get_posWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_posHeight(IHTMLStyle* This,float v) {
    return This->lpVtbl->put_posHeight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_posHeight(IHTMLStyle* This,float *p) {
    return This->lpVtbl->get_posHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_cursor(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_cursor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_cursor(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_cursor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_clip(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_clip(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_clip(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_clip(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_put_filter(IHTMLStyle* This,BSTR v) {
    return This->lpVtbl->put_filter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle_get_filter(IHTMLStyle* This,BSTR *p) {
    return This->lpVtbl->get_filter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle_setAttribute(IHTMLStyle* This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags) {
    return This->lpVtbl->setAttribute(This,strAttributeName,AttributeValue,lFlags);
}
static __WIDL_INLINE HRESULT IHTMLStyle_getAttribute(IHTMLStyle* This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue);
}
static __WIDL_INLINE HRESULT IHTMLStyle_removeAttribute(IHTMLStyle* This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess) {
    return This->lpVtbl->removeAttribute(This,strAttributeName,lFlags,pfSuccess);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyle2_QueryInterface(IHTMLStyle2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyle2_AddRef(IHTMLStyle2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyle2_Release(IHTMLStyle2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyle2_GetTypeInfoCount(IHTMLStyle2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_GetTypeInfo(IHTMLStyle2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyle2_put_tableLayout(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_tableLayout(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_tableLayout(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_tableLayout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_borderCollapse(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_borderCollapse(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_borderCollapse(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_borderCollapse(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_direction(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_direction(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_direction(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_direction(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_behavior(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_behavior(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_behavior(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_behavior(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_setExpression(IHTMLStyle2* This,BSTR propname,BSTR expression,BSTR language) {
    return This->lpVtbl->setExpression(This,propname,expression,language);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_getExpression(IHTMLStyle2* This,BSTR propname,VARIANT *expression) {
    return This->lpVtbl->getExpression(This,propname,expression);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_removeExpression(IHTMLStyle2* This,BSTR propname,VARIANT_BOOL *pfSuccess) {
    return This->lpVtbl->removeExpression(This,propname,pfSuccess);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_position(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_position(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_position(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_position(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_unicodeBidi(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_unicodeBidi(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_unicodeBidi(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_unicodeBidi(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_bottom(IHTMLStyle2* This,VARIANT v) {
    return This->lpVtbl->put_bottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_bottom(IHTMLStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_bottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_right(IHTMLStyle2* This,VARIANT v) {
    return This->lpVtbl->put_right(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_right(IHTMLStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_right(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_pixelBottom(IHTMLStyle2* This,LONG v) {
    return This->lpVtbl->put_pixelBottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_pixelBottom(IHTMLStyle2* This,LONG *p) {
    return This->lpVtbl->get_pixelBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_pixelRight(IHTMLStyle2* This,LONG v) {
    return This->lpVtbl->put_pixelRight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_pixelRight(IHTMLStyle2* This,LONG *p) {
    return This->lpVtbl->get_pixelRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_posBottom(IHTMLStyle2* This,float v) {
    return This->lpVtbl->put_posBottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_posBottom(IHTMLStyle2* This,float *p) {
    return This->lpVtbl->get_posBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_posRight(IHTMLStyle2* This,float v) {
    return This->lpVtbl->put_posRight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_posRight(IHTMLStyle2* This,float *p) {
    return This->lpVtbl->get_posRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_imeMode(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_imeMode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_imeMode(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_imeMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_rubyAlign(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_rubyAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_rubyAlign(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_rubyAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_rubyPosition(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_rubyPosition(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_rubyPosition(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_rubyPosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_rubyOverhang(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_rubyOverhang(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_rubyOverhang(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_rubyOverhang(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_layoutGridChar(IHTMLStyle2* This,VARIANT v) {
    return This->lpVtbl->put_layoutGridChar(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_layoutGridChar(IHTMLStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridChar(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_layoutGridLine(IHTMLStyle2* This,VARIANT v) {
    return This->lpVtbl->put_layoutGridLine(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_layoutGridLine(IHTMLStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridLine(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_layoutGridMode(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_layoutGridMode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_layoutGridMode(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_layoutGridType(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_layoutGridType(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_layoutGridType(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_layoutGrid(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_layoutGrid(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_layoutGrid(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_layoutGrid(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_wordBreak(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_wordBreak(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_wordBreak(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_wordBreak(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_lineBreak(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_lineBreak(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_lineBreak(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_lineBreak(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_textJustify(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_textJustify(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_textJustify(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textJustify(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_textJustifyTrim(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_textJustifyTrim(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_textJustifyTrim(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textJustifyTrim(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_textKashida(IHTMLStyle2* This,VARIANT v) {
    return This->lpVtbl->put_textKashida(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_textKashida(IHTMLStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_textKashida(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_textAutospace(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_textAutospace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_textAutospace(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textAutospace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_overflowX(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_overflowX(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_overflowX(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_overflowX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_overflowY(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_overflowY(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_get_overflowY(IHTMLStyle2* This,BSTR *p) {
    return This->lpVtbl->get_overflowY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle2_put_accelerator(IHTMLStyle2* This,BSTR v) {
    return This->lpVtbl->put_accelerator(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyle3_QueryInterface(IHTMLStyle3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyle3_AddRef(IHTMLStyle3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyle3_Release(IHTMLStyle3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyle3_GetTypeInfoCount(IHTMLStyle3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_GetTypeInfo(IHTMLStyle3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyle3_put_layoutFlow(IHTMLStyle3* This,BSTR v) {
    return This->lpVtbl->put_layoutFlow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_get_layoutFlow(IHTMLStyle3* This,BSTR *p) {
    return This->lpVtbl->get_layoutFlow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_put_zoom(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_zoom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_get_zoom(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_zoom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_put_wordWrap(IHTMLStyle3* This,BSTR v) {
    return This->lpVtbl->put_wordWrap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_get_wordWrap(IHTMLStyle3* This,BSTR *p) {
    return This->lpVtbl->get_wordWrap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_put_textUnderlinePosition(IHTMLStyle3* This,BSTR v) {
    return This->lpVtbl->put_textUnderlinePosition(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_get_textUnderlinePosition(IHTMLStyle3* This,BSTR *p) {
    return This->lpVtbl->get_textUnderlinePosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_put_scrollbarBaseColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarBaseColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_get_scrollbarBaseColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarBaseColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_put_scrollbarFaceColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarFaceColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_get_scrollbarFaceColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarFaceColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_put_scrollbar3dLightColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbar3dLightColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_get_scrollbar3dLightColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbar3dLightColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_put_scrollbarShadowColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarShadowColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_get_scrollbarShadowColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarShadowColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_put_scrollbarHighlightColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarHighlightColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_get_scrollbarHighlightColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarHighlightColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_put_scrollbarDarkShadowColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarDarkShadowColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_get_scrollbarDarkShadowColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarDarkShadowColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_put_scrollbarArrowColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarArrowColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_get_scrollbarArrowColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarArrowColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_put_scrollbarTrackColor(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarTrackColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_get_scrollbarTrackColor(IHTMLStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarTrackColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_put_writingMode(IHTMLStyle3* This,BSTR v) {
    return This->lpVtbl->put_writingMode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_get_writingMode(IHTMLStyle3* This,BSTR *p) {
    return This->lpVtbl->get_writingMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_put_textAlignLast(IHTMLStyle3* This,BSTR v) {
    return This->lpVtbl->put_textAlignLast(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_get_textAlignLast(IHTMLStyle3* This,BSTR *p) {
    return This->lpVtbl->get_textAlignLast(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle3_put_textKashidaSpace(IHTMLStyle3* This,VARIANT v) {
    return This->lpVtbl->put_textKashidaSpace(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyle4_QueryInterface(IHTMLStyle4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyle4_AddRef(IHTMLStyle4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyle4_Release(IHTMLStyle4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyle4_GetTypeInfoCount(IHTMLStyle4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyle4_GetTypeInfo(IHTMLStyle4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyle4_put_textOverflow(IHTMLStyle4* This,BSTR v) {
    return This->lpVtbl->put_textOverflow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle4_get_textOverflow(IHTMLStyle4* This,BSTR *p) {
    return This->lpVtbl->get_textOverflow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle4_put_minHeight(IHTMLStyle4* This,VARIANT v) {
    return This->lpVtbl->put_minHeight(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyle5_QueryInterface(IHTMLStyle5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyle5_AddRef(IHTMLStyle5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyle5_Release(IHTMLStyle5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyle5_GetTypeInfoCount(IHTMLStyle5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyle5_GetTypeInfo(IHTMLStyle5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyle5_put_msInterpolationMode(IHTMLStyle5* This,BSTR v) {
    return This->lpVtbl->put_msInterpolationMode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle5_get_msInterpolationMode(IHTMLStyle5* This,BSTR *p) {
    return This->lpVtbl->get_msInterpolationMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle5_put_maxHeight(IHTMLStyle5* This,VARIANT v) {
    return This->lpVtbl->put_maxHeight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle5_get_maxHeight(IHTMLStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_maxHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle5_put_minWidth(IHTMLStyle5* This,VARIANT v) {
    return This->lpVtbl->put_minWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle5_get_minWidth(IHTMLStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_minWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle5_put_maxWidth(IHTMLStyle5* This,VARIANT v) {
    return This->lpVtbl->put_maxWidth(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyle6_QueryInterface(IHTMLStyle6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyle6_AddRef(IHTMLStyle6* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyle6_Release(IHTMLStyle6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyle6_GetTypeInfoCount(IHTMLStyle6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_GetTypeInfo(IHTMLStyle6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyle6_put_content(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_content(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_content(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_content(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_captionSide(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_captionSide(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_captionSide(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_captionSide(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_counterIncrement(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_counterIncrement(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_counterIncrement(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_counterIncrement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_counterReset(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_counterReset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_counterReset(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_counterReset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_outline(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_outline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_outline(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_outline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_outlineWidth(IHTMLStyle6* This,VARIANT v) {
    return This->lpVtbl->put_outlineWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_outlineWidth(IHTMLStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_outlineWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_outlineStyle(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_outlineStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_outlineStyle(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_outlineStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_outlineColor(IHTMLStyle6* This,VARIANT v) {
    return This->lpVtbl->put_outlineColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_outlineColor(IHTMLStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_outlineColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_boxSizing(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_boxSizing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_boxSizing(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_boxSizing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_borderSpacing(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_borderSpacing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_borderSpacing(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_borderSpacing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_orphans(IHTMLStyle6* This,VARIANT v) {
    return This->lpVtbl->put_orphans(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_orphans(IHTMLStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_orphans(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_widows(IHTMLStyle6* This,VARIANT v) {
    return This->lpVtbl->put_widows(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_widows(IHTMLStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_widows(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_pageBreakInside(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_pageBreakInside(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_pageBreakInside(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakInside(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_emptyCells(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_emptyCells(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_emptyCells(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_emptyCells(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_msBlockProgression(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_msBlockProgression(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_get_msBlockProgression(IHTMLStyle6* This,BSTR *p) {
    return This->lpVtbl->get_msBlockProgression(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyle6_put_quotes(IHTMLStyle6* This,BSTR v) {
    return This->lpVtbl->put_quotes(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRuleStyle_QueryInterface(IHTMLRuleStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLRuleStyle_AddRef(IHTMLRuleStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLRuleStyle_Release(IHTMLRuleStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLRuleStyle_GetTypeInfoCount(IHTMLRuleStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_GetTypeInfo(IHTMLRuleStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRuleStyle_put_fontFamily(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_fontFamily(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_fontFamily(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontFamily(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_fontStyle(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_fontStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_fontStyle(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_fontVariant(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_fontVariant(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_fontVariant(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontVariant(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_fontWeight(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_fontWeight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_fontWeight(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontWeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_fontSize(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_fontSize(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_fontSize(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_fontSize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_font(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_font(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_font(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_font(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_color(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_color(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_color(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_color(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_background(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_background(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_background(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_background(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_backgroundColor(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_backgroundColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_backgroundColor(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_backgroundImage(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundImage(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_backgroundImage(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundImage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_backgroundRepeat(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundRepeat(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_backgroundRepeat(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundRepeat(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_backgroundAttachment(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundAttachment(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_backgroundAttachment(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundAttachment(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_backgroundPosition(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_backgroundPosition(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_backgroundPosition(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundPosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_backgroundPositionX(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_backgroundPositionX(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_backgroundPositionX(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_backgroundPositionY(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_backgroundPositionY(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_backgroundPositionY(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_wordSpacing(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_wordSpacing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_wordSpacing(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_wordSpacing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_letterSpacing(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_letterSpacing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_letterSpacing(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_letterSpacing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_textDecoration(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_textDecoration(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_textDecoration(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_textDecoration(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_textDecorationNone(IHTMLRuleStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationNone(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_textDecorationNone(IHTMLRuleStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationNone(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_textDecorationUnderline(IHTMLRuleStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationUnderline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_textDecorationUnderline(IHTMLRuleStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationUnderline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_textDecorationOverline(IHTMLRuleStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationOverline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_textDecorationOverline(IHTMLRuleStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationOverline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_textDecorationLineThrough(IHTMLRuleStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationLineThrough(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_textDecorationLineThrough(IHTMLRuleStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationLineThrough(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_textDecorationBlink(IHTMLRuleStyle* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_textDecorationBlink(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_textDecorationBlink(IHTMLRuleStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_textDecorationBlink(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_verticalAlign(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_verticalAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_verticalAlign(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_verticalAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_textTransform(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_textTransform(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_textTransform(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_textTransform(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_textAlign(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_textAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_textAlign(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_textAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_textIndent(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_textIndent(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_textIndent(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_textIndent(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_lineHeight(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_lineHeight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_lineHeight(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_lineHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_marginTop(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_marginTop(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_marginRight(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginRight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_marginRight(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_marginBottom(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginBottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_marginBottom(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_marginLeft(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_marginLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_marginLeft(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_margin(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_margin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_margin(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_margin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_paddingTop(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_paddingTop(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_paddingRight(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingRight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_paddingRight(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_paddingBottom(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingBottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_paddingBottom(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_paddingLeft(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_paddingLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_paddingLeft(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_padding(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_padding(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_padding(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_padding(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_border(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_border(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_border(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_border(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderTop(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderTop(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderRight(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderRight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderRight(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderBottom(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderBottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderBottom(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderLeft(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderLeft(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderColor(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderColor(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderTopColor(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderTopColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderTopColor(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderRightColor(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderRightColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderRightColor(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderBottomColor(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderBottomColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderBottomColor(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderLeftColor(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderLeftColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderLeftColor(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderWidth(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderWidth(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderTopWidth(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderTopWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderTopWidth(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderRightWidth(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderRightWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderRightWidth(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderBottomWidth(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderBottomWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderBottomWidth(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderLeftWidth(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_borderLeftWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderLeftWidth(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderStyle(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderStyle(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderTopStyle(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderTopStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderTopStyle(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderTopStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderRightStyle(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderRightStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderRightStyle(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderRightStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderBottomStyle(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderBottomStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderBottomStyle(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderBottomStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_borderLeftStyle(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_borderLeftStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_borderLeftStyle(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderLeftStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_width(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_width(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_height(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_height(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_styleFloat(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_styleFloat(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_styleFloat(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_styleFloat(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_clear(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_clear(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_clear(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_clear(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_display(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_display(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_display(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_display(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_visibility(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_visibility(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_visibility(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_visibility(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_listStyleType(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_listStyleType(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_listStyleType(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyleType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_listStylePosition(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_listStylePosition(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_listStylePosition(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStylePosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_listStyleImage(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_listStyleImage(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_listStyleImage(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyleImage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_listStyle(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_listStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_listStyle(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_whiteSpace(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_whiteSpace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_whiteSpace(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_whiteSpace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_top(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_top(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_top(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_top(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_left(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_left(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_left(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_left(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_position(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_position(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_zIndex(IHTMLRuleStyle* This,VARIANT v) {
    return This->lpVtbl->put_zIndex(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_zIndex(IHTMLRuleStyle* This,VARIANT *p) {
    return This->lpVtbl->get_zIndex(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_overflow(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_overflow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_overflow(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_overflow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_pageBreakBefore(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_pageBreakBefore(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_pageBreakBefore(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakBefore(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_pageBreakAfter(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_pageBreakAfter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_pageBreakAfter(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakAfter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_cssText(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_cssText(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_cssText(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_cssText(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_cursor(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_cursor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_cursor(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_cursor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_clip(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_clip(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_clip(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_clip(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_put_filter(IHTMLRuleStyle* This,BSTR v) {
    return This->lpVtbl->put_filter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_get_filter(IHTMLRuleStyle* This,BSTR *p) {
    return This->lpVtbl->get_filter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_setAttribute(IHTMLRuleStyle* This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags) {
    return This->lpVtbl->setAttribute(This,strAttributeName,AttributeValue,lFlags);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle_getAttribute(IHTMLRuleStyle* This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRuleStyle2_QueryInterface(IHTMLRuleStyle2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLRuleStyle2_AddRef(IHTMLRuleStyle2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLRuleStyle2_Release(IHTMLRuleStyle2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_GetTypeInfoCount(IHTMLRuleStyle2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_GetTypeInfo(IHTMLRuleStyle2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_tableLayout(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_tableLayout(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_tableLayout(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_tableLayout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_borderCollapse(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_borderCollapse(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_borderCollapse(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_borderCollapse(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_direction(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_direction(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_direction(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_direction(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_behavior(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_behavior(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_behavior(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_behavior(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_position(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_position(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_position(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_position(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_unicodeBidi(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_unicodeBidi(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_unicodeBidi(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_unicodeBidi(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_bottom(IHTMLRuleStyle2* This,VARIANT v) {
    return This->lpVtbl->put_bottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_bottom(IHTMLRuleStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_bottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_right(IHTMLRuleStyle2* This,VARIANT v) {
    return This->lpVtbl->put_right(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_right(IHTMLRuleStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_right(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_pixelBottom(IHTMLRuleStyle2* This,LONG v) {
    return This->lpVtbl->put_pixelBottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_pixelBottom(IHTMLRuleStyle2* This,LONG *p) {
    return This->lpVtbl->get_pixelBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_pixelRight(IHTMLRuleStyle2* This,LONG v) {
    return This->lpVtbl->put_pixelRight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_pixelRight(IHTMLRuleStyle2* This,LONG *p) {
    return This->lpVtbl->get_pixelRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_posBottom(IHTMLRuleStyle2* This,float v) {
    return This->lpVtbl->put_posBottom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_posBottom(IHTMLRuleStyle2* This,float *p) {
    return This->lpVtbl->get_posBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_posRight(IHTMLRuleStyle2* This,float v) {
    return This->lpVtbl->put_posRight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_posRight(IHTMLRuleStyle2* This,float *p) {
    return This->lpVtbl->get_posRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_imeMode(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_imeMode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_imeMode(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_imeMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_rubyAlign(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_rubyAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_rubyAlign(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_rubyAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_rubyPosition(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_rubyPosition(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_rubyPosition(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_rubyPosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_rubyOverhang(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_rubyOverhang(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_rubyOverhang(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_rubyOverhang(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_layoutGridChar(IHTMLRuleStyle2* This,VARIANT v) {
    return This->lpVtbl->put_layoutGridChar(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_layoutGridChar(IHTMLRuleStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridChar(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_layoutGridLine(IHTMLRuleStyle2* This,VARIANT v) {
    return This->lpVtbl->put_layoutGridLine(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_layoutGridLine(IHTMLRuleStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridLine(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_layoutGridMode(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_layoutGridMode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_layoutGridMode(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_layoutGridType(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_layoutGridType(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_layoutGridType(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_layoutGrid(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_layoutGrid(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_layoutGrid(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_layoutGrid(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_textAutospace(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_textAutospace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_textAutospace(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textAutospace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_wordBreak(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_wordBreak(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_wordBreak(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_wordBreak(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_lineBreak(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_lineBreak(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_lineBreak(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_lineBreak(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_textJustify(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_textJustify(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_textJustify(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textJustify(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_textJustifyTrim(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_textJustifyTrim(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_textJustifyTrim(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textJustifyTrim(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_textKashida(IHTMLRuleStyle2* This,VARIANT v) {
    return This->lpVtbl->put_textKashida(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_textKashida(IHTMLRuleStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_textKashida(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_overflowX(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_overflowX(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_overflowX(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_overflowX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_overflowY(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_overflowY(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_get_overflowY(IHTMLRuleStyle2* This,BSTR *p) {
    return This->lpVtbl->get_overflowY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle2_put_accelerator(IHTMLRuleStyle2* This,BSTR v) {
    return This->lpVtbl->put_accelerator(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRuleStyle3_QueryInterface(IHTMLRuleStyle3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLRuleStyle3_AddRef(IHTMLRuleStyle3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLRuleStyle3_Release(IHTMLRuleStyle3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_GetTypeInfoCount(IHTMLRuleStyle3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_GetTypeInfo(IHTMLRuleStyle3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_layoutFlow(IHTMLRuleStyle3* This,BSTR v) {
    return This->lpVtbl->put_layoutFlow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_get_layoutFlow(IHTMLRuleStyle3* This,BSTR *p) {
    return This->lpVtbl->get_layoutFlow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_zoom(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_zoom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_get_zoom(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_zoom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_wordWrap(IHTMLRuleStyle3* This,BSTR v) {
    return This->lpVtbl->put_wordWrap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_get_wordWrap(IHTMLRuleStyle3* This,BSTR *p) {
    return This->lpVtbl->get_wordWrap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_textUnderlinePosition(IHTMLRuleStyle3* This,BSTR v) {
    return This->lpVtbl->put_textUnderlinePosition(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_get_textUnderlinePosition(IHTMLRuleStyle3* This,BSTR *p) {
    return This->lpVtbl->get_textUnderlinePosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_scrollbarBaseColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarBaseColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_get_scrollbarBaseColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarBaseColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_scrollbarFaceColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarFaceColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_get_scrollbarFaceColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarFaceColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_scrollbar3dLightColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbar3dLightColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_get_scrollbar3dLightColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbar3dLightColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_scrollbarShadowColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarShadowColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_get_scrollbarShadowColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarShadowColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_scrollbarHighlightColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarHighlightColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_get_scrollbarHighlightColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarHighlightColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_scrollbarDarkShadowColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarDarkShadowColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_get_scrollbarDarkShadowColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarDarkShadowColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_scrollbarArrowColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarArrowColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_get_scrollbarArrowColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarArrowColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_scrollbarTrackColor(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_scrollbarTrackColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_get_scrollbarTrackColor(IHTMLRuleStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarTrackColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_writingMode(IHTMLRuleStyle3* This,BSTR v) {
    return This->lpVtbl->put_writingMode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_get_writingMode(IHTMLRuleStyle3* This,BSTR *p) {
    return This->lpVtbl->get_writingMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_textAlignLast(IHTMLRuleStyle3* This,BSTR v) {
    return This->lpVtbl->put_textAlignLast(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_get_textAlignLast(IHTMLRuleStyle3* This,BSTR *p) {
    return This->lpVtbl->get_textAlignLast(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle3_put_textKashidaSpace(IHTMLRuleStyle3* This,VARIANT v) {
    return This->lpVtbl->put_textKashidaSpace(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRuleStyle4_QueryInterface(IHTMLRuleStyle4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLRuleStyle4_AddRef(IHTMLRuleStyle4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLRuleStyle4_Release(IHTMLRuleStyle4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLRuleStyle4_GetTypeInfoCount(IHTMLRuleStyle4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle4_GetTypeInfo(IHTMLRuleStyle4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRuleStyle4_put_textOverflow(IHTMLRuleStyle4* This,BSTR v) {
    return This->lpVtbl->put_textOverflow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle4_get_textOverflow(IHTMLRuleStyle4* This,BSTR *p) {
    return This->lpVtbl->get_textOverflow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle4_put_minHeight(IHTMLRuleStyle4* This,VARIANT v) {
    return This->lpVtbl->put_minHeight(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRuleStyle5_QueryInterface(IHTMLRuleStyle5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLRuleStyle5_AddRef(IHTMLRuleStyle5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLRuleStyle5_Release(IHTMLRuleStyle5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLRuleStyle5_GetTypeInfoCount(IHTMLRuleStyle5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle5_GetTypeInfo(IHTMLRuleStyle5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRuleStyle5_put_msInterpolationMode(IHTMLRuleStyle5* This,BSTR v) {
    return This->lpVtbl->put_msInterpolationMode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle5_get_msInterpolationMode(IHTMLRuleStyle5* This,BSTR *p) {
    return This->lpVtbl->get_msInterpolationMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle5_put_maxHeight(IHTMLRuleStyle5* This,VARIANT v) {
    return This->lpVtbl->put_maxHeight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle5_get_maxHeight(IHTMLRuleStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_maxHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle5_put_minWidth(IHTMLRuleStyle5* This,VARIANT v) {
    return This->lpVtbl->put_minWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle5_get_minWidth(IHTMLRuleStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_minWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle5_put_maxWidth(IHTMLRuleStyle5* This,VARIANT v) {
    return This->lpVtbl->put_maxWidth(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRuleStyle6_QueryInterface(IHTMLRuleStyle6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLRuleStyle6_AddRef(IHTMLRuleStyle6* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLRuleStyle6_Release(IHTMLRuleStyle6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_GetTypeInfoCount(IHTMLRuleStyle6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_GetTypeInfo(IHTMLRuleStyle6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_content(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_content(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_content(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_content(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_captionSide(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_captionSide(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_captionSide(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_captionSide(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_counterIncrement(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_counterIncrement(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_counterIncrement(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_counterIncrement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_counterReset(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_counterReset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_counterReset(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_counterReset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_outline(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_outline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_outline(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_outline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_outlineWidth(IHTMLRuleStyle6* This,VARIANT v) {
    return This->lpVtbl->put_outlineWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_outlineWidth(IHTMLRuleStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_outlineWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_outlineStyle(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_outlineStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_outlineStyle(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_outlineStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_outlineColor(IHTMLRuleStyle6* This,VARIANT v) {
    return This->lpVtbl->put_outlineColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_outlineColor(IHTMLRuleStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_outlineColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_boxSizing(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_boxSizing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_boxSizing(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_boxSizing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_borderSpacing(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_borderSpacing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_borderSpacing(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_borderSpacing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_orphans(IHTMLRuleStyle6* This,VARIANT v) {
    return This->lpVtbl->put_orphans(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_orphans(IHTMLRuleStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_orphans(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_widows(IHTMLRuleStyle6* This,VARIANT v) {
    return This->lpVtbl->put_widows(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_widows(IHTMLRuleStyle6* This,VARIANT *p) {
    return This->lpVtbl->get_widows(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_pageBreakInside(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_pageBreakInside(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_pageBreakInside(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakInside(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_emptyCells(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_emptyCells(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_emptyCells(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_emptyCells(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_msBlockProgression(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_msBlockProgression(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_get_msBlockProgression(IHTMLRuleStyle6* This,BSTR *p) {
    return This->lpVtbl->get_msBlockProgression(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRuleStyle6_put_quotes(IHTMLRuleStyle6* This,BSTR v) {
    return This->lpVtbl->put_quotes(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLStyle_QueryInterface(DispHTMLStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLStyle_AddRef(DispHTMLStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLStyle_Release(DispHTMLStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLStyle_GetTypeInfoCount(DispHTMLStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLStyle_GetTypeInfo(DispHTMLStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLRuleStyle_QueryInterface(DispHTMLRuleStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLRuleStyle_AddRef(DispHTMLRuleStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLRuleStyle_Release(DispHTMLRuleStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLRuleStyle_GetTypeInfoCount(DispHTMLRuleStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLRuleStyle_GetTypeInfo(DispHTMLRuleStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCSSRule_QueryInterface(IHTMLCSSRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCSSRule_AddRef(IHTMLCSSRule* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCSSRule_Release(IHTMLCSSRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCSSRule_GetTypeInfoCount(IHTMLCSSRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCSSRule_GetTypeInfo(IHTMLCSSRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCSSRule_get_type(IHTMLCSSRule* This,USHORT *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSRule_put_cssText(IHTMLCSSRule* This,BSTR v) {
    return This->lpVtbl->put_cssText(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSRule_get_cssText(IHTMLCSSRule* This,BSTR *p) {
    return This->lpVtbl->get_cssText(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSRule_get_parentRule(IHTMLCSSRule* This,IHTMLCSSRule **p) {
    return This->lpVtbl->get_parentRule(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCSSImportRule_QueryInterface(IHTMLCSSImportRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCSSImportRule_AddRef(IHTMLCSSImportRule* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCSSImportRule_Release(IHTMLCSSImportRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCSSImportRule_GetTypeInfoCount(IHTMLCSSImportRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCSSImportRule_GetTypeInfo(IHTMLCSSImportRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCSSImportRule_get_href(IHTMLCSSImportRule* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSImportRule_put_media(IHTMLCSSImportRule* This,VARIANT v) {
    return This->lpVtbl->put_media(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSImportRule_get_media(IHTMLCSSImportRule* This,VARIANT *p) {
    return This->lpVtbl->get_media(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCSSMediaRule_QueryInterface(IHTMLCSSMediaRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCSSMediaRule_AddRef(IHTMLCSSMediaRule* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCSSMediaRule_Release(IHTMLCSSMediaRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCSSMediaRule_GetTypeInfoCount(IHTMLCSSMediaRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCSSMediaRule_GetTypeInfo(IHTMLCSSMediaRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCSSMediaRule_put_media(IHTMLCSSMediaRule* This,VARIANT v) {
    return This->lpVtbl->put_media(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSMediaRule_get_media(IHTMLCSSMediaRule* This,VARIANT *p) {
    return This->lpVtbl->get_media(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSMediaRule_get_cssRules(IHTMLCSSMediaRule* This,IHTMLStyleSheetRulesCollection **p) {
    return This->lpVtbl->get_cssRules(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSMediaRule_insertRule(IHTMLCSSMediaRule* This,BSTR bstrRule,LONG lIndex,LONG *plNewIndex) {
    return This->lpVtbl->insertRule(This,bstrRule,lIndex,plNewIndex);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCSSMediaList_QueryInterface(IHTMLCSSMediaList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCSSMediaList_AddRef(IHTMLCSSMediaList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCSSMediaList_Release(IHTMLCSSMediaList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCSSMediaList_GetTypeInfoCount(IHTMLCSSMediaList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCSSMediaList_GetTypeInfo(IHTMLCSSMediaList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCSSMediaList_put_mediaText(IHTMLCSSMediaList* This,BSTR v) {
    return This->lpVtbl->put_mediaText(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCSSMediaList_get_mediaText(IHTMLCSSMediaList* This,BSTR *p) {
    return This->lpVtbl->get_mediaText(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSMediaList_get_length(IHTMLCSSMediaList* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCSSMediaList_item(IHTMLCSSMediaList* This,LONG index,BSTR *pbstrMedium) {
    return This->lpVtbl->item(This,index,pbstrMedium);
}
static __WIDL_INLINE HRESULT IHTMLCSSMediaList_appendMedium(IHTMLCSSMediaList* This,BSTR bstrMedium) {
    return This->lpVtbl->appendMedium(This,bstrMedium);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCSSNamespaceRule_QueryInterface(IHTMLCSSNamespaceRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCSSNamespaceRule_AddRef(IHTMLCSSNamespaceRule* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCSSNamespaceRule_Release(IHTMLCSSNamespaceRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCSSNamespaceRule_GetTypeInfoCount(IHTMLCSSNamespaceRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCSSNamespaceRule_GetTypeInfo(IHTMLCSSNamespaceRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCSSNamespaceRule_get_namespaceURI(IHTMLCSSNamespaceRule* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMSCSSKeyframeRule_QueryInterface(IHTMLMSCSSKeyframeRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLMSCSSKeyframeRule_AddRef(IHTMLMSCSSKeyframeRule* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLMSCSSKeyframeRule_Release(IHTMLMSCSSKeyframeRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLMSCSSKeyframeRule_GetTypeInfoCount(IHTMLMSCSSKeyframeRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLMSCSSKeyframeRule_GetTypeInfo(IHTMLMSCSSKeyframeRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMSCSSKeyframeRule_put_keyText(IHTMLMSCSSKeyframeRule* This,BSTR v) {
    return This->lpVtbl->put_keyText(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMSCSSKeyframeRule_get_keyText(IHTMLMSCSSKeyframeRule* This,BSTR *p) {
    return This->lpVtbl->get_keyText(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMSCSSKeyframesRule_QueryInterface(IHTMLMSCSSKeyframesRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLMSCSSKeyframesRule_AddRef(IHTMLMSCSSKeyframesRule* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLMSCSSKeyframesRule_Release(IHTMLMSCSSKeyframesRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLMSCSSKeyframesRule_GetTypeInfoCount(IHTMLMSCSSKeyframesRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLMSCSSKeyframesRule_GetTypeInfo(IHTMLMSCSSKeyframesRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMSCSSKeyframesRule_put_name(IHTMLMSCSSKeyframesRule* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMSCSSKeyframesRule_get_name(IHTMLMSCSSKeyframesRule* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMSCSSKeyframesRule_get_cssRules(IHTMLMSCSSKeyframesRule* This,IHTMLStyleSheetRulesCollection **p) {
    return This->lpVtbl->get_cssRules(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMSCSSKeyframesRule_appendRule(IHTMLMSCSSKeyframesRule* This,BSTR bstrRule) {
    return This->lpVtbl->appendRule(This,bstrRule);
}
static __WIDL_INLINE HRESULT IHTMLMSCSSKeyframesRule_deleteRule(IHTMLMSCSSKeyframesRule* This,BSTR bstrKey) {
    return This->lpVtbl->deleteRule(This,bstrKey);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLCSSRule_QueryInterface(DispHTMLCSSRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLCSSRule_AddRef(DispHTMLCSSRule* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLCSSRule_Release(DispHTMLCSSRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLCSSRule_GetTypeInfoCount(DispHTMLCSSRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLCSSRule_GetTypeInfo(DispHTMLCSSRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLCSSImportRule_QueryInterface(DispHTMLCSSImportRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLCSSImportRule_AddRef(DispHTMLCSSImportRule* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLCSSImportRule_Release(DispHTMLCSSImportRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLCSSImportRule_GetTypeInfoCount(DispHTMLCSSImportRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLCSSImportRule_GetTypeInfo(DispHTMLCSSImportRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLCSSMediaRule_QueryInterface(DispHTMLCSSMediaRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLCSSMediaRule_AddRef(DispHTMLCSSMediaRule* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLCSSMediaRule_Release(DispHTMLCSSMediaRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLCSSMediaRule_GetTypeInfoCount(DispHTMLCSSMediaRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLCSSMediaRule_GetTypeInfo(DispHTMLCSSMediaRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLCSSMediaList_QueryInterface(DispHTMLCSSMediaList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLCSSMediaList_AddRef(DispHTMLCSSMediaList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLCSSMediaList_Release(DispHTMLCSSMediaList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLCSSMediaList_GetTypeInfoCount(DispHTMLCSSMediaList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLCSSMediaList_GetTypeInfo(DispHTMLCSSMediaList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLCSSNamespaceRule_QueryInterface(DispHTMLCSSNamespaceRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLCSSNamespaceRule_AddRef(DispHTMLCSSNamespaceRule* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLCSSNamespaceRule_Release(DispHTMLCSSNamespaceRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLCSSNamespaceRule_GetTypeInfoCount(DispHTMLCSSNamespaceRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLCSSNamespaceRule_GetTypeInfo(DispHTMLCSSNamespaceRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLMSCSSKeyframeRule_QueryInterface(DispHTMLMSCSSKeyframeRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLMSCSSKeyframeRule_AddRef(DispHTMLMSCSSKeyframeRule* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLMSCSSKeyframeRule_Release(DispHTMLMSCSSKeyframeRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLMSCSSKeyframeRule_GetTypeInfoCount(DispHTMLMSCSSKeyframeRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLMSCSSKeyframeRule_GetTypeInfo(DispHTMLMSCSSKeyframeRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLMSCSSKeyframesRule_QueryInterface(DispHTMLMSCSSKeyframesRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLMSCSSKeyframesRule_AddRef(DispHTMLMSCSSKeyframesRule* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLMSCSSKeyframesRule_Release(DispHTMLMSCSSKeyframesRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLMSCSSKeyframesRule_GetTypeInfoCount(DispHTMLMSCSSKeyframesRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLMSCSSKeyframesRule_GetTypeInfo(DispHTMLMSCSSKeyframesRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRenderStyle_QueryInterface(IHTMLRenderStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLRenderStyle_AddRef(IHTMLRenderStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLRenderStyle_Release(IHTMLRenderStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLRenderStyle_GetTypeInfoCount(IHTMLRenderStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_GetTypeInfo(IHTMLRenderStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRenderStyle_put_textLineThroughStyle(IHTMLRenderStyle* This,BSTR v) {
    return This->lpVtbl->put_textLineThroughStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_get_textLineThroughStyle(IHTMLRenderStyle* This,BSTR *p) {
    return This->lpVtbl->get_textLineThroughStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_put_textUnderlineStyle(IHTMLRenderStyle* This,BSTR v) {
    return This->lpVtbl->put_textUnderlineStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_get_textUnderlineStyle(IHTMLRenderStyle* This,BSTR *p) {
    return This->lpVtbl->get_textUnderlineStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_put_textEffect(IHTMLRenderStyle* This,BSTR v) {
    return This->lpVtbl->put_textEffect(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_get_textEffect(IHTMLRenderStyle* This,BSTR *p) {
    return This->lpVtbl->get_textEffect(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_put_textColor(IHTMLRenderStyle* This,VARIANT v) {
    return This->lpVtbl->put_textColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_get_textColor(IHTMLRenderStyle* This,VARIANT *p) {
    return This->lpVtbl->get_textColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_put_textBackgroundColor(IHTMLRenderStyle* This,VARIANT v) {
    return This->lpVtbl->put_textBackgroundColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_get_textBackgroundColor(IHTMLRenderStyle* This,VARIANT *p) {
    return This->lpVtbl->get_textBackgroundColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_put_textDecorationColor(IHTMLRenderStyle* This,VARIANT v) {
    return This->lpVtbl->put_textDecorationColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_get_textDecorationColor(IHTMLRenderStyle* This,VARIANT *p) {
    return This->lpVtbl->get_textDecorationColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_put_renderingPriority(IHTMLRenderStyle* This,LONG v) {
    return This->lpVtbl->put_renderingPriority(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_get_renderingPriority(IHTMLRenderStyle* This,LONG *p) {
    return This->lpVtbl->get_renderingPriority(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_put_defaultTextSelection(IHTMLRenderStyle* This,BSTR v) {
    return This->lpVtbl->put_defaultTextSelection(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_get_defaultTextSelection(IHTMLRenderStyle* This,BSTR *p) {
    return This->lpVtbl->get_defaultTextSelection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRenderStyle_put_textDecoration(IHTMLRenderStyle* This,BSTR v) {
    return This->lpVtbl->put_textDecoration(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLRenderStyle_QueryInterface(DispHTMLRenderStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLRenderStyle_AddRef(DispHTMLRenderStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLRenderStyle_Release(DispHTMLRenderStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLRenderStyle_GetTypeInfoCount(DispHTMLRenderStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLRenderStyle_GetTypeInfo(DispHTMLRenderStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCurrentStyle_QueryInterface(IHTMLCurrentStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCurrentStyle_AddRef(IHTMLCurrentStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCurrentStyle_Release(IHTMLCurrentStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_GetTypeInfoCount(IHTMLCurrentStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_GetTypeInfo(IHTMLCurrentStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_position(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_position(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_styleFloat(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_styleFloat(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_color(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_color(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_backgroundColor(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_fontFamily(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontFamily(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_fontStyle(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_fontVariant(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_fontVariant(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_fontWeight(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_fontWeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_fontSize(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_fontSize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_backgroundImage(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundImage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_backgroundPositionX(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_backgroundPositionY(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_backgroundPositionY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_backgroundRepeat(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundRepeat(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderLeftColor(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderTopColor(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderRightColor(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderBottomColor(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderTopStyle(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderTopStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderRightStyle(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderRightStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderBottomStyle(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderBottomStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderLeftStyle(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderLeftStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderTopWidth(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderTopWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderRightWidth(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderRightWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderBottomWidth(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderBottomWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderLeftWidth(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_borderLeftWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_left(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_left(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_top(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_top(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_width(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_height(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_paddingLeft(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_paddingTop(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_paddingRight(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_paddingBottom(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_paddingBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_textAlign(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_textAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_textDecoration(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_textDecoration(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_display(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_display(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_visibility(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_visibility(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_zIndex(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_zIndex(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_letterSpacing(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_letterSpacing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_lineHeight(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_lineHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_textIndent(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_textIndent(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_verticalAlign(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_verticalAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_backgroundAttachment(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_backgroundAttachment(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_marginTop(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_marginRight(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_marginBottom(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_marginLeft(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_marginLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_clear(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_clear(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_listStyleType(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyleType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_listStylePosition(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStylePosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_listStyleImage(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_listStyleImage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_clipTop(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_clipTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_clipRight(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_clipRight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_clipBottom(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_clipBottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_clipLeft(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_clipLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_overflow(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_overflow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_pageBreakBefore(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakBefore(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_pageBreakAfter(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakAfter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_cursor(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_cursor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_tableLayout(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_tableLayout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderCollapse(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderCollapse(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_direction(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_direction(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_behavior(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_behavior(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_getAttribute(IHTMLCurrentStyle* This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_unicodeBidi(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_unicodeBidi(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_right(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_right(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_bottom(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_bottom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_imeMode(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_imeMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_rubyAlign(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_rubyAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_rubyPosition(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_rubyPosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_rubyOverhang(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_rubyOverhang(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_textAutospace(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_textAutospace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_lineBreak(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_lineBreak(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_wordBreak(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_wordBreak(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_textJustify(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_textJustify(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_textJustifyTrim(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_textJustifyTrim(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_textKashida(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_textKashida(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_blockDirection(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_blockDirection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_layoutGridChar(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridChar(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_layoutGridLine(IHTMLCurrentStyle* This,VARIANT *p) {
    return This->lpVtbl->get_layoutGridLine(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_layoutGridMode(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_layoutGridType(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_layoutGridType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderStyle(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderColor(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_borderWidth(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_borderWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_padding(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_padding(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_margin(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_margin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_accelerator(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_accelerator(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_overflowX(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_overflowX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle_get_overflowY(IHTMLCurrentStyle* This,BSTR *p) {
    return This->lpVtbl->get_overflowY(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCurrentStyle2_QueryInterface(IHTMLCurrentStyle2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCurrentStyle2_AddRef(IHTMLCurrentStyle2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCurrentStyle2_Release(IHTMLCurrentStyle2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_GetTypeInfoCount(IHTMLCurrentStyle2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_GetTypeInfo(IHTMLCurrentStyle2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_layoutFlow(IHTMLCurrentStyle2* This,BSTR *p) {
    return This->lpVtbl->get_layoutFlow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_wordWrap(IHTMLCurrentStyle2* This,BSTR *p) {
    return This->lpVtbl->get_wordWrap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_textUnderlinePosition(IHTMLCurrentStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textUnderlinePosition(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_hasLayout(IHTMLCurrentStyle2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_hasLayout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_scrollbarBaseColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarBaseColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_scrollbarFaceColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarFaceColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_scrollbar3dLightColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbar3dLightColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_scrollbarShadowColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarShadowColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_scrollbarHighlightColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarHighlightColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_scrollbarDarkShadowColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarDarkShadowColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_scrollbarArrowColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarArrowColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_scrollbarTrackColor(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_scrollbarTrackColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_writingMode(IHTMLCurrentStyle2* This,BSTR *p) {
    return This->lpVtbl->get_writingMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_zoom(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_zoom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_filter(IHTMLCurrentStyle2* This,BSTR *p) {
    return This->lpVtbl->get_filter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_textAlignLast(IHTMLCurrentStyle2* This,BSTR *p) {
    return This->lpVtbl->get_textAlignLast(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle2_get_textKashidaSpace(IHTMLCurrentStyle2* This,VARIANT *p) {
    return This->lpVtbl->get_textKashidaSpace(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCurrentStyle3_QueryInterface(IHTMLCurrentStyle3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCurrentStyle3_AddRef(IHTMLCurrentStyle3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCurrentStyle3_Release(IHTMLCurrentStyle3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCurrentStyle3_GetTypeInfoCount(IHTMLCurrentStyle3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle3_GetTypeInfo(IHTMLCurrentStyle3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCurrentStyle3_get_textOverflow(IHTMLCurrentStyle3* This,BSTR *p) {
    return This->lpVtbl->get_textOverflow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle3_get_minHeight(IHTMLCurrentStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_minHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle3_get_wordSpacing(IHTMLCurrentStyle3* This,VARIANT *p) {
    return This->lpVtbl->get_wordSpacing(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCurrentStyle4_QueryInterface(IHTMLCurrentStyle4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCurrentStyle4_AddRef(IHTMLCurrentStyle4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCurrentStyle4_Release(IHTMLCurrentStyle4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCurrentStyle4_GetTypeInfoCount(IHTMLCurrentStyle4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle4_GetTypeInfo(IHTMLCurrentStyle4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCurrentStyle4_get_msInterpolationMode(IHTMLCurrentStyle4* This,BSTR *p) {
    return This->lpVtbl->get_msInterpolationMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle4_get_maxHeight(IHTMLCurrentStyle4* This,VARIANT *p) {
    return This->lpVtbl->get_maxHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle4_get_minWidth(IHTMLCurrentStyle4* This,VARIANT *p) {
    return This->lpVtbl->get_minWidth(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCurrentStyle5_QueryInterface(IHTMLCurrentStyle5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCurrentStyle5_AddRef(IHTMLCurrentStyle5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCurrentStyle5_Release(IHTMLCurrentStyle5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCurrentStyle5_GetTypeInfoCount(IHTMLCurrentStyle5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle5_GetTypeInfo(IHTMLCurrentStyle5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCurrentStyle5_get_captionSide(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_captionSide(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle5_get_outline(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_outline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle5_get_outlineWidth(IHTMLCurrentStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_outlineWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle5_get_outlineStyle(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_outlineStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle5_get_outlineColor(IHTMLCurrentStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_outlineColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle5_get_boxSizing(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_boxSizing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle5_get_borderSpacing(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_borderSpacing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle5_get_orphans(IHTMLCurrentStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_orphans(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle5_get_widows(IHTMLCurrentStyle5* This,VARIANT *p) {
    return This->lpVtbl->get_widows(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle5_get_pageBreakInside(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_pageBreakInside(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle5_get_emptyCells(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_emptyCells(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCurrentStyle5_get_msBlockProgression(IHTMLCurrentStyle5* This,BSTR *p) {
    return This->lpVtbl->get_msBlockProgression(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLCurrentStyle_QueryInterface(DispHTMLCurrentStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLCurrentStyle_AddRef(DispHTMLCurrentStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLCurrentStyle_Release(DispHTMLCurrentStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLCurrentStyle_GetTypeInfoCount(DispHTMLCurrentStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLCurrentStyle_GetTypeInfo(DispHTMLCurrentStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRect_QueryInterface(IHTMLRect* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLRect_AddRef(IHTMLRect* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLRect_Release(IHTMLRect* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLRect_GetTypeInfoCount(IHTMLRect* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLRect_GetTypeInfo(IHTMLRect* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRect_put_left(IHTMLRect* This,LONG v) {
    return This->lpVtbl->put_left(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRect_get_left(IHTMLRect* This,LONG *p) {
    return This->lpVtbl->get_left(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRect_put_top(IHTMLRect* This,LONG v) {
    return This->lpVtbl->put_top(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRect_get_top(IHTMLRect* This,LONG *p) {
    return This->lpVtbl->get_top(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRect_put_right(IHTMLRect* This,LONG v) {
    return This->lpVtbl->put_right(This,v);
}
static __WIDL_INLINE HRESULT IHTMLRect_get_right(IHTMLRect* This,LONG *p) {
    return This->lpVtbl->get_right(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRect_put_bottom(IHTMLRect* This,LONG v) {
    return This->lpVtbl->put_bottom(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRect2_QueryInterface(IHTMLRect2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLRect2_AddRef(IHTMLRect2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLRect2_Release(IHTMLRect2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLRect2_GetTypeInfoCount(IHTMLRect2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLRect2_GetTypeInfo(IHTMLRect2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRect2_get_width(IHTMLRect2* This,float *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRectCollection_QueryInterface(IHTMLRectCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLRectCollection_AddRef(IHTMLRectCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLRectCollection_Release(IHTMLRectCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLRectCollection_GetTypeInfoCount(IHTMLRectCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLRectCollection_GetTypeInfo(IHTMLRectCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLRectCollection_get_length(IHTMLRectCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLRectCollection_get__newEnum(IHTMLRectCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMNode_QueryInterface(IHTMLDOMNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMNode_AddRef(IHTMLDOMNode* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMNode_Release(IHTMLDOMNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMNode_GetTypeInfoCount(IHTMLDOMNode* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_GetTypeInfo(IHTMLDOMNode* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMNode_get_nodeType(IHTMLDOMNode* This,LONG *p) {
    return This->lpVtbl->get_nodeType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_get_parentNode(IHTMLDOMNode* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_parentNode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_hasChildNodes(IHTMLDOMNode* This,VARIANT_BOOL *fChildren) {
    return This->lpVtbl->hasChildNodes(This,fChildren);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_get_childNodes(IHTMLDOMNode* This,IDispatch **p) {
    return This->lpVtbl->get_childNodes(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_get_attributes(IHTMLDOMNode* This,IDispatch **p) {
    return This->lpVtbl->get_attributes(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_insertBefore(IHTMLDOMNode* This,IHTMLDOMNode *newChild,VARIANT refChild,IHTMLDOMNode **node) {
    return This->lpVtbl->insertBefore(This,newChild,refChild,node);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_removeChild(IHTMLDOMNode* This,IHTMLDOMNode *oldChild,IHTMLDOMNode **node) {
    return This->lpVtbl->removeChild(This,oldChild,node);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_replaceChild(IHTMLDOMNode* This,IHTMLDOMNode *newChild,IHTMLDOMNode *oldChild,IHTMLDOMNode **node) {
    return This->lpVtbl->replaceChild(This,newChild,oldChild,node);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_cloneNode(IHTMLDOMNode* This,VARIANT_BOOL fDeep,IHTMLDOMNode **clonedNode) {
    return This->lpVtbl->cloneNode(This,fDeep,clonedNode);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_removeNode(IHTMLDOMNode* This,VARIANT_BOOL fDeep,IHTMLDOMNode **removed) {
    return This->lpVtbl->removeNode(This,fDeep,removed);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_swapNode(IHTMLDOMNode* This,IHTMLDOMNode *otherNode,IHTMLDOMNode **swappedNode) {
    return This->lpVtbl->swapNode(This,otherNode,swappedNode);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_replaceNode(IHTMLDOMNode* This,IHTMLDOMNode *replacement,IHTMLDOMNode **replaced) {
    return This->lpVtbl->replaceNode(This,replacement,replaced);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_appendChild(IHTMLDOMNode* This,IHTMLDOMNode *newChild,IHTMLDOMNode **node) {
    return This->lpVtbl->appendChild(This,newChild,node);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_get_nodeName(IHTMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_put_nodeValue(IHTMLDOMNode* This,VARIANT v) {
    return This->lpVtbl->put_nodeValue(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_get_nodeValue(IHTMLDOMNode* This,VARIANT *p) {
    return This->lpVtbl->get_nodeValue(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_get_firstChild(IHTMLDOMNode* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_firstChild(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_get_lastChild(IHTMLDOMNode* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_lastChild(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode_get_previousSibling(IHTMLDOMNode* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_previousSibling(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMNode2_QueryInterface(IHTMLDOMNode2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMNode2_AddRef(IHTMLDOMNode2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMNode2_Release(IHTMLDOMNode2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMNode2_GetTypeInfoCount(IHTMLDOMNode2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode2_GetTypeInfo(IHTMLDOMNode2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMNode3_QueryInterface(IHTMLDOMNode3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMNode3_AddRef(IHTMLDOMNode3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMNode3_Release(IHTMLDOMNode3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMNode3_GetTypeInfoCount(IHTMLDOMNode3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_GetTypeInfo(IHTMLDOMNode3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMNode3_put_prefix(IHTMLDOMNode3* This,VARIANT v) {
    return This->lpVtbl->put_prefix(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_get_prefix(IHTMLDOMNode3* This,VARIANT *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_get_localName(IHTMLDOMNode3* This,VARIANT *p) {
    return This->lpVtbl->get_localName(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_get_namespaceURI(IHTMLDOMNode3* This,VARIANT *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_put_textContent(IHTMLDOMNode3* This,VARIANT v) {
    return This->lpVtbl->put_textContent(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_get_textContent(IHTMLDOMNode3* This,VARIANT *p) {
    return This->lpVtbl->get_textContent(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_isEqualNode(IHTMLDOMNode3* This,IHTMLDOMNode3 *otherNode,VARIANT_BOOL *isEqual) {
    return This->lpVtbl->isEqualNode(This,otherNode,isEqual);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_lookupNamespaceURI(IHTMLDOMNode3* This,VARIANT *pvarPrefix,VARIANT *pvarNamespaceURI) {
    return This->lpVtbl->lookupNamespaceURI(This,pvarPrefix,pvarNamespaceURI);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_lookupPrefix(IHTMLDOMNode3* This,VARIANT *pvarNamespaceURI,VARIANT *pvarPrefix) {
    return This->lpVtbl->lookupPrefix(This,pvarNamespaceURI,pvarPrefix);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_isDefaultNamespace(IHTMLDOMNode3* This,VARIANT *pvarNamespace,VARIANT_BOOL *pfDefaultNamespace) {
    return This->lpVtbl->isDefaultNamespace(This,pvarNamespace,pfDefaultNamespace);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_appendChild(IHTMLDOMNode3* This,IHTMLDOMNode *newChild,IHTMLDOMNode **node) {
    return This->lpVtbl->appendChild(This,newChild,node);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_insertBefore(IHTMLDOMNode3* This,IHTMLDOMNode *newChild,VARIANT refChild,IHTMLDOMNode **node) {
    return This->lpVtbl->insertBefore(This,newChild,refChild,node);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_removeChild(IHTMLDOMNode3* This,IHTMLDOMNode *oldChild,IHTMLDOMNode **node) {
    return This->lpVtbl->removeChild(This,oldChild,node);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_replaceChild(IHTMLDOMNode3* This,IHTMLDOMNode *newChild,IHTMLDOMNode *oldChild,IHTMLDOMNode **node) {
    return This->lpVtbl->replaceChild(This,newChild,oldChild,node);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_isSameNode(IHTMLDOMNode3* This,IHTMLDOMNode3 *otherNode,VARIANT_BOOL *isSame) {
    return This->lpVtbl->isSameNode(This,otherNode,isSame);
}
static __WIDL_INLINE HRESULT IHTMLDOMNode3_compareDocumentPosition(IHTMLDOMNode3* This,IHTMLDOMNode *otherNode,USHORT *flags) {
    return This->lpVtbl->compareDocumentPosition(This,otherNode,flags);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMAttribute_QueryInterface(IHTMLDOMAttribute* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMAttribute_AddRef(IHTMLDOMAttribute* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMAttribute_Release(IHTMLDOMAttribute* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMAttribute_GetTypeInfoCount(IHTMLDOMAttribute* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute_GetTypeInfo(IHTMLDOMAttribute* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMAttribute_get_nodeName(IHTMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute_put_nodeValue(IHTMLDOMAttribute* This,VARIANT v) {
    return This->lpVtbl->put_nodeValue(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute_get_nodeValue(IHTMLDOMAttribute* This,VARIANT *p) {
    return This->lpVtbl->get_nodeValue(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMAttribute2_QueryInterface(IHTMLDOMAttribute2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMAttribute2_AddRef(IHTMLDOMAttribute2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMAttribute2_Release(IHTMLDOMAttribute2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_GetTypeInfoCount(IHTMLDOMAttribute2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_GetTypeInfo(IHTMLDOMAttribute2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMAttribute2_get_name(IHTMLDOMAttribute2* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_put_value(IHTMLDOMAttribute2* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_get_value(IHTMLDOMAttribute2* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_get_expando(IHTMLDOMAttribute2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_expando(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_get_nodeType(IHTMLDOMAttribute2* This,LONG *p) {
    return This->lpVtbl->get_nodeType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_get_parentNode(IHTMLDOMAttribute2* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_parentNode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_get_childNodes(IHTMLDOMAttribute2* This,IDispatch **p) {
    return This->lpVtbl->get_childNodes(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_get_firstChild(IHTMLDOMAttribute2* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_firstChild(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_get_lastChild(IHTMLDOMAttribute2* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_lastChild(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_get_previousSibling(IHTMLDOMAttribute2* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_previousSibling(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_get_nextSibling(IHTMLDOMAttribute2* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_nextSibling(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_get_attributes(IHTMLDOMAttribute2* This,IDispatch **p) {
    return This->lpVtbl->get_attributes(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_get_ownerDocument(IHTMLDOMAttribute2* This,IDispatch **p) {
    return This->lpVtbl->get_ownerDocument(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_insertBefore(IHTMLDOMAttribute2* This,IHTMLDOMNode *newChild,VARIANT refChild,IHTMLDOMNode **node) {
    return This->lpVtbl->insertBefore(This,newChild,refChild,node);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_replaceChild(IHTMLDOMAttribute2* This,IHTMLDOMNode *newChild,IHTMLDOMNode *oldChild,IHTMLDOMNode **node) {
    return This->lpVtbl->replaceChild(This,newChild,oldChild,node);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_removeChild(IHTMLDOMAttribute2* This,IHTMLDOMNode *oldChild,IHTMLDOMNode **node) {
    return This->lpVtbl->removeChild(This,oldChild,node);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_appendChild(IHTMLDOMAttribute2* This,IHTMLDOMNode *newChild,IHTMLDOMNode **node) {
    return This->lpVtbl->appendChild(This,newChild,node);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute2_hasChildNodes(IHTMLDOMAttribute2* This,VARIANT_BOOL *fChildren) {
    return This->lpVtbl->hasChildNodes(This,fChildren);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMAttribute3_QueryInterface(IHTMLDOMAttribute3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMAttribute3_AddRef(IHTMLDOMAttribute3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMAttribute3_Release(IHTMLDOMAttribute3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMAttribute3_GetTypeInfoCount(IHTMLDOMAttribute3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute3_GetTypeInfo(IHTMLDOMAttribute3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMAttribute3_put_nodeValue(IHTMLDOMAttribute3* This,VARIANT v) {
    return This->lpVtbl->put_nodeValue(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute3_get_nodeValue(IHTMLDOMAttribute3* This,VARIANT *p) {
    return This->lpVtbl->get_nodeValue(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute3_put_value(IHTMLDOMAttribute3* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute3_get_value(IHTMLDOMAttribute3* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute3_get_specified(IHTMLDOMAttribute3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_specified(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMAttribute4_QueryInterface(IHTMLDOMAttribute4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMAttribute4_AddRef(IHTMLDOMAttribute4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMAttribute4_Release(IHTMLDOMAttribute4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMAttribute4_GetTypeInfoCount(IHTMLDOMAttribute4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute4_GetTypeInfo(IHTMLDOMAttribute4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMAttribute4_put_nodeValue(IHTMLDOMAttribute4* This,VARIANT v) {
    return This->lpVtbl->put_nodeValue(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute4_get_nodeValue(IHTMLDOMAttribute4* This,VARIANT *p) {
    return This->lpVtbl->get_nodeValue(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute4_get_nodeName(IHTMLDOMAttribute4* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute4_get_name(IHTMLDOMAttribute4* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute4_put_value(IHTMLDOMAttribute4* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute4_get_value(IHTMLDOMAttribute4* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute4_get_firstChild(IHTMLDOMAttribute4* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_firstChild(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute4_get_lastChild(IHTMLDOMAttribute4* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_lastChild(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute4_get_childNodes(IHTMLDOMAttribute4* This,IDispatch **p) {
    return This->lpVtbl->get_childNodes(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute4_hasAttributes(IHTMLDOMAttribute4* This,VARIANT_BOOL *pfHasAttributes) {
    return This->lpVtbl->hasAttributes(This,pfHasAttributes);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute4_hasChildNodes(IHTMLDOMAttribute4* This,VARIANT_BOOL *fChildren) {
    return This->lpVtbl->hasChildNodes(This,fChildren);
}
static __WIDL_INLINE HRESULT IHTMLDOMAttribute4_normalize(IHTMLDOMAttribute4* This) {
    return This->lpVtbl->normalize(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMTextNode_QueryInterface(IHTMLDOMTextNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMTextNode_AddRef(IHTMLDOMTextNode* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMTextNode_Release(IHTMLDOMTextNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMTextNode_GetTypeInfoCount(IHTMLDOMTextNode* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode_GetTypeInfo(IHTMLDOMTextNode* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMTextNode_put_data(IHTMLDOMTextNode* This,BSTR v) {
    return This->lpVtbl->put_data(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode_get_data(IHTMLDOMTextNode* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode_toString(IHTMLDOMTextNode* This,BSTR *String) {
    return This->lpVtbl->toString(This,String);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode_get_length(IHTMLDOMTextNode* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMTextNode2_QueryInterface(IHTMLDOMTextNode2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMTextNode2_AddRef(IHTMLDOMTextNode2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMTextNode2_Release(IHTMLDOMTextNode2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMTextNode2_GetTypeInfoCount(IHTMLDOMTextNode2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode2_GetTypeInfo(IHTMLDOMTextNode2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMTextNode2_substringData(IHTMLDOMTextNode2* This,LONG offset,LONG Count,BSTR *pbstrsubString) {
    return This->lpVtbl->substringData(This,offset,Count,pbstrsubString);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode2_appendData(IHTMLDOMTextNode2* This,BSTR bstrstring) {
    return This->lpVtbl->appendData(This,bstrstring);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode2_insertData(IHTMLDOMTextNode2* This,LONG offset,BSTR bstrstring) {
    return This->lpVtbl->insertData(This,offset,bstrstring);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode2_deleteData(IHTMLDOMTextNode2* This,LONG offset,LONG Count) {
    return This->lpVtbl->deleteData(This,offset,Count);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMTextNode3_QueryInterface(IHTMLDOMTextNode3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMTextNode3_AddRef(IHTMLDOMTextNode3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMTextNode3_Release(IHTMLDOMTextNode3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMTextNode3_GetTypeInfoCount(IHTMLDOMTextNode3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode3_GetTypeInfo(IHTMLDOMTextNode3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMTextNode3_substringData(IHTMLDOMTextNode3* This,LONG offset,LONG Count,BSTR *pbstrsubString) {
    return This->lpVtbl->substringData(This,offset,Count,pbstrsubString);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode3_insertData(IHTMLDOMTextNode3* This,LONG offset,BSTR bstrstring) {
    return This->lpVtbl->insertData(This,offset,bstrstring);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode3_deleteData(IHTMLDOMTextNode3* This,LONG offset,LONG Count) {
    return This->lpVtbl->deleteData(This,offset,Count);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode3_replaceData(IHTMLDOMTextNode3* This,LONG offset,LONG Count,BSTR bstrstring) {
    return This->lpVtbl->replaceData(This,offset,Count,bstrstring);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode3_splitText(IHTMLDOMTextNode3* This,LONG offset,IHTMLDOMNode **pRetNode) {
    return This->lpVtbl->splitText(This,offset,pRetNode);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode3_get_wholeText(IHTMLDOMTextNode3* This,BSTR *p) {
    return This->lpVtbl->get_wholeText(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode3_replaceWholeText(IHTMLDOMTextNode3* This,BSTR bstrText,IHTMLDOMNode **ppRetNode) {
    return This->lpVtbl->replaceWholeText(This,bstrText,ppRetNode);
}
static __WIDL_INLINE HRESULT IHTMLDOMTextNode3_hasAttributes(IHTMLDOMTextNode3* This,VARIANT_BOOL *pfHasAttributes) {
    return This->lpVtbl->hasAttributes(This,pfHasAttributes);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMImplementation_QueryInterface(IHTMLDOMImplementation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMImplementation_AddRef(IHTMLDOMImplementation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMImplementation_Release(IHTMLDOMImplementation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMImplementation_GetTypeInfoCount(IHTMLDOMImplementation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMImplementation_GetTypeInfo(IHTMLDOMImplementation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMImplementation2_QueryInterface(IHTMLDOMImplementation2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMImplementation2_AddRef(IHTMLDOMImplementation2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMImplementation2_Release(IHTMLDOMImplementation2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMImplementation2_GetTypeInfoCount(IHTMLDOMImplementation2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMImplementation2_GetTypeInfo(IHTMLDOMImplementation2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMImplementation2_createDocumentType(IHTMLDOMImplementation2* This,BSTR bstrQualifiedName,VARIANT *pvarPublicId,VARIANT *pvarSystemId,IDOMDocumentType **newDocumentType) {
    return This->lpVtbl->createDocumentType(This,bstrQualifiedName,pvarPublicId,pvarSystemId,newDocumentType);
}
static __WIDL_INLINE HRESULT IHTMLDOMImplementation2_createDocument(IHTMLDOMImplementation2* This,VARIANT *pvarNS,VARIANT *pvarTagName,IDOMDocumentType *pDocumentType,IHTMLDocument7 **ppnewDocument) {
    return This->lpVtbl->createDocument(This,pvarNS,pvarTagName,pDocumentType,ppnewDocument);
}
static __WIDL_INLINE HRESULT IHTMLDOMImplementation2_createHTMLDocument(IHTMLDOMImplementation2* This,BSTR bstrTitle,IHTMLDocument7 **ppnewDocument) {
    return This->lpVtbl->createHTMLDocument(This,bstrTitle,ppnewDocument);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLDOMAttribute_QueryInterface(DispHTMLDOMAttribute* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLDOMAttribute_AddRef(DispHTMLDOMAttribute* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLDOMAttribute_Release(DispHTMLDOMAttribute* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLDOMAttribute_GetTypeInfoCount(DispHTMLDOMAttribute* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLDOMAttribute_GetTypeInfo(DispHTMLDOMAttribute* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLDOMTextNode_QueryInterface(DispHTMLDOMTextNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLDOMTextNode_AddRef(DispHTMLDOMTextNode* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLDOMTextNode_Release(DispHTMLDOMTextNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLDOMTextNode_GetTypeInfoCount(DispHTMLDOMTextNode* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLDOMTextNode_GetTypeInfo(DispHTMLDOMTextNode* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLDOMImplementation_QueryInterface(DispHTMLDOMImplementation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLDOMImplementation_AddRef(DispHTMLDOMImplementation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLDOMImplementation_Release(DispHTMLDOMImplementation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLDOMImplementation_GetTypeInfoCount(DispHTMLDOMImplementation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLDOMImplementation_GetTypeInfo(DispHTMLDOMImplementation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAttributeCollection_QueryInterface(IHTMLAttributeCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAttributeCollection_AddRef(IHTMLAttributeCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAttributeCollection_Release(IHTMLAttributeCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAttributeCollection_GetTypeInfoCount(IHTMLAttributeCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection_GetTypeInfo(IHTMLAttributeCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAttributeCollection_get_length(IHTMLAttributeCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection_get__newEnum(IHTMLAttributeCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAttributeCollection2_QueryInterface(IHTMLAttributeCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAttributeCollection2_AddRef(IHTMLAttributeCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAttributeCollection2_Release(IHTMLAttributeCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAttributeCollection2_GetTypeInfoCount(IHTMLAttributeCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection2_GetTypeInfo(IHTMLAttributeCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAttributeCollection2_getNamedItem(IHTMLAttributeCollection2* This,BSTR bstrName,IHTMLDOMAttribute **newretNode) {
    return This->lpVtbl->getNamedItem(This,bstrName,newretNode);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection2_setNamedItem(IHTMLAttributeCollection2* This,IHTMLDOMAttribute *ppNode,IHTMLDOMAttribute **newretNode) {
    return This->lpVtbl->setNamedItem(This,ppNode,newretNode);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAttributeCollection3_QueryInterface(IHTMLAttributeCollection3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAttributeCollection3_AddRef(IHTMLAttributeCollection3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAttributeCollection3_Release(IHTMLAttributeCollection3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAttributeCollection3_GetTypeInfoCount(IHTMLAttributeCollection3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection3_GetTypeInfo(IHTMLAttributeCollection3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAttributeCollection3_getNamedItem(IHTMLAttributeCollection3* This,BSTR bstrName,IHTMLDOMAttribute **ppNodeOut) {
    return This->lpVtbl->getNamedItem(This,bstrName,ppNodeOut);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection3_setNamedItem(IHTMLAttributeCollection3* This,IHTMLDOMAttribute *pNodeIn,IHTMLDOMAttribute **ppNodeOut) {
    return This->lpVtbl->setNamedItem(This,pNodeIn,ppNodeOut);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection3_removeNamedItem(IHTMLAttributeCollection3* This,BSTR bstrName,IHTMLDOMAttribute **ppNodeOut) {
    return This->lpVtbl->removeNamedItem(This,bstrName,ppNodeOut);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection3_item(IHTMLAttributeCollection3* This,LONG index,IHTMLDOMAttribute **ppNodeOut) {
    return This->lpVtbl->item(This,index,ppNodeOut);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAttributeCollection4_QueryInterface(IHTMLAttributeCollection4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAttributeCollection4_AddRef(IHTMLAttributeCollection4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAttributeCollection4_Release(IHTMLAttributeCollection4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAttributeCollection4_GetTypeInfoCount(IHTMLAttributeCollection4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection4_GetTypeInfo(IHTMLAttributeCollection4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAttributeCollection4_getNamedItemNS(IHTMLAttributeCollection4* This,VARIANT *pvarNS,BSTR bstrName,IHTMLDOMAttribute2 **ppNodeOut) {
    return This->lpVtbl->getNamedItemNS(This,pvarNS,bstrName,ppNodeOut);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection4_setNamedItemNS(IHTMLAttributeCollection4* This,IHTMLDOMAttribute2 *pNodeIn,IHTMLDOMAttribute2 **ppNodeOut) {
    return This->lpVtbl->setNamedItemNS(This,pNodeIn,ppNodeOut);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection4_removeNamedItemNS(IHTMLAttributeCollection4* This,VARIANT *pvarNS,BSTR bstrName,IHTMLDOMAttribute2 **ppNodeOut) {
    return This->lpVtbl->removeNamedItemNS(This,pvarNS,bstrName,ppNodeOut);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection4_getNamedItem(IHTMLAttributeCollection4* This,BSTR bstrName,IHTMLDOMAttribute2 **ppNodeOut) {
    return This->lpVtbl->getNamedItem(This,bstrName,ppNodeOut);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection4_setNamedItem(IHTMLAttributeCollection4* This,IHTMLDOMAttribute2 *pNodeIn,IHTMLDOMAttribute2 **ppNodeOut) {
    return This->lpVtbl->setNamedItem(This,pNodeIn,ppNodeOut);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection4_removeNamedItem(IHTMLAttributeCollection4* This,BSTR bstrName,IHTMLDOMAttribute2 **ppNodeOut) {
    return This->lpVtbl->removeNamedItem(This,bstrName,ppNodeOut);
}
static __WIDL_INLINE HRESULT IHTMLAttributeCollection4_item(IHTMLAttributeCollection4* This,LONG index,IHTMLDOMAttribute2 **ppNodeOut) {
    return This->lpVtbl->item(This,index,ppNodeOut);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMChildrenCollection_QueryInterface(IHTMLDOMChildrenCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMChildrenCollection_AddRef(IHTMLDOMChildrenCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMChildrenCollection_Release(IHTMLDOMChildrenCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMChildrenCollection_GetTypeInfoCount(IHTMLDOMChildrenCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMChildrenCollection_GetTypeInfo(IHTMLDOMChildrenCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMChildrenCollection_get_length(IHTMLDOMChildrenCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMChildrenCollection_get__newEnum(IHTMLDOMChildrenCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMChildrenCollection2_QueryInterface(IHTMLDOMChildrenCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMChildrenCollection2_AddRef(IHTMLDOMChildrenCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMChildrenCollection2_Release(IHTMLDOMChildrenCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMChildrenCollection2_GetTypeInfoCount(IHTMLDOMChildrenCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMChildrenCollection2_GetTypeInfo(IHTMLDOMChildrenCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLAttributeCollection_QueryInterface(DispHTMLAttributeCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLAttributeCollection_AddRef(DispHTMLAttributeCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLAttributeCollection_Release(DispHTMLAttributeCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLAttributeCollection_GetTypeInfoCount(DispHTMLAttributeCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLAttributeCollection_GetTypeInfo(DispHTMLAttributeCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispStaticNodeList_QueryInterface(DispStaticNodeList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispStaticNodeList_AddRef(DispStaticNodeList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispStaticNodeList_Release(DispStaticNodeList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispStaticNodeList_GetTypeInfoCount(DispStaticNodeList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispStaticNodeList_GetTypeInfo(DispStaticNodeList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMChildrenCollection_QueryInterface(DispDOMChildrenCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMChildrenCollection_AddRef(DispDOMChildrenCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMChildrenCollection_Release(DispDOMChildrenCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMChildrenCollection_GetTypeInfoCount(DispDOMChildrenCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMChildrenCollection_GetTypeInfo(DispDOMChildrenCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLElementEvents4_QueryInterface(HTMLElementEvents4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLElementEvents4_AddRef(HTMLElementEvents4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLElementEvents4_Release(HTMLElementEvents4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLElementEvents4_GetTypeInfoCount(HTMLElementEvents4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLElementEvents4_GetTypeInfo(HTMLElementEvents4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLElementEvents3_QueryInterface(HTMLElementEvents3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLElementEvents3_AddRef(HTMLElementEvents3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLElementEvents3_Release(HTMLElementEvents3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLElementEvents3_GetTypeInfoCount(HTMLElementEvents3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLElementEvents3_GetTypeInfo(HTMLElementEvents3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLElementEvents2_QueryInterface(HTMLElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLElementEvents2_AddRef(HTMLElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLElementEvents2_Release(HTMLElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLElementEvents2_GetTypeInfoCount(HTMLElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLElementEvents2_GetTypeInfo(HTMLElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLElementEvents_QueryInterface(HTMLElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLElementEvents_AddRef(HTMLElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLElementEvents_Release(HTMLElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLElementEvents_GetTypeInfoCount(HTMLElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLElementEvents_GetTypeInfo(HTMLElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElement_QueryInterface(IHTMLElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLElement_AddRef(IHTMLElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLElement_Release(IHTMLElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLElement_GetTypeInfoCount(IHTMLElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLElement_GetTypeInfo(IHTMLElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElement_setAttribute(IHTMLElement* This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags) {
    return This->lpVtbl->setAttribute(This,strAttributeName,AttributeValue,lFlags);
}
static __WIDL_INLINE HRESULT IHTMLElement_getAttribute(IHTMLElement* This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue);
}
static __WIDL_INLINE HRESULT IHTMLElement_removeAttribute(IHTMLElement* This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess) {
    return This->lpVtbl->removeAttribute(This,strAttributeName,lFlags,pfSuccess);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_className(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_className(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_className(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_className(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_id(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_id(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_id(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_id(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_tagName(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_tagName(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_parentElement(IHTMLElement* This,IHTMLElement **p) {
    return This->lpVtbl->get_parentElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_style(IHTMLElement* This,IHTMLStyle **p) {
    return This->lpVtbl->get_style(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onhelp(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onhelp(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onhelp(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onhelp(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onclick(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onclick(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onclick(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onclick(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_ondblclick(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_ondblclick(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_ondblclick(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_ondblclick(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onkeydown(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onkeydown(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onkeydown(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onkeydown(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onkeyup(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onkeyup(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onkeyup(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onkeyup(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onkeypress(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onkeypress(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onkeypress(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onkeypress(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onmouseout(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onmouseout(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onmouseout(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onmouseover(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onmouseover(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onmouseover(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseover(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onmousemove(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onmousemove(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onmousemove(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onmousemove(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onmousedown(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onmousedown(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onmousedown(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onmousedown(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onmouseup(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onmouseup(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onmouseup(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseup(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_document(IHTMLElement* This,IDispatch **p) {
    return This->lpVtbl->get_document(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_title(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_title(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_title(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_title(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_language(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_language(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_language(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_language(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onselectstart(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onselectstart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onselectstart(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onselectstart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_scrollIntoView(IHTMLElement* This,VARIANT varargStart) {
    return This->lpVtbl->scrollIntoView(This,varargStart);
}
static __WIDL_INLINE HRESULT IHTMLElement_contains(IHTMLElement* This,IHTMLElement *pChild,VARIANT_BOOL *pfResult) {
    return This->lpVtbl->contains(This,pChild,pfResult);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_sourceIndex(IHTMLElement* This,LONG *p) {
    return This->lpVtbl->get_sourceIndex(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_recordNumber(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_recordNumber(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_lang(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_lang(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_lang(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_lang(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_offsetLeft(IHTMLElement* This,LONG *p) {
    return This->lpVtbl->get_offsetLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_offsetTop(IHTMLElement* This,LONG *p) {
    return This->lpVtbl->get_offsetTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_offsetWidth(IHTMLElement* This,LONG *p) {
    return This->lpVtbl->get_offsetWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_offsetHeight(IHTMLElement* This,LONG *p) {
    return This->lpVtbl->get_offsetHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_offsetParent(IHTMLElement* This,IHTMLElement **p) {
    return This->lpVtbl->get_offsetParent(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_innerHTML(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_innerHTML(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_innerHTML(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_innerHTML(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_innerText(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_innerText(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_innerText(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_innerText(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_outerHTML(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_outerHTML(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_outerHTML(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_outerHTML(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_outerText(IHTMLElement* This,BSTR v) {
    return This->lpVtbl->put_outerText(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_outerText(IHTMLElement* This,BSTR *p) {
    return This->lpVtbl->get_outerText(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_insertAdjacentHTML(IHTMLElement* This,BSTR where,BSTR html) {
    return This->lpVtbl->insertAdjacentHTML(This,where,html);
}
static __WIDL_INLINE HRESULT IHTMLElement_insertAdjacentText(IHTMLElement* This,BSTR where,BSTR text) {
    return This->lpVtbl->insertAdjacentText(This,where,text);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_parentTextEdit(IHTMLElement* This,IHTMLElement **p) {
    return This->lpVtbl->get_parentTextEdit(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_isTextEdit(IHTMLElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isTextEdit(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_click(IHTMLElement* This) {
    return This->lpVtbl->click(This);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_filters(IHTMLElement* This,IHTMLFiltersCollection **p) {
    return This->lpVtbl->get_filters(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_ondragstart(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_ondragstart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_ondragstart(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_ondragstart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_toString(IHTMLElement* This,BSTR *String) {
    return This->lpVtbl->toString(This,String);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onbeforeupdate(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeupdate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onbeforeupdate(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeupdate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onafterupdate(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onafterupdate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onafterupdate(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onafterupdate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onerrorupdate(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onerrorupdate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onerrorupdate(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onerrorupdate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onrowexit(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onrowexit(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onrowexit(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onrowexit(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onrowenter(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onrowenter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onrowenter(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onrowenter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_ondatasetchanged(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_ondatasetchanged(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_ondatasetchanged(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_ondatasetchanged(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_ondataavailable(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_ondataavailable(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_ondataavailable(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_ondataavailable(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_ondatasetcomplete(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_ondatasetcomplete(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_ondatasetcomplete(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_ondatasetcomplete(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_put_onfilterchange(IHTMLElement* This,VARIANT v) {
    return This->lpVtbl->put_onfilterchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_onfilterchange(IHTMLElement* This,VARIANT *p) {
    return This->lpVtbl->get_onfilterchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement_get_children(IHTMLElement* This,IDispatch **p) {
    return This->lpVtbl->get_children(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElement2_QueryInterface(IHTMLElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLElement2_AddRef(IHTMLElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLElement2_Release(IHTMLElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLElement2_GetTypeInfoCount(IHTMLElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLElement2_GetTypeInfo(IHTMLElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElement2_get_scopeName(IHTMLElement2* This,BSTR *p) {
    return This->lpVtbl->get_scopeName(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_setCapture(IHTMLElement2* This,VARIANT_BOOL containerCapture) {
    return This->lpVtbl->setCapture(This,containerCapture);
}
static __WIDL_INLINE HRESULT IHTMLElement2_releaseCapture(IHTMLElement2* This) {
    return This->lpVtbl->releaseCapture(This);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_onlosecapture(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onlosecapture(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_onlosecapture(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onlosecapture(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_componentFromPoint(IHTMLElement2* This,LONG x,LONG y,BSTR *component) {
    return This->lpVtbl->componentFromPoint(This,x,y,component);
}
static __WIDL_INLINE HRESULT IHTMLElement2_doScroll(IHTMLElement2* This,VARIANT component) {
    return This->lpVtbl->doScroll(This,component);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_onscroll(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onscroll(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_onscroll(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onscroll(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_ondrag(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_ondrag(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_ondrag(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_ondrag(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_ondragend(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_ondragend(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_ondragend(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_ondragend(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_ondragenter(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_ondragenter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_ondragenter(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_ondragenter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_ondragover(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_ondragover(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_ondragover(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_ondragover(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_ondragleave(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_ondragleave(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_ondragleave(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_ondragleave(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_ondrop(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_ondrop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_ondrop(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_ondrop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_onbeforecut(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforecut(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_onbeforecut(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforecut(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_oncut(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_oncut(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_oncut(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_oncut(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_onbeforecopy(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforecopy(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_onbeforecopy(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforecopy(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_oncopy(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_oncopy(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_oncopy(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_oncopy(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_onbeforepaste(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforepaste(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_onbeforepaste(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforepaste(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_onpaste(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onpaste(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_onpaste(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onpaste(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_currentStyle(IHTMLElement2* This,IHTMLCurrentStyle **p) {
    return This->lpVtbl->get_currentStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_onpropertychange(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onpropertychange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_onpropertychange(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onpropertychange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_getClientRects(IHTMLElement2* This,IHTMLRectCollection **pRectCol) {
    return This->lpVtbl->getClientRects(This,pRectCol);
}
static __WIDL_INLINE HRESULT IHTMLElement2_getBoundingClientRect(IHTMLElement2* This,IHTMLRect **pRect) {
    return This->lpVtbl->getBoundingClientRect(This,pRect);
}
static __WIDL_INLINE HRESULT IHTMLElement2_setExpression(IHTMLElement2* This,BSTR propname,BSTR expression,BSTR language) {
    return This->lpVtbl->setExpression(This,propname,expression,language);
}
static __WIDL_INLINE HRESULT IHTMLElement2_getExpression(IHTMLElement2* This,BSTR propname,VARIANT *expression) {
    return This->lpVtbl->getExpression(This,propname,expression);
}
static __WIDL_INLINE HRESULT IHTMLElement2_removeExpression(IHTMLElement2* This,BSTR propname,VARIANT_BOOL *pfSuccess) {
    return This->lpVtbl->removeExpression(This,propname,pfSuccess);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_tabIndex(IHTMLElement2* This,short v) {
    return This->lpVtbl->put_tabIndex(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_tabIndex(IHTMLElement2* This,short *p) {
    return This->lpVtbl->get_tabIndex(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_focus(IHTMLElement2* This) {
    return This->lpVtbl->focus(This);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_accessKey(IHTMLElement2* This,BSTR v) {
    return This->lpVtbl->put_accessKey(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_accessKey(IHTMLElement2* This,BSTR *p) {
    return This->lpVtbl->get_accessKey(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_onblur(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onblur(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_onblur(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onblur(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_onfocus(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onfocus(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_onfocus(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onfocus(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_onresize(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onresize(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_onresize(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onresize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_blur(IHTMLElement2* This) {
    return This->lpVtbl->blur(This);
}
static __WIDL_INLINE HRESULT IHTMLElement2_addFilter(IHTMLElement2* This,IUnknown *pUnk) {
    return This->lpVtbl->addFilter(This,pUnk);
}
static __WIDL_INLINE HRESULT IHTMLElement2_removeFilter(IHTMLElement2* This,IUnknown *pUnk) {
    return This->lpVtbl->removeFilter(This,pUnk);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_clientHeight(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_clientHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_clientWidth(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_clientWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_clientTop(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_clientTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_clientLeft(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_clientLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_attachEvent(IHTMLElement2* This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult) {
    return This->lpVtbl->attachEvent(This,event,pDisp,pfResult);
}
static __WIDL_INLINE HRESULT IHTMLElement2_detachEvent(IHTMLElement2* This,BSTR event,IDispatch *pDisp) {
    return This->lpVtbl->detachEvent(This,event,pDisp);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_readyState(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_onreadystatechange(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_onreadystatechange(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_onrowsdelete(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onrowsdelete(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_onrowsdelete(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onrowsdelete(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_onrowsinserted(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onrowsinserted(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_onrowsinserted(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onrowsinserted(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_oncellchange(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_oncellchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_oncellchange(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_oncellchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_dir(IHTMLElement2* This,BSTR v) {
    return This->lpVtbl->put_dir(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_dir(IHTMLElement2* This,BSTR *p) {
    return This->lpVtbl->get_dir(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_createControlRange(IHTMLElement2* This,IDispatch **range) {
    return This->lpVtbl->createControlRange(This,range);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_scrollHeight(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_scrollHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_scrollWidth(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_scrollWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_scrollTop(IHTMLElement2* This,LONG v) {
    return This->lpVtbl->put_scrollTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_scrollTop(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_scrollTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_scrollLeft(IHTMLElement2* This,LONG v) {
    return This->lpVtbl->put_scrollLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_scrollLeft(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_scrollLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_clearAttributes(IHTMLElement2* This) {
    return This->lpVtbl->clearAttributes(This);
}
static __WIDL_INLINE HRESULT IHTMLElement2_mergeAttributes(IHTMLElement2* This,IHTMLElement *mergeThis) {
    return This->lpVtbl->mergeAttributes(This,mergeThis);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_oncontextmenu(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_oncontextmenu(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_oncontextmenu(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_oncontextmenu(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_insertAdjacentElement(IHTMLElement2* This,BSTR where,IHTMLElement *insertedElement,IHTMLElement **inserted) {
    return This->lpVtbl->insertAdjacentElement(This,where,insertedElement,inserted);
}
static __WIDL_INLINE HRESULT IHTMLElement2_applyElement(IHTMLElement2* This,IHTMLElement *apply,BSTR where,IHTMLElement **applied) {
    return This->lpVtbl->applyElement(This,apply,where,applied);
}
static __WIDL_INLINE HRESULT IHTMLElement2_getAdjacentText(IHTMLElement2* This,BSTR where,BSTR *text) {
    return This->lpVtbl->getAdjacentText(This,where,text);
}
static __WIDL_INLINE HRESULT IHTMLElement2_replaceAdjacentText(IHTMLElement2* This,BSTR where,BSTR newText,BSTR *oldText) {
    return This->lpVtbl->replaceAdjacentText(This,where,newText,oldText);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_canHaveChildren(IHTMLElement2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_canHaveChildren(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_addBehavior(IHTMLElement2* This,BSTR bstrUrl,VARIANT *pvarFactory,LONG *pCookie) {
    return This->lpVtbl->addBehavior(This,bstrUrl,pvarFactory,pCookie);
}
static __WIDL_INLINE HRESULT IHTMLElement2_removeBehavior(IHTMLElement2* This,LONG cookie,VARIANT_BOOL *pfResult) {
    return This->lpVtbl->removeBehavior(This,cookie,pfResult);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_runtimeStyle(IHTMLElement2* This,IHTMLStyle **p) {
    return This->lpVtbl->get_runtimeStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_behaviorUrns(IHTMLElement2* This,IDispatch **p) {
    return This->lpVtbl->get_behaviorUrns(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_tagUrn(IHTMLElement2* This,BSTR v) {
    return This->lpVtbl->put_tagUrn(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_tagUrn(IHTMLElement2* This,BSTR *p) {
    return This->lpVtbl->get_tagUrn(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_put_onbeforeeditfocus(IHTMLElement2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeeditfocus(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_onbeforeeditfocus(IHTMLElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeeditfocus(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement2_get_readyStateValue(IHTMLElement2* This,LONG *p) {
    return This->lpVtbl->get_readyStateValue(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElement3_QueryInterface(IHTMLElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLElement3_AddRef(IHTMLElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLElement3_Release(IHTMLElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLElement3_GetTypeInfoCount(IHTMLElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLElement3_GetTypeInfo(IHTMLElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElement3_mergeAttributes(IHTMLElement3* This,IHTMLElement *mergeThis,VARIANT *pvarFlags) {
    return This->lpVtbl->mergeAttributes(This,mergeThis,pvarFlags);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_isMultiLine(IHTMLElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isMultiLine(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_canHaveHTML(IHTMLElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_canHaveHTML(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_onlayoutcomplete(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onlayoutcomplete(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_onlayoutcomplete(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onlayoutcomplete(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_onpage(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onpage(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_onpage(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onpage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_inflateBlock(IHTMLElement3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_inflateBlock(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_inflateBlock(IHTMLElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_inflateBlock(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_onbeforedeactivate(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onbeforedeactivate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_onbeforedeactivate(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforedeactivate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_setActive(IHTMLElement3* This) {
    return This->lpVtbl->setActive(This);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_contentEditable(IHTMLElement3* This,BSTR v) {
    return This->lpVtbl->put_contentEditable(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_contentEditable(IHTMLElement3* This,BSTR *p) {
    return This->lpVtbl->get_contentEditable(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_isContentEditable(IHTMLElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isContentEditable(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_hideFocus(IHTMLElement3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_hideFocus(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_hideFocus(IHTMLElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_hideFocus(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_disabled(IHTMLElement3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_disabled(IHTMLElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_isDisabled(IHTMLElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isDisabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_onmove(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onmove(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_onmove(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onmove(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_oncontrolselect(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_oncontrolselect(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_oncontrolselect(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_oncontrolselect(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_fireEvent(IHTMLElement3* This,BSTR bstrEventName,VARIANT *pvarEventObject,VARIANT_BOOL *pfCancelled) {
    return This->lpVtbl->fireEvent(This,bstrEventName,pvarEventObject,pfCancelled);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_onresizestart(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onresizestart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_onresizestart(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onresizestart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_onresizeend(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onresizeend(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_onresizeend(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onresizeend(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_onmovestart(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onmovestart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_onmovestart(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onmovestart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_onmoveend(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onmoveend(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_onmoveend(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onmoveend(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_onmouseenter(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onmouseenter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_onmouseenter(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseenter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_onmouseleave(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onmouseleave(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_onmouseleave(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseleave(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_onactivate(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_onactivate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_onactivate(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onactivate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_put_ondeactivate(IHTMLElement3* This,VARIANT v) {
    return This->lpVtbl->put_ondeactivate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement3_get_ondeactivate(IHTMLElement3* This,VARIANT *p) {
    return This->lpVtbl->get_ondeactivate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement3_dragDrop(IHTMLElement3* This,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->dragDrop(This,pfRet);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElement4_QueryInterface(IHTMLElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLElement4_AddRef(IHTMLElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLElement4_Release(IHTMLElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLElement4_GetTypeInfoCount(IHTMLElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLElement4_GetTypeInfo(IHTMLElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElement4_put_onmousewheel(IHTMLElement4* This,VARIANT v) {
    return This->lpVtbl->put_onmousewheel(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement4_get_onmousewheel(IHTMLElement4* This,VARIANT *p) {
    return This->lpVtbl->get_onmousewheel(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement4_normalize(IHTMLElement4* This) {
    return This->lpVtbl->normalize(This);
}
static __WIDL_INLINE HRESULT IHTMLElement4_getAttributeNode(IHTMLElement4* This,BSTR bstrname,IHTMLDOMAttribute **ppAttribute) {
    return This->lpVtbl->getAttributeNode(This,bstrname,ppAttribute);
}
static __WIDL_INLINE HRESULT IHTMLElement4_setAttributeNode(IHTMLElement4* This,IHTMLDOMAttribute *pattr,IHTMLDOMAttribute **ppretAttribute) {
    return This->lpVtbl->setAttributeNode(This,pattr,ppretAttribute);
}
static __WIDL_INLINE HRESULT IHTMLElement4_removeAttributeNode(IHTMLElement4* This,IHTMLDOMAttribute *pattr,IHTMLDOMAttribute **ppretAttribute) {
    return This->lpVtbl->removeAttributeNode(This,pattr,ppretAttribute);
}
static __WIDL_INLINE HRESULT IHTMLElement4_put_onbeforeactivate(IHTMLElement4* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeactivate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement4_get_onbeforeactivate(IHTMLElement4* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeactivate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement4_put_onfocusin(IHTMLElement4* This,VARIANT v) {
    return This->lpVtbl->put_onfocusin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement4_get_onfocusin(IHTMLElement4* This,VARIANT *p) {
    return This->lpVtbl->get_onfocusin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement4_put_onfocusout(IHTMLElement4* This,VARIANT v) {
    return This->lpVtbl->put_onfocusout(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementSelector_QueryInterface(IElementSelector* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementSelector_AddRef(IElementSelector* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementSelector_Release(IElementSelector* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IElementSelector_GetTypeInfoCount(IElementSelector* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IElementSelector_GetTypeInfo(IElementSelector* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementSelector_querySelector(IElementSelector* This,BSTR v,IHTMLElement **pel) {
    return This->lpVtbl->querySelector(This,v,pel);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElementRender_QueryInterface(IHTMLElementRender* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLElementRender_AddRef(IHTMLElementRender* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLElementRender_Release(IHTMLElementRender* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLElementRender methods ***/
static __WIDL_INLINE HRESULT IHTMLElementRender_DrawToDC(IHTMLElementRender* This,HDC hDC) {
    return This->lpVtbl->DrawToDC(This,hDC);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLUniqueName_QueryInterface(IHTMLUniqueName* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLUniqueName_AddRef(IHTMLUniqueName* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLUniqueName_Release(IHTMLUniqueName* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLUniqueName_GetTypeInfoCount(IHTMLUniqueName* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLUniqueName_GetTypeInfo(IHTMLUniqueName* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLUniqueName_get_uniqueNumber(IHTMLUniqueName* This,LONG *p) {
    return This->lpVtbl->get_uniqueNumber(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElement5_QueryInterface(IHTMLElement5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLElement5_AddRef(IHTMLElement5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLElement5_Release(IHTMLElement5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLElement5_GetTypeInfoCount(IHTMLElement5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLElement5_GetTypeInfo(IHTMLElement5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElement5_getAttributeNode(IHTMLElement5* This,BSTR bstrname,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->getAttributeNode(This,bstrname,ppretAttribute);
}
static __WIDL_INLINE HRESULT IHTMLElement5_setAttributeNode(IHTMLElement5* This,IHTMLDOMAttribute2 *pattr,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->setAttributeNode(This,pattr,ppretAttribute);
}
static __WIDL_INLINE HRESULT IHTMLElement5_removeAttributeNode(IHTMLElement5* This,IHTMLDOMAttribute2 *pattr,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->removeAttributeNode(This,pattr,ppretAttribute);
}
static __WIDL_INLINE HRESULT IHTMLElement5_hasAttribute(IHTMLElement5* This,BSTR name,VARIANT_BOOL *pfHasAttribute) {
    return This->lpVtbl->hasAttribute(This,name,pfHasAttribute);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_role(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_role(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_role(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_role(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaBusy(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaBusy(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaBusy(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaBusy(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaChecked(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaChecked(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaChecked(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaChecked(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaDisabled(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaDisabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaDisabled(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaDisabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaExpanded(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaExpanded(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaExpanded(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaExpanded(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaHaspopup(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaHaspopup(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaHaspopup(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaHaspopup(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaHidden(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaHidden(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaHidden(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaHidden(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaInvalid(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaInvalid(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaInvalid(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaInvalid(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaMultiselectable(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaMultiselectable(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaMultiselectable(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaMultiselectable(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaPressed(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaPressed(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaPressed(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaPressed(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaReadonly(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaReadonly(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaReadonly(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaReadonly(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaRequired(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaRequired(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaRequired(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaRequired(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaSecret(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaSecret(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaSecret(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaSecret(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaSelected(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaSelected(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaSelected(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaSelected(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_getAttribute(IHTMLElement5* This,BSTR strAttributeName,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttribute(This,strAttributeName,AttributeValue);
}
static __WIDL_INLINE HRESULT IHTMLElement5_setAttribute(IHTMLElement5* This,BSTR strAttributeName,VARIANT AttributeValue) {
    return This->lpVtbl->setAttribute(This,strAttributeName,AttributeValue);
}
static __WIDL_INLINE HRESULT IHTMLElement5_removeAttribute(IHTMLElement5* This,BSTR strAttributeName,VARIANT_BOOL *pfSuccess) {
    return This->lpVtbl->removeAttribute(This,strAttributeName,pfSuccess);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_attributes(IHTMLElement5* This,IHTMLAttributeCollection3 **p) {
    return This->lpVtbl->get_attributes(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaValuenow(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaValuenow(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaValuenow(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaValuenow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaPosinset(IHTMLElement5* This,short v) {
    return This->lpVtbl->put_ariaPosinset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaPosinset(IHTMLElement5* This,short *p) {
    return This->lpVtbl->get_ariaPosinset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaSetsize(IHTMLElement5* This,short v) {
    return This->lpVtbl->put_ariaSetsize(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaSetsize(IHTMLElement5* This,short *p) {
    return This->lpVtbl->get_ariaSetsize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaLevel(IHTMLElement5* This,short v) {
    return This->lpVtbl->put_ariaLevel(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaLevel(IHTMLElement5* This,short *p) {
    return This->lpVtbl->get_ariaLevel(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaValuemin(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaValuemin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaValuemin(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaValuemin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaValuemax(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaValuemax(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaValuemax(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaValuemax(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaControls(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaControls(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaControls(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaControls(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaDescribedby(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaDescribedby(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaDescribedby(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaDescribedby(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaFlowto(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaFlowto(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaFlowto(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaFlowto(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaLabelledby(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaLabelledby(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaLabelledby(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaLabelledby(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaActivedescendant(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaActivedescendant(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaActivedescendant(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaActivedescendant(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaOwns(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaOwns(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaOwns(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaOwns(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_hasAttributes(IHTMLElement5* This,VARIANT_BOOL *pfHasAttributes) {
    return This->lpVtbl->hasAttributes(This,pfHasAttributes);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaLive(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaLive(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement5_get_ariaLive(IHTMLElement5* This,BSTR *p) {
    return This->lpVtbl->get_ariaLive(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement5_put_ariaRelevant(IHTMLElement5* This,BSTR v) {
    return This->lpVtbl->put_ariaRelevant(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElement6_QueryInterface(IHTMLElement6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLElement6_AddRef(IHTMLElement6* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLElement6_Release(IHTMLElement6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLElement6_GetTypeInfoCount(IHTMLElement6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLElement6_GetTypeInfo(IHTMLElement6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElement6_getAttributeNS(IHTMLElement6* This,VARIANT *pvarNS,BSTR strAttributeName,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttributeNS(This,pvarNS,strAttributeName,AttributeValue);
}
static __WIDL_INLINE HRESULT IHTMLElement6_setAttributeNS(IHTMLElement6* This,VARIANT *pvarNS,BSTR strAttributeName,VARIANT *pvarAttributeValue) {
    return This->lpVtbl->setAttributeNS(This,pvarNS,strAttributeName,pvarAttributeValue);
}
static __WIDL_INLINE HRESULT IHTMLElement6_removeAttributeNS(IHTMLElement6* This,VARIANT *pvarNS,BSTR strAttributeName) {
    return This->lpVtbl->removeAttributeNS(This,pvarNS,strAttributeName);
}
static __WIDL_INLINE HRESULT IHTMLElement6_getAttributeNodeNS(IHTMLElement6* This,VARIANT *pvarNS,BSTR bstrname,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->getAttributeNodeNS(This,pvarNS,bstrname,ppretAttribute);
}
static __WIDL_INLINE HRESULT IHTMLElement6_setAttributeNodeNS(IHTMLElement6* This,IHTMLDOMAttribute2 *pattr,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->setAttributeNodeNS(This,pattr,ppretAttribute);
}
static __WIDL_INLINE HRESULT IHTMLElement6_hasAttributeNS(IHTMLElement6* This,VARIANT *pvarNS,BSTR name,VARIANT_BOOL *pfHasAttribute) {
    return This->lpVtbl->hasAttributeNS(This,pvarNS,name,pfHasAttribute);
}
static __WIDL_INLINE HRESULT IHTMLElement6_getAttribute(IHTMLElement6* This,BSTR strAttributeName,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttribute(This,strAttributeName,AttributeValue);
}
static __WIDL_INLINE HRESULT IHTMLElement6_setAttribute(IHTMLElement6* This,BSTR strAttributeName,VARIANT *pvarAttributeValue) {
    return This->lpVtbl->setAttribute(This,strAttributeName,pvarAttributeValue);
}
static __WIDL_INLINE HRESULT IHTMLElement6_removeAttribute(IHTMLElement6* This,BSTR strAttributeName) {
    return This->lpVtbl->removeAttribute(This,strAttributeName);
}
static __WIDL_INLINE HRESULT IHTMLElement6_getAttributeNode(IHTMLElement6* This,BSTR strAttributeName,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->getAttributeNode(This,strAttributeName,ppretAttribute);
}
static __WIDL_INLINE HRESULT IHTMLElement6_setAttributeNode(IHTMLElement6* This,IHTMLDOMAttribute2 *pattr,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->setAttributeNode(This,pattr,ppretAttribute);
}
static __WIDL_INLINE HRESULT IHTMLElement6_removeAttributeNode(IHTMLElement6* This,IHTMLDOMAttribute2 *pattr,IHTMLDOMAttribute2 **ppretAttribute) {
    return This->lpVtbl->removeAttributeNode(This,pattr,ppretAttribute);
}
static __WIDL_INLINE HRESULT IHTMLElement6_hasAttribute(IHTMLElement6* This,BSTR name,VARIANT_BOOL *pfHasAttribute) {
    return This->lpVtbl->hasAttribute(This,name,pfHasAttribute);
}
static __WIDL_INLINE HRESULT IHTMLElement6_getElementsByTagNameNS(IHTMLElement6* This,VARIANT *varNS,BSTR bstrLocalName,IHTMLElementCollection **pelColl) {
    return This->lpVtbl->getElementsByTagNameNS(This,varNS,bstrLocalName,pelColl);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_tagName(IHTMLElement6* This,BSTR *p) {
    return This->lpVtbl->get_tagName(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_nodeName(IHTMLElement6* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_getElementsByClassName(IHTMLElement6* This,BSTR v,IHTMLElementCollection **pel) {
    return This->lpVtbl->getElementsByClassName(This,v,pel);
}
static __WIDL_INLINE HRESULT IHTMLElement6_msMatchesSelector(IHTMLElement6* This,BSTR v,VARIANT_BOOL *pfMatches) {
    return This->lpVtbl->msMatchesSelector(This,v,pfMatches);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onabort(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onabort(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onabort(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onabort(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_oncanplay(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_oncanplay(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_oncanplay(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_oncanplay(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_oncanplaythrough(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_oncanplaythrough(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_oncanplaythrough(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_oncanplaythrough(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onchange(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onchange(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_ondurationchange(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_ondurationchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_ondurationchange(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_ondurationchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onemptied(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onemptied(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onemptied(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onemptied(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onended(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onended(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onended(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onended(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onerror(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onerror(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_oninput(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_oninput(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_oninput(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_oninput(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onload(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onload(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onloadeddata(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onloadeddata(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onloadeddata(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onloadeddata(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onloadedmetadata(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onloadedmetadata(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onloadedmetadata(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onloadedmetadata(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onloadstart(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onloadstart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onloadstart(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onloadstart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onpause(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onpause(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onpause(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onpause(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onplay(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onplay(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onplay(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onplay(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onplaying(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onplaying(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onplaying(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onplaying(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onprogress(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onprogress(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onprogress(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onprogress(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onratechange(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onratechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onratechange(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onratechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onreset(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onreset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onreset(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onreset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onseeked(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onseeked(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onseeked(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onseeked(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onseeking(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onseeking(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onseeking(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onseeking(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onselect(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onselect(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onstalled(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onstalled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onstalled(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onstalled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onsubmit(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onsubmit(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onsubmit(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onsubmit(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onsuspend(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onsuspend(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onsuspend(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onsuspend(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_ontimeupdate(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_ontimeupdate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_ontimeupdate(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_ontimeupdate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onvolumechange(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onvolumechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onvolumechange(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onvolumechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement6_put_onwaiting(IHTMLElement6* This,VARIANT v) {
    return This->lpVtbl->put_onwaiting(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement6_get_onwaiting(IHTMLElement6* This,VARIANT *p) {
    return This->lpVtbl->get_onwaiting(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElement7_QueryInterface(IHTMLElement7* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLElement7_AddRef(IHTMLElement7* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLElement7_Release(IHTMLElement7* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLElement7_GetTypeInfoCount(IHTMLElement7* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLElement7_GetTypeInfo(IHTMLElement7* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElement7_put_onmspointerdown(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerdown(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmspointerdown(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerdown(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmspointermove(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmspointermove(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmspointermove(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointermove(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmspointerup(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerup(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmspointerup(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerup(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmspointerover(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerover(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmspointerover(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerover(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmspointerout(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerout(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmspointerout(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmspointercancel(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmspointercancel(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmspointercancel(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointercancel(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmspointerhover(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerhover(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmspointerhover(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerhover(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmslostpointercapture(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmslostpointercapture(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmslostpointercapture(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmslostpointercapture(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmsgotpointercapture(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsgotpointercapture(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmsgotpointercapture(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgotpointercapture(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmsgesturestart(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturestart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmsgesturestart(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturestart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmsgesturechange(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmsgesturechange(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmsgestureend(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsgestureend(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmsgestureend(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgestureend(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmsgesturehold(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturehold(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmsgesturehold(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturehold(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmsgesturetap(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturetap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmsgesturetap(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturetap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmsgesturedoubletap(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturedoubletap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmsgesturedoubletap(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturedoubletap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmsinertiastart(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsinertiastart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmsinertiastart(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsinertiastart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_msSetPointerCapture(IHTMLElement7* This,LONG pointerId) {
    return This->lpVtbl->msSetPointerCapture(This,pointerId);
}
static __WIDL_INLINE HRESULT IHTMLElement7_msReleasePointerCapture(IHTMLElement7* This,LONG pointerId) {
    return This->lpVtbl->msReleasePointerCapture(This,pointerId);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmstransitionstart(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmstransitionstart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmstransitionstart(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmstransitionstart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmstransitionend(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmstransitionend(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmstransitionend(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmstransitionend(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmsanimationstart(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsanimationstart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmsanimationstart(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsanimationstart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmsanimationend(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsanimationend(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmsanimationend(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsanimationend(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmsanimationiteration(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsanimationiteration(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmsanimationiteration(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsanimationiteration(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_oninvalid(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_oninvalid(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_oninvalid(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_oninvalid(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_xmsAcceleratorKey(IHTMLElement7* This,BSTR v) {
    return This->lpVtbl->put_xmsAcceleratorKey(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_xmsAcceleratorKey(IHTMLElement7* This,BSTR *p) {
    return This->lpVtbl->get_xmsAcceleratorKey(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_spellcheck(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_spellcheck(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_spellcheck(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_spellcheck(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_onmsmanipulationstatechanged(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_onmsmanipulationstatechanged(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElement7_get_onmsmanipulationstatechanged(IHTMLElement7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsmanipulationstatechanged(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElement7_put_oncuechange(IHTMLElement7* This,VARIANT v) {
    return This->lpVtbl->put_oncuechange(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElementAppliedStyles_QueryInterface(IHTMLElementAppliedStyles* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLElementAppliedStyles_AddRef(IHTMLElementAppliedStyles* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLElementAppliedStyles_Release(IHTMLElementAppliedStyles* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLElementAppliedStyles_GetTypeInfoCount(IHTMLElementAppliedStyles* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLElementAppliedStyles_GetTypeInfo(IHTMLElementAppliedStyles* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElementAppliedStyles_msGetRulesApplied(IHTMLElementAppliedStyles* This,IRulesAppliedCollection **ppRulesAppliedCollection) {
    return This->lpVtbl->msGetRulesApplied(This,ppRulesAppliedCollection);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementTraversal_QueryInterface(IElementTraversal* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementTraversal_AddRef(IElementTraversal* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementTraversal_Release(IElementTraversal* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IElementTraversal_GetTypeInfoCount(IElementTraversal* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IElementTraversal_GetTypeInfo(IElementTraversal* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementTraversal_get_firstElementChild(IElementTraversal* This,IHTMLElement **p) {
    return This->lpVtbl->get_firstElementChild(This,p);
}
static __WIDL_INLINE HRESULT IElementTraversal_get_lastElementChild(IElementTraversal* This,IHTMLElement **p) {
    return This->lpVtbl->get_lastElementChild(This,p);
}
static __WIDL_INLINE HRESULT IElementTraversal_get_previousElementSibling(IElementTraversal* This,IHTMLElement **p) {
    return This->lpVtbl->get_previousElementSibling(This,p);
}
static __WIDL_INLINE HRESULT IElementTraversal_get_nextElementSibling(IElementTraversal* This,IHTMLElement **p) {
    return This->lpVtbl->get_nextElementSibling(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDatabinding_QueryInterface(IHTMLDatabinding* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDatabinding_AddRef(IHTMLDatabinding* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDatabinding_Release(IHTMLDatabinding* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDatabinding_GetTypeInfoCount(IHTMLDatabinding* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDatabinding_GetTypeInfo(IHTMLDatabinding* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDatabinding_put_dataFld(IHTMLDatabinding* This,BSTR v) {
    return This->lpVtbl->put_dataFld(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDatabinding_get_dataFld(IHTMLDatabinding* This,BSTR *p) {
    return This->lpVtbl->get_dataFld(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDatabinding_put_dataSrc(IHTMLDatabinding* This,BSTR v) {
    return This->lpVtbl->put_dataSrc(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDatabinding_get_dataSrc(IHTMLDatabinding* This,BSTR *p) {
    return This->lpVtbl->get_dataSrc(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDatabinding_put_dataFormatAs(IHTMLDatabinding* This,BSTR v) {
    return This->lpVtbl->put_dataFormatAs(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElementDefaults_QueryInterface(IHTMLElementDefaults* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLElementDefaults_AddRef(IHTMLElementDefaults* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLElementDefaults_Release(IHTMLElementDefaults* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLElementDefaults_GetTypeInfoCount(IHTMLElementDefaults* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_GetTypeInfo(IHTMLElementDefaults* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElementDefaults_get_style(IHTMLElementDefaults* This,IHTMLStyle **p) {
    return This->lpVtbl->get_style(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_put_tabStop(IHTMLElementDefaults* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_tabStop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_get_tabStop(IHTMLElementDefaults* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_tabStop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_put_viewInheritStyle(IHTMLElementDefaults* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_viewInheritStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_get_viewInheritStyle(IHTMLElementDefaults* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_viewInheritStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_put_viewMasterTab(IHTMLElementDefaults* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_viewMasterTab(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_get_viewMasterTab(IHTMLElementDefaults* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_viewMasterTab(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_put_scrollSegmentX(IHTMLElementDefaults* This,LONG v) {
    return This->lpVtbl->put_scrollSegmentX(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_get_scrollSegmentX(IHTMLElementDefaults* This,LONG *p) {
    return This->lpVtbl->get_scrollSegmentX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_put_scrollSegmentY(IHTMLElementDefaults* This,LONG v) {
    return This->lpVtbl->put_scrollSegmentY(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_get_scrollSegmentY(IHTMLElementDefaults* This,LONG *p) {
    return This->lpVtbl->get_scrollSegmentY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_put_isMultiLine(IHTMLElementDefaults* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_isMultiLine(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_get_isMultiLine(IHTMLElementDefaults* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isMultiLine(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_put_contentEditable(IHTMLElementDefaults* This,BSTR v) {
    return This->lpVtbl->put_contentEditable(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_get_contentEditable(IHTMLElementDefaults* This,BSTR *p) {
    return This->lpVtbl->get_contentEditable(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_put_canHaveHTML(IHTMLElementDefaults* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_canHaveHTML(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_get_canHaveHTML(IHTMLElementDefaults* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_canHaveHTML(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_putref_viewLink(IHTMLElementDefaults* This,IHTMLDocument *v) {
    return This->lpVtbl->putref_viewLink(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_get_viewLink(IHTMLElementDefaults* This,IHTMLDocument **p) {
    return This->lpVtbl->get_viewLink(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElementDefaults_put_frozen(IHTMLElementDefaults* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frozen(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLDefaults_QueryInterface(DispHTMLDefaults* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLDefaults_AddRef(DispHTMLDefaults* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLDefaults_Release(DispHTMLDefaults* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLDefaults_GetTypeInfoCount(DispHTMLDefaults* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLDefaults_GetTypeInfo(DispHTMLDefaults* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTCDefaultDispatch_QueryInterface(IHTCDefaultDispatch* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTCDefaultDispatch_AddRef(IHTCDefaultDispatch* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTCDefaultDispatch_Release(IHTCDefaultDispatch* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTCDefaultDispatch_GetTypeInfoCount(IHTCDefaultDispatch* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTCDefaultDispatch_GetTypeInfo(IHTCDefaultDispatch* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTCDefaultDispatch_get_element(IHTCDefaultDispatch* This,IHTMLElement **p) {
    return This->lpVtbl->get_element(This,p);
}
static __WIDL_INLINE HRESULT IHTCDefaultDispatch_createEventObject(IHTCDefaultDispatch* This,IHTMLEventObj **eventObj) {
    return This->lpVtbl->createEventObject(This,eventObj);
}
static __WIDL_INLINE HRESULT IHTCDefaultDispatch_get_defaults(IHTCDefaultDispatch* This,IDispatch **p) {
    return This->lpVtbl->get_defaults(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTCPropertyBehavior_QueryInterface(IHTCPropertyBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTCPropertyBehavior_AddRef(IHTCPropertyBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTCPropertyBehavior_Release(IHTCPropertyBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTCPropertyBehavior_GetTypeInfoCount(IHTCPropertyBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTCPropertyBehavior_GetTypeInfo(IHTCPropertyBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTCPropertyBehavior_fireChange(IHTCPropertyBehavior* This) {
    return This->lpVtbl->fireChange(This);
}
static __WIDL_INLINE HRESULT IHTCPropertyBehavior_put_value(IHTCPropertyBehavior* This,VARIANT v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTCMethodBehavior_QueryInterface(IHTCMethodBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTCMethodBehavior_AddRef(IHTCMethodBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTCMethodBehavior_Release(IHTCMethodBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTCMethodBehavior_GetTypeInfoCount(IHTCMethodBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTCMethodBehavior_GetTypeInfo(IHTCMethodBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTCEventBehavior_QueryInterface(IHTCEventBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTCEventBehavior_AddRef(IHTCEventBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTCEventBehavior_Release(IHTCEventBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTCEventBehavior_GetTypeInfoCount(IHTCEventBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTCEventBehavior_GetTypeInfo(IHTCEventBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTCAttachBehavior_QueryInterface(IHTCAttachBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTCAttachBehavior_AddRef(IHTCAttachBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTCAttachBehavior_Release(IHTCAttachBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTCAttachBehavior_GetTypeInfoCount(IHTCAttachBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTCAttachBehavior_GetTypeInfo(IHTCAttachBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTCAttachBehavior_fireEvent(IHTCAttachBehavior* This,IDispatch *evt) {
    return This->lpVtbl->fireEvent(This,evt);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTCAttachBehavior2_QueryInterface(IHTCAttachBehavior2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTCAttachBehavior2_AddRef(IHTCAttachBehavior2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTCAttachBehavior2_Release(IHTCAttachBehavior2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTCAttachBehavior2_GetTypeInfoCount(IHTCAttachBehavior2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTCAttachBehavior2_GetTypeInfo(IHTCAttachBehavior2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTCDescBehavior_QueryInterface(IHTCDescBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTCDescBehavior_AddRef(IHTCDescBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTCDescBehavior_Release(IHTCDescBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTCDescBehavior_GetTypeInfoCount(IHTCDescBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTCDescBehavior_GetTypeInfo(IHTCDescBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTCDescBehavior_get_urn(IHTCDescBehavior* This,BSTR *p) {
    return This->lpVtbl->get_urn(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTCDefaultDispatch_QueryInterface(DispHTCDefaultDispatch* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTCDefaultDispatch_AddRef(DispHTCDefaultDispatch* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTCDefaultDispatch_Release(DispHTCDefaultDispatch* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTCDefaultDispatch_GetTypeInfoCount(DispHTCDefaultDispatch* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTCDefaultDispatch_GetTypeInfo(DispHTCDefaultDispatch* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTCPropertyBehavior_QueryInterface(DispHTCPropertyBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTCPropertyBehavior_AddRef(DispHTCPropertyBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTCPropertyBehavior_Release(DispHTCPropertyBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTCPropertyBehavior_GetTypeInfoCount(DispHTCPropertyBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTCPropertyBehavior_GetTypeInfo(DispHTCPropertyBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTCMethodBehavior_QueryInterface(DispHTCMethodBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTCMethodBehavior_AddRef(DispHTCMethodBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTCMethodBehavior_Release(DispHTCMethodBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTCMethodBehavior_GetTypeInfoCount(DispHTCMethodBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTCMethodBehavior_GetTypeInfo(DispHTCMethodBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTCEventBehavior_QueryInterface(DispHTCEventBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTCEventBehavior_AddRef(DispHTCEventBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTCEventBehavior_Release(DispHTCEventBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTCEventBehavior_GetTypeInfoCount(DispHTCEventBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTCEventBehavior_GetTypeInfo(DispHTCEventBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTCAttachBehavior_QueryInterface(DispHTCAttachBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTCAttachBehavior_AddRef(DispHTCAttachBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTCAttachBehavior_Release(DispHTCAttachBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTCAttachBehavior_GetTypeInfoCount(DispHTCAttachBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTCAttachBehavior_GetTypeInfo(DispHTCAttachBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTCDescBehavior_QueryInterface(DispHTCDescBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTCDescBehavior_AddRef(DispHTCDescBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTCDescBehavior_Release(DispHTCDescBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTCDescBehavior_GetTypeInfoCount(DispHTCDescBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTCDescBehavior_GetTypeInfo(DispHTCDescBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLUrnCollection_QueryInterface(IHTMLUrnCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLUrnCollection_AddRef(IHTMLUrnCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLUrnCollection_Release(IHTMLUrnCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLUrnCollection_GetTypeInfoCount(IHTMLUrnCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLUrnCollection_GetTypeInfo(IHTMLUrnCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLUrnCollection_get_length(IHTMLUrnCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLUrnCollection_QueryInterface(DispHTMLUrnCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLUrnCollection_AddRef(DispHTMLUrnCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLUrnCollection_Release(DispHTMLUrnCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLUrnCollection_GetTypeInfoCount(DispHTMLUrnCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLUrnCollection_GetTypeInfo(DispHTMLUrnCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLGenericElement_QueryInterface(IHTMLGenericElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLGenericElement_AddRef(IHTMLGenericElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLGenericElement_Release(IHTMLGenericElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLGenericElement_GetTypeInfoCount(IHTMLGenericElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLGenericElement_GetTypeInfo(IHTMLGenericElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLGenericElement_get_recordset(IHTMLGenericElement* This,IDispatch **p) {
    return This->lpVtbl->get_recordset(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLGenericElement_QueryInterface(DispHTMLGenericElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLGenericElement_AddRef(DispHTMLGenericElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLGenericElement_Release(DispHTMLGenericElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLGenericElement_GetTypeInfoCount(DispHTMLGenericElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLGenericElement_GetTypeInfo(DispHTMLGenericElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetRule_QueryInterface(IHTMLStyleSheetRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetRule_AddRef(IHTMLStyleSheetRule* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetRule_Release(IHTMLStyleSheetRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheetRule_GetTypeInfoCount(IHTMLStyleSheetRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetRule_GetTypeInfo(IHTMLStyleSheetRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetRule_put_selectorText(IHTMLStyleSheetRule* This,BSTR v) {
    return This->lpVtbl->put_selectorText(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetRule_get_selectorText(IHTMLStyleSheetRule* This,BSTR *p) {
    return This->lpVtbl->get_selectorText(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetRule_get_style(IHTMLStyleSheetRule* This,IHTMLRuleStyle **p) {
    return This->lpVtbl->get_style(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetRuleApplied_QueryInterface(IHTMLStyleSheetRuleApplied* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetRuleApplied_AddRef(IHTMLStyleSheetRuleApplied* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetRuleApplied_Release(IHTMLStyleSheetRuleApplied* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheetRuleApplied_GetTypeInfoCount(IHTMLStyleSheetRuleApplied* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetRuleApplied_GetTypeInfo(IHTMLStyleSheetRuleApplied* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetRuleApplied_get_msSpecificity(IHTMLStyleSheetRuleApplied* This,LONG *p) {
    return This->lpVtbl->get_msSpecificity(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetRule2_QueryInterface(IHTMLStyleSheetRule2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetRule2_AddRef(IHTMLStyleSheetRule2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetRule2_Release(IHTMLStyleSheetRule2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheetRule2_GetTypeInfoCount(IHTMLStyleSheetRule2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetRule2_GetTypeInfo(IHTMLStyleSheetRule2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetRule2_put_selectorText(IHTMLStyleSheetRule2* This,BSTR v) {
    return This->lpVtbl->put_selectorText(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetRulesCollection_QueryInterface(IHTMLStyleSheetRulesCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetRulesCollection_AddRef(IHTMLStyleSheetRulesCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetRulesCollection_Release(IHTMLStyleSheetRulesCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheetRulesCollection_GetTypeInfoCount(IHTMLStyleSheetRulesCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetRulesCollection_GetTypeInfo(IHTMLStyleSheetRulesCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetRulesCollection_get_length(IHTMLStyleSheetRulesCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetRulesCollection2_QueryInterface(IHTMLStyleSheetRulesCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetRulesCollection2_AddRef(IHTMLStyleSheetRulesCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetRulesCollection2_Release(IHTMLStyleSheetRulesCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheetRulesCollection2_GetTypeInfoCount(IHTMLStyleSheetRulesCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetRulesCollection2_GetTypeInfo(IHTMLStyleSheetRulesCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetRulesCollection2_get_length(IHTMLStyleSheetRulesCollection2* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLStyleSheetRule_QueryInterface(DispHTMLStyleSheetRule* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLStyleSheetRule_AddRef(DispHTMLStyleSheetRule* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLStyleSheetRule_Release(DispHTMLStyleSheetRule* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLStyleSheetRule_GetTypeInfoCount(DispHTMLStyleSheetRule* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLStyleSheetRule_GetTypeInfo(DispHTMLStyleSheetRule* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLStyleSheetRulesCollection_QueryInterface(DispHTMLStyleSheetRulesCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLStyleSheetRulesCollection_AddRef(DispHTMLStyleSheetRulesCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLStyleSheetRulesCollection_Release(DispHTMLStyleSheetRulesCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLStyleSheetRulesCollection_GetTypeInfoCount(DispHTMLStyleSheetRulesCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLStyleSheetRulesCollection_GetTypeInfo(DispHTMLStyleSheetRulesCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetPage_QueryInterface(IHTMLStyleSheetPage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetPage_AddRef(IHTMLStyleSheetPage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetPage_Release(IHTMLStyleSheetPage* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheetPage_GetTypeInfoCount(IHTMLStyleSheetPage* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetPage_GetTypeInfo(IHTMLStyleSheetPage* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetPage_get_selector(IHTMLStyleSheetPage* This,BSTR *p) {
    return This->lpVtbl->get_selector(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetPage2_QueryInterface(IHTMLStyleSheetPage2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetPage2_AddRef(IHTMLStyleSheetPage2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetPage2_Release(IHTMLStyleSheetPage2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheetPage2_GetTypeInfoCount(IHTMLStyleSheetPage2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetPage2_GetTypeInfo(IHTMLStyleSheetPage2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetPage2_put_selectorText(IHTMLStyleSheetPage2* This,BSTR v) {
    return This->lpVtbl->put_selectorText(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetPage2_get_selectorText(IHTMLStyleSheetPage2* This,BSTR *p) {
    return This->lpVtbl->get_selectorText(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetPagesCollection_QueryInterface(IHTMLStyleSheetPagesCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetPagesCollection_AddRef(IHTMLStyleSheetPagesCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetPagesCollection_Release(IHTMLStyleSheetPagesCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheetPagesCollection_GetTypeInfoCount(IHTMLStyleSheetPagesCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetPagesCollection_GetTypeInfo(IHTMLStyleSheetPagesCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetPagesCollection_get_length(IHTMLStyleSheetPagesCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLStyleSheetPage_QueryInterface(DispHTMLStyleSheetPage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLStyleSheetPage_AddRef(DispHTMLStyleSheetPage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLStyleSheetPage_Release(DispHTMLStyleSheetPage* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLStyleSheetPage_GetTypeInfoCount(DispHTMLStyleSheetPage* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLStyleSheetPage_GetTypeInfo(DispHTMLStyleSheetPage* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLStyleSheetPagesCollection_QueryInterface(DispHTMLStyleSheetPagesCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLStyleSheetPagesCollection_AddRef(DispHTMLStyleSheetPagesCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLStyleSheetPagesCollection_Release(DispHTMLStyleSheetPagesCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLStyleSheetPagesCollection_GetTypeInfoCount(DispHTMLStyleSheetPagesCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLStyleSheetPagesCollection_GetTypeInfo(DispHTMLStyleSheetPagesCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheet_QueryInterface(IHTMLStyleSheet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheet_AddRef(IHTMLStyleSheet* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheet_Release(IHTMLStyleSheet* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheet_GetTypeInfoCount(IHTMLStyleSheet* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_GetTypeInfo(IHTMLStyleSheet* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheet_put_title(IHTMLStyleSheet* This,BSTR v) {
    return This->lpVtbl->put_title(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_get_title(IHTMLStyleSheet* This,BSTR *p) {
    return This->lpVtbl->get_title(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_get_parentStyleSheet(IHTMLStyleSheet* This,IHTMLStyleSheet **p) {
    return This->lpVtbl->get_parentStyleSheet(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_get_owningElement(IHTMLStyleSheet* This,IHTMLElement **p) {
    return This->lpVtbl->get_owningElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_put_disabled(IHTMLStyleSheet* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_get_disabled(IHTMLStyleSheet* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_get_readOnly(IHTMLStyleSheet* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_readOnly(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_get_imports(IHTMLStyleSheet* This,IHTMLStyleSheetsCollection **p) {
    return This->lpVtbl->get_imports(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_put_href(IHTMLStyleSheet* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_get_href(IHTMLStyleSheet* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_get_type(IHTMLStyleSheet* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_get_id(IHTMLStyleSheet* This,BSTR *p) {
    return This->lpVtbl->get_id(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_addImport(IHTMLStyleSheet* This,BSTR bstrURL,LONG lIndex,LONG *plIndex) {
    return This->lpVtbl->addImport(This,bstrURL,lIndex,plIndex);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_addRule(IHTMLStyleSheet* This,BSTR bstrSelector,BSTR bstrStyle,LONG lIndex,LONG *plNewIndex) {
    return This->lpVtbl->addRule(This,bstrSelector,bstrStyle,lIndex,plNewIndex);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_removeImport(IHTMLStyleSheet* This,LONG lIndex) {
    return This->lpVtbl->removeImport(This,lIndex);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_removeRule(IHTMLStyleSheet* This,LONG lIndex) {
    return This->lpVtbl->removeRule(This,lIndex);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_put_media(IHTMLStyleSheet* This,BSTR v) {
    return This->lpVtbl->put_media(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_get_media(IHTMLStyleSheet* This,BSTR *p) {
    return This->lpVtbl->get_media(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_put_cssText(IHTMLStyleSheet* This,BSTR v) {
    return This->lpVtbl->put_cssText(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet_get_cssText(IHTMLStyleSheet* This,BSTR *p) {
    return This->lpVtbl->get_cssText(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheet2_QueryInterface(IHTMLStyleSheet2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheet2_AddRef(IHTMLStyleSheet2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheet2_Release(IHTMLStyleSheet2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheet2_GetTypeInfoCount(IHTMLStyleSheet2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet2_GetTypeInfo(IHTMLStyleSheet2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheet2_get_pages(IHTMLStyleSheet2* This,IHTMLStyleSheetPagesCollection **p) {
    return This->lpVtbl->get_pages(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheet3_QueryInterface(IHTMLStyleSheet3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheet3_AddRef(IHTMLStyleSheet3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheet3_Release(IHTMLStyleSheet3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheet3_GetTypeInfoCount(IHTMLStyleSheet3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet3_GetTypeInfo(IHTMLStyleSheet3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheet3_put_href(IHTMLStyleSheet3* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet3_get_href(IHTMLStyleSheet3* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet3_get_isAlternate(IHTMLStyleSheet3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isAlternate(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheet4_QueryInterface(IHTMLStyleSheet4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheet4_AddRef(IHTMLStyleSheet4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheet4_Release(IHTMLStyleSheet4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheet4_GetTypeInfoCount(IHTMLStyleSheet4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet4_GetTypeInfo(IHTMLStyleSheet4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheet4_get_type(IHTMLStyleSheet4* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet4_get_href(IHTMLStyleSheet4* This,VARIANT *p) {
    return This->lpVtbl->get_href(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet4_get_title(IHTMLStyleSheet4* This,BSTR *p) {
    return This->lpVtbl->get_title(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet4_get_ownerNode(IHTMLStyleSheet4* This,IHTMLElement **p) {
    return This->lpVtbl->get_ownerNode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet4_get_ownerRule(IHTMLStyleSheet4* This,IHTMLCSSRule **p) {
    return This->lpVtbl->get_ownerRule(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet4_get_cssRules(IHTMLStyleSheet4* This,IHTMLStyleSheetRulesCollection **p) {
    return This->lpVtbl->get_cssRules(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet4_get_media(IHTMLStyleSheet4* This,VARIANT *p) {
    return This->lpVtbl->get_media(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheet4_insertRule(IHTMLStyleSheet4* This,BSTR bstrRule,LONG lIndex,LONG *plNewIndex) {
    return This->lpVtbl->insertRule(This,bstrRule,lIndex,plNewIndex);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLStyleSheet_QueryInterface(DispHTMLStyleSheet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLStyleSheet_AddRef(DispHTMLStyleSheet* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLStyleSheet_Release(DispHTMLStyleSheet* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLStyleSheet_GetTypeInfoCount(DispHTMLStyleSheet* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLStyleSheet_GetTypeInfo(DispHTMLStyleSheet* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetsCollection_QueryInterface(IHTMLStyleSheetsCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetsCollection_AddRef(IHTMLStyleSheetsCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetsCollection_Release(IHTMLStyleSheetsCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheetsCollection_GetTypeInfoCount(IHTMLStyleSheetsCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetsCollection_GetTypeInfo(IHTMLStyleSheetsCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetsCollection_get_length(IHTMLStyleSheetsCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetsCollection_get__newEnum(IHTMLStyleSheetsCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetsCollection2_QueryInterface(IHTMLStyleSheetsCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetsCollection2_AddRef(IHTMLStyleSheetsCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetsCollection2_Release(IHTMLStyleSheetsCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheetsCollection2_GetTypeInfoCount(IHTMLStyleSheetsCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetsCollection2_GetTypeInfo(IHTMLStyleSheetsCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLStyleSheetsCollection_QueryInterface(DispHTMLStyleSheetsCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLStyleSheetsCollection_AddRef(DispHTMLStyleSheetsCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLStyleSheetsCollection_Release(DispHTMLStyleSheetsCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLStyleSheetsCollection_GetTypeInfoCount(DispHTMLStyleSheetsCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLStyleSheetsCollection_GetTypeInfo(DispHTMLStyleSheetsCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLLinkElementEvents2_QueryInterface(HTMLLinkElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLLinkElementEvents2_AddRef(HTMLLinkElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLLinkElementEvents2_Release(HTMLLinkElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLLinkElementEvents2_GetTypeInfoCount(HTMLLinkElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLLinkElementEvents2_GetTypeInfo(HTMLLinkElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLLinkElementEvents_QueryInterface(HTMLLinkElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLLinkElementEvents_AddRef(HTMLLinkElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLLinkElementEvents_Release(HTMLLinkElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLLinkElementEvents_GetTypeInfoCount(HTMLLinkElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLLinkElementEvents_GetTypeInfo(HTMLLinkElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLinkElement_QueryInterface(IHTMLLinkElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLLinkElement_AddRef(IHTMLLinkElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLLinkElement_Release(IHTMLLinkElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLLinkElement_GetTypeInfoCount(IHTMLLinkElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_GetTypeInfo(IHTMLLinkElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLinkElement_put_href(IHTMLLinkElement* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_get_href(IHTMLLinkElement* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_put_rel(IHTMLLinkElement* This,BSTR v) {
    return This->lpVtbl->put_rel(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_get_rel(IHTMLLinkElement* This,BSTR *p) {
    return This->lpVtbl->get_rel(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_put_rev(IHTMLLinkElement* This,BSTR v) {
    return This->lpVtbl->put_rev(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_get_rev(IHTMLLinkElement* This,BSTR *p) {
    return This->lpVtbl->get_rev(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_put_type(IHTMLLinkElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_get_type(IHTMLLinkElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_get_readyState(IHTMLLinkElement* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_put_onreadystatechange(IHTMLLinkElement* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_get_onreadystatechange(IHTMLLinkElement* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_put_onload(IHTMLLinkElement* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_get_onload(IHTMLLinkElement* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_put_onerror(IHTMLLinkElement* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_get_onerror(IHTMLLinkElement* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_get_styleSheet(IHTMLLinkElement* This,IHTMLStyleSheet **p) {
    return This->lpVtbl->get_styleSheet(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_put_disabled(IHTMLLinkElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_get_disabled(IHTMLLinkElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement_put_media(IHTMLLinkElement* This,BSTR v) {
    return This->lpVtbl->put_media(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLinkElement2_QueryInterface(IHTMLLinkElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLLinkElement2_AddRef(IHTMLLinkElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLLinkElement2_Release(IHTMLLinkElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLLinkElement2_GetTypeInfoCount(IHTMLLinkElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement2_GetTypeInfo(IHTMLLinkElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLinkElement2_put_target(IHTMLLinkElement2* This,BSTR v) {
    return This->lpVtbl->put_target(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLinkElement3_QueryInterface(IHTMLLinkElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLLinkElement3_AddRef(IHTMLLinkElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLLinkElement3_Release(IHTMLLinkElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLLinkElement3_GetTypeInfoCount(IHTMLLinkElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement3_GetTypeInfo(IHTMLLinkElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLinkElement3_put_charset(IHTMLLinkElement3* This,BSTR v) {
    return This->lpVtbl->put_charset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement3_get_charset(IHTMLLinkElement3* This,BSTR *p) {
    return This->lpVtbl->get_charset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement3_put_hreflang(IHTMLLinkElement3* This,BSTR v) {
    return This->lpVtbl->put_hreflang(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLinkElement4_QueryInterface(IHTMLLinkElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLLinkElement4_AddRef(IHTMLLinkElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLLinkElement4_Release(IHTMLLinkElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLLinkElement4_GetTypeInfoCount(IHTMLLinkElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement4_GetTypeInfo(IHTMLLinkElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLinkElement4_put_href(IHTMLLinkElement4* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLinkElement5_QueryInterface(IHTMLLinkElement5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLLinkElement5_AddRef(IHTMLLinkElement5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLLinkElement5_Release(IHTMLLinkElement5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLLinkElement5_GetTypeInfoCount(IHTMLLinkElement5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLLinkElement5_GetTypeInfo(IHTMLLinkElement5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLLinkElement_QueryInterface(DispHTMLLinkElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLLinkElement_AddRef(DispHTMLLinkElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLLinkElement_Release(DispHTMLLinkElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLLinkElement_GetTypeInfoCount(DispHTMLLinkElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLLinkElement_GetTypeInfo(DispHTMLLinkElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTxtRange_QueryInterface(IHTMLTxtRange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTxtRange_AddRef(IHTMLTxtRange* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTxtRange_Release(IHTMLTxtRange* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTxtRange_GetTypeInfoCount(IHTMLTxtRange* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_GetTypeInfo(IHTMLTxtRange* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTxtRange_get_htmlText(IHTMLTxtRange* This,BSTR *p) {
    return This->lpVtbl->get_htmlText(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_put_text(IHTMLTxtRange* This,BSTR v) {
    return This->lpVtbl->put_text(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_get_text(IHTMLTxtRange* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_parentElement(IHTMLTxtRange* This,IHTMLElement **parent) {
    return This->lpVtbl->parentElement(This,parent);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_duplicate(IHTMLTxtRange* This,IHTMLTxtRange **Duplicate) {
    return This->lpVtbl->duplicate(This,Duplicate);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_inRange(IHTMLTxtRange* This,IHTMLTxtRange *Range,VARIANT_BOOL *InRange) {
    return This->lpVtbl->inRange(This,Range,InRange);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_isEqual(IHTMLTxtRange* This,IHTMLTxtRange *Range,VARIANT_BOOL *IsEqual) {
    return This->lpVtbl->isEqual(This,Range,IsEqual);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_scrollIntoView(IHTMLTxtRange* This,VARIANT_BOOL fStart) {
    return This->lpVtbl->scrollIntoView(This,fStart);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_collapse(IHTMLTxtRange* This,VARIANT_BOOL Start) {
    return This->lpVtbl->collapse(This,Start);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_expand(IHTMLTxtRange* This,BSTR Unit,VARIANT_BOOL *Success) {
    return This->lpVtbl->expand(This,Unit,Success);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_move(IHTMLTxtRange* This,BSTR Unit,LONG Count,LONG *ActualCount) {
    return This->lpVtbl->move(This,Unit,Count,ActualCount);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_moveStart(IHTMLTxtRange* This,BSTR Unit,LONG Count,LONG *ActualCount) {
    return This->lpVtbl->moveStart(This,Unit,Count,ActualCount);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_moveEnd(IHTMLTxtRange* This,BSTR Unit,LONG Count,LONG *ActualCount) {
    return This->lpVtbl->moveEnd(This,Unit,Count,ActualCount);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_select(IHTMLTxtRange* This) {
    return This->lpVtbl->select(This);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_pasteHTML(IHTMLTxtRange* This,BSTR html) {
    return This->lpVtbl->pasteHTML(This,html);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_moveToElementText(IHTMLTxtRange* This,IHTMLElement *element) {
    return This->lpVtbl->moveToElementText(This,element);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_setEndPoint(IHTMLTxtRange* This,BSTR how,IHTMLTxtRange *SourceRange) {
    return This->lpVtbl->setEndPoint(This,how,SourceRange);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_compareEndPoints(IHTMLTxtRange* This,BSTR how,IHTMLTxtRange *SourceRange,LONG *ret) {
    return This->lpVtbl->compareEndPoints(This,how,SourceRange,ret);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_findText(IHTMLTxtRange* This,BSTR String,LONG count,LONG Flags,VARIANT_BOOL *Success) {
    return This->lpVtbl->findText(This,String,count,Flags,Success);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_moveToPoint(IHTMLTxtRange* This,LONG x,LONG y) {
    return This->lpVtbl->moveToPoint(This,x,y);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_getBookmark(IHTMLTxtRange* This,BSTR *Boolmark) {
    return This->lpVtbl->getBookmark(This,Boolmark);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_moveToBookmark(IHTMLTxtRange* This,BSTR Bookmark,VARIANT_BOOL *Success) {
    return This->lpVtbl->moveToBookmark(This,Bookmark,Success);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_queryCommandSupported(IHTMLTxtRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandSupported(This,cmdID,pfRet);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_queryCommandEnabled(IHTMLTxtRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandEnabled(This,cmdID,pfRet);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_queryCommandState(IHTMLTxtRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandState(This,cmdID,pfRet);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_queryCommandIndeterm(IHTMLTxtRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandIndeterm(This,cmdID,pfRet);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_queryCommandText(IHTMLTxtRange* This,BSTR cmdID,BSTR *pcmdText) {
    return This->lpVtbl->queryCommandText(This,cmdID,pcmdText);
}
static __WIDL_INLINE HRESULT IHTMLTxtRange_queryCommandValue(IHTMLTxtRange* This,BSTR cmdID,VARIANT *pcmdValue) {
    return This->lpVtbl->queryCommandValue(This,cmdID,pcmdValue);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTextRangeMetrics_QueryInterface(IHTMLTextRangeMetrics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTextRangeMetrics_AddRef(IHTMLTextRangeMetrics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTextRangeMetrics_Release(IHTMLTextRangeMetrics* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTextRangeMetrics_GetTypeInfoCount(IHTMLTextRangeMetrics* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTextRangeMetrics_GetTypeInfo(IHTMLTextRangeMetrics* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTextRangeMetrics_get_offsetTop(IHTMLTextRangeMetrics* This,LONG *p) {
    return This->lpVtbl->get_offsetTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextRangeMetrics_get_offsetLeft(IHTMLTextRangeMetrics* This,LONG *p) {
    return This->lpVtbl->get_offsetLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextRangeMetrics_get_boundingTop(IHTMLTextRangeMetrics* This,LONG *p) {
    return This->lpVtbl->get_boundingTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextRangeMetrics_get_boundingLeft(IHTMLTextRangeMetrics* This,LONG *p) {
    return This->lpVtbl->get_boundingLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextRangeMetrics_get_boundingWidth(IHTMLTextRangeMetrics* This,LONG *p) {
    return This->lpVtbl->get_boundingWidth(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTextRangeMetrics2_QueryInterface(IHTMLTextRangeMetrics2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTextRangeMetrics2_AddRef(IHTMLTextRangeMetrics2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTextRangeMetrics2_Release(IHTMLTextRangeMetrics2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTextRangeMetrics2_GetTypeInfoCount(IHTMLTextRangeMetrics2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTextRangeMetrics2_GetTypeInfo(IHTMLTextRangeMetrics2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTextRangeMetrics2_getClientRects(IHTMLTextRangeMetrics2* This,IHTMLRectCollection **pRectCol) {
    return This->lpVtbl->getClientRects(This,pRectCol);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTxtRangeCollection_QueryInterface(IHTMLTxtRangeCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTxtRangeCollection_AddRef(IHTMLTxtRangeCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTxtRangeCollection_Release(IHTMLTxtRangeCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTxtRangeCollection_GetTypeInfoCount(IHTMLTxtRangeCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTxtRangeCollection_GetTypeInfo(IHTMLTxtRangeCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTxtRangeCollection_get_length(IHTMLTxtRangeCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTxtRangeCollection_get__newEnum(IHTMLTxtRangeCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMRange_QueryInterface(IHTMLDOMRange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMRange_AddRef(IHTMLDOMRange* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMRange_Release(IHTMLDOMRange* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMRange_GetTypeInfoCount(IHTMLDOMRange* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_GetTypeInfo(IHTMLDOMRange* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMRange_get_startContainer(IHTMLDOMRange* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_startContainer(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_get_startOffset(IHTMLDOMRange* This,LONG *p) {
    return This->lpVtbl->get_startOffset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_get_endContainer(IHTMLDOMRange* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_endContainer(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_get_endOffset(IHTMLDOMRange* This,LONG *p) {
    return This->lpVtbl->get_endOffset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_get_collapsed(IHTMLDOMRange* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_collapsed(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_get_commonAncestorContainer(IHTMLDOMRange* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_commonAncestorContainer(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_setStart(IHTMLDOMRange* This,IDispatch *refNode,LONG offset) {
    return This->lpVtbl->setStart(This,refNode,offset);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_setEnd(IHTMLDOMRange* This,IDispatch *refNode,LONG offset) {
    return This->lpVtbl->setEnd(This,refNode,offset);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_setStartBefore(IHTMLDOMRange* This,IDispatch *refNode) {
    return This->lpVtbl->setStartBefore(This,refNode);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_setStartAfter(IHTMLDOMRange* This,IDispatch *refNode) {
    return This->lpVtbl->setStartAfter(This,refNode);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_setEndBefore(IHTMLDOMRange* This,IDispatch *refNode) {
    return This->lpVtbl->setEndBefore(This,refNode);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_setEndAfter(IHTMLDOMRange* This,IDispatch *refNode) {
    return This->lpVtbl->setEndAfter(This,refNode);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_collapse(IHTMLDOMRange* This,VARIANT_BOOL toStart) {
    return This->lpVtbl->collapse(This,toStart);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_selectNode(IHTMLDOMRange* This,IDispatch *refNode) {
    return This->lpVtbl->selectNode(This,refNode);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_selectNodeContents(IHTMLDOMRange* This,IDispatch *refNode) {
    return This->lpVtbl->selectNodeContents(This,refNode);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_compareBoundaryPoints(IHTMLDOMRange* This,short how,IDispatch *sourceRange,LONG *compareResult) {
    return This->lpVtbl->compareBoundaryPoints(This,how,sourceRange,compareResult);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_deleteContents(IHTMLDOMRange* This) {
    return This->lpVtbl->deleteContents(This);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_extractContents(IHTMLDOMRange* This,IDispatch **ppDocumentFragment) {
    return This->lpVtbl->extractContents(This,ppDocumentFragment);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_cloneContents(IHTMLDOMRange* This,IDispatch **ppDocumentFragment) {
    return This->lpVtbl->cloneContents(This,ppDocumentFragment);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_insertNode(IHTMLDOMRange* This,IDispatch *newNode) {
    return This->lpVtbl->insertNode(This,newNode);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_surroundContents(IHTMLDOMRange* This,IDispatch *newParent) {
    return This->lpVtbl->surroundContents(This,newParent);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_cloneRange(IHTMLDOMRange* This,IHTMLDOMRange **ppClonedRange) {
    return This->lpVtbl->cloneRange(This,ppClonedRange);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_toString(IHTMLDOMRange* This,BSTR *pRangeString) {
    return This->lpVtbl->toString(This,pRangeString);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_detach(IHTMLDOMRange* This) {
    return This->lpVtbl->detach(This);
}
static __WIDL_INLINE HRESULT IHTMLDOMRange_getClientRects(IHTMLDOMRange* This,IHTMLRectCollection **ppRectCol) {
    return This->lpVtbl->getClientRects(This,ppRectCol);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLDOMRange_QueryInterface(DispHTMLDOMRange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLDOMRange_AddRef(DispHTMLDOMRange* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLDOMRange_Release(DispHTMLDOMRange* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLDOMRange_GetTypeInfoCount(DispHTMLDOMRange* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLDOMRange_GetTypeInfo(DispHTMLDOMRange* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLFormElementEvents2_QueryInterface(HTMLFormElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLFormElementEvents2_AddRef(HTMLFormElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLFormElementEvents2_Release(HTMLFormElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLFormElementEvents2_GetTypeInfoCount(HTMLFormElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLFormElementEvents2_GetTypeInfo(HTMLFormElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLFormElementEvents_QueryInterface(HTMLFormElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLFormElementEvents_AddRef(HTMLFormElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLFormElementEvents_Release(HTMLFormElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLFormElementEvents_GetTypeInfoCount(HTMLFormElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLFormElementEvents_GetTypeInfo(HTMLFormElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFormElement_QueryInterface(IHTMLFormElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFormElement_AddRef(IHTMLFormElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFormElement_Release(IHTMLFormElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFormElement_GetTypeInfoCount(IHTMLFormElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_GetTypeInfo(IHTMLFormElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFormElement_put_action(IHTMLFormElement* This,BSTR v) {
    return This->lpVtbl->put_action(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_get_action(IHTMLFormElement* This,BSTR *p) {
    return This->lpVtbl->get_action(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_put_dir(IHTMLFormElement* This,BSTR v) {
    return This->lpVtbl->put_dir(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_get_dir(IHTMLFormElement* This,BSTR *p) {
    return This->lpVtbl->get_dir(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_put_encoding(IHTMLFormElement* This,BSTR v) {
    return This->lpVtbl->put_encoding(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_get_encoding(IHTMLFormElement* This,BSTR *p) {
    return This->lpVtbl->get_encoding(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_put_method(IHTMLFormElement* This,BSTR v) {
    return This->lpVtbl->put_method(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_get_method(IHTMLFormElement* This,BSTR *p) {
    return This->lpVtbl->get_method(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_get_elements(IHTMLFormElement* This,IDispatch **p) {
    return This->lpVtbl->get_elements(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_put_target(IHTMLFormElement* This,BSTR v) {
    return This->lpVtbl->put_target(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_get_target(IHTMLFormElement* This,BSTR *p) {
    return This->lpVtbl->get_target(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_put_name(IHTMLFormElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_get_name(IHTMLFormElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_put_onsubmit(IHTMLFormElement* This,VARIANT v) {
    return This->lpVtbl->put_onsubmit(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_get_onsubmit(IHTMLFormElement* This,VARIANT *p) {
    return This->lpVtbl->get_onsubmit(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_put_onreset(IHTMLFormElement* This,VARIANT v) {
    return This->lpVtbl->put_onreset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_get_onreset(IHTMLFormElement* This,VARIANT *p) {
    return This->lpVtbl->get_onreset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_submit(IHTMLFormElement* This) {
    return This->lpVtbl->submit(This);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_reset(IHTMLFormElement* This) {
    return This->lpVtbl->reset(This);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_put_length(IHTMLFormElement* This,LONG v) {
    return This->lpVtbl->put_length(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_get_length(IHTMLFormElement* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_get__newEnum(IHTMLFormElement* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFormElement_item(IHTMLFormElement* This,VARIANT name,VARIANT index,IDispatch **pdisp) {
    return This->lpVtbl->item(This,name,index,pdisp);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFormElement2_QueryInterface(IHTMLFormElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFormElement2_AddRef(IHTMLFormElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFormElement2_Release(IHTMLFormElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFormElement2_GetTypeInfoCount(IHTMLFormElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFormElement2_GetTypeInfo(IHTMLFormElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFormElement2_put_acceptCharset(IHTMLFormElement2* This,BSTR v) {
    return This->lpVtbl->put_acceptCharset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFormElement2_get_acceptCharset(IHTMLFormElement2* This,BSTR *p) {
    return This->lpVtbl->get_acceptCharset(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFormElement3_QueryInterface(IHTMLFormElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFormElement3_AddRef(IHTMLFormElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFormElement3_Release(IHTMLFormElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFormElement3_GetTypeInfoCount(IHTMLFormElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFormElement3_GetTypeInfo(IHTMLFormElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSubmitData_QueryInterface(IHTMLSubmitData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLSubmitData_AddRef(IHTMLSubmitData* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLSubmitData_Release(IHTMLSubmitData* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLSubmitData_GetTypeInfoCount(IHTMLSubmitData* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLSubmitData_GetTypeInfo(IHTMLSubmitData* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSubmitData_appendNameValuePair(IHTMLSubmitData* This,BSTR name,BSTR value) {
    return This->lpVtbl->appendNameValuePair(This,name,value);
}
static __WIDL_INLINE HRESULT IHTMLSubmitData_appendNameFilePair(IHTMLSubmitData* This,BSTR name,BSTR filename) {
    return This->lpVtbl->appendNameFilePair(This,name,filename);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFormElement4_QueryInterface(IHTMLFormElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFormElement4_AddRef(IHTMLFormElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFormElement4_Release(IHTMLFormElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFormElement4_GetTypeInfoCount(IHTMLFormElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFormElement4_GetTypeInfo(IHTMLFormElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFormElement4_put_action(IHTMLFormElement4* This,BSTR v) {
    return This->lpVtbl->put_action(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLFormElement_QueryInterface(DispHTMLFormElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLFormElement_AddRef(DispHTMLFormElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLFormElement_Release(DispHTMLFormElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLFormElement_GetTypeInfoCount(DispHTMLFormElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLFormElement_GetTypeInfo(DispHTMLFormElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLControlElementEvents2_QueryInterface(HTMLControlElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLControlElementEvents2_AddRef(HTMLControlElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLControlElementEvents2_Release(HTMLControlElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLControlElementEvents2_GetTypeInfoCount(HTMLControlElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLControlElementEvents2_GetTypeInfo(HTMLControlElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLControlElementEvents_QueryInterface(HTMLControlElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLControlElementEvents_AddRef(HTMLControlElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLControlElementEvents_Release(HTMLControlElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLControlElementEvents_GetTypeInfoCount(HTMLControlElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLControlElementEvents_GetTypeInfo(HTMLControlElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLControlElement_QueryInterface(IHTMLControlElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLControlElement_AddRef(IHTMLControlElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLControlElement_Release(IHTMLControlElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLControlElement_GetTypeInfoCount(IHTMLControlElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_GetTypeInfo(IHTMLControlElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLControlElement_put_tabIndex(IHTMLControlElement* This,short v) {
    return This->lpVtbl->put_tabIndex(This,v);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_get_tabIndex(IHTMLControlElement* This,short *p) {
    return This->lpVtbl->get_tabIndex(This,p);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_focus(IHTMLControlElement* This) {
    return This->lpVtbl->focus(This);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_put_accessKey(IHTMLControlElement* This,BSTR v) {
    return This->lpVtbl->put_accessKey(This,v);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_get_accessKey(IHTMLControlElement* This,BSTR *p) {
    return This->lpVtbl->get_accessKey(This,p);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_put_onblur(IHTMLControlElement* This,VARIANT v) {
    return This->lpVtbl->put_onblur(This,v);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_get_onblur(IHTMLControlElement* This,VARIANT *p) {
    return This->lpVtbl->get_onblur(This,p);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_put_onfocus(IHTMLControlElement* This,VARIANT v) {
    return This->lpVtbl->put_onfocus(This,v);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_get_onfocus(IHTMLControlElement* This,VARIANT *p) {
    return This->lpVtbl->get_onfocus(This,p);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_put_onresize(IHTMLControlElement* This,VARIANT v) {
    return This->lpVtbl->put_onresize(This,v);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_get_onresize(IHTMLControlElement* This,VARIANT *p) {
    return This->lpVtbl->get_onresize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_blur(IHTMLControlElement* This) {
    return This->lpVtbl->blur(This);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_addFilter(IHTMLControlElement* This,IUnknown *pUnk) {
    return This->lpVtbl->addFilter(This,pUnk);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_removeFilter(IHTMLControlElement* This,IUnknown *pUnk) {
    return This->lpVtbl->removeFilter(This,pUnk);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_get_clientHeight(IHTMLControlElement* This,LONG *p) {
    return This->lpVtbl->get_clientHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_get_clientWidth(IHTMLControlElement* This,LONG *p) {
    return This->lpVtbl->get_clientWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLControlElement_get_clientTop(IHTMLControlElement* This,LONG *p) {
    return This->lpVtbl->get_clientTop(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTextElement_QueryInterface(IHTMLTextElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTextElement_AddRef(IHTMLTextElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTextElement_Release(IHTMLTextElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTextElement_GetTypeInfoCount(IHTMLTextElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTextElement_GetTypeInfo(IHTMLTextElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLTextElement_QueryInterface(DispHTMLTextElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLTextElement_AddRef(DispHTMLTextElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLTextElement_Release(DispHTMLTextElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLTextElement_GetTypeInfoCount(DispHTMLTextElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLTextElement_GetTypeInfo(DispHTMLTextElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLTextContainerEvents2_QueryInterface(HTMLTextContainerEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLTextContainerEvents2_AddRef(HTMLTextContainerEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLTextContainerEvents2_Release(HTMLTextContainerEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLTextContainerEvents2_GetTypeInfoCount(HTMLTextContainerEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLTextContainerEvents2_GetTypeInfo(HTMLTextContainerEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLTextContainerEvents_QueryInterface(HTMLTextContainerEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLTextContainerEvents_AddRef(HTMLTextContainerEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLTextContainerEvents_Release(HTMLTextContainerEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLTextContainerEvents_GetTypeInfoCount(HTMLTextContainerEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLTextContainerEvents_GetTypeInfo(HTMLTextContainerEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTextContainer_QueryInterface(IHTMLTextContainer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTextContainer_AddRef(IHTMLTextContainer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTextContainer_Release(IHTMLTextContainer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTextContainer_GetTypeInfoCount(IHTMLTextContainer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTextContainer_GetTypeInfo(IHTMLTextContainer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTextContainer_createControlRange(IHTMLTextContainer* This,IDispatch **range) {
    return This->lpVtbl->createControlRange(This,range);
}
static __WIDL_INLINE HRESULT IHTMLTextContainer_get_scrollHeight(IHTMLTextContainer* This,LONG *p) {
    return This->lpVtbl->get_scrollHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextContainer_get_scrollWidth(IHTMLTextContainer* This,LONG *p) {
    return This->lpVtbl->get_scrollWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextContainer_put_scrollTop(IHTMLTextContainer* This,LONG v) {
    return This->lpVtbl->put_scrollTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextContainer_get_scrollTop(IHTMLTextContainer* This,LONG *p) {
    return This->lpVtbl->get_scrollTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextContainer_put_scrollLeft(IHTMLTextContainer* This,LONG v) {
    return This->lpVtbl->put_scrollLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextContainer_get_scrollLeft(IHTMLTextContainer* This,LONG *p) {
    return This->lpVtbl->get_scrollLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextContainer_put_onscroll(IHTMLTextContainer* This,VARIANT v) {
    return This->lpVtbl->put_onscroll(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLControlRange_QueryInterface(IHTMLControlRange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLControlRange_AddRef(IHTMLControlRange* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLControlRange_Release(IHTMLControlRange* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLControlRange_GetTypeInfoCount(IHTMLControlRange* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLControlRange_GetTypeInfo(IHTMLControlRange* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLControlRange_select(IHTMLControlRange* This) {
    return This->lpVtbl->select(This);
}
static __WIDL_INLINE HRESULT IHTMLControlRange_add(IHTMLControlRange* This,IHTMLControlElement *item) {
    return This->lpVtbl->add(This,item);
}
static __WIDL_INLINE HRESULT IHTMLControlRange_remove(IHTMLControlRange* This,LONG index) {
    return This->lpVtbl->remove(This,index);
}
static __WIDL_INLINE HRESULT IHTMLControlRange_item(IHTMLControlRange* This,LONG index,IHTMLElement **pdisp) {
    return This->lpVtbl->item(This,index,pdisp);
}
static __WIDL_INLINE HRESULT IHTMLControlRange_scrollIntoView(IHTMLControlRange* This,VARIANT varargStart) {
    return This->lpVtbl->scrollIntoView(This,varargStart);
}
static __WIDL_INLINE HRESULT IHTMLControlRange_queryCommandSupported(IHTMLControlRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandSupported(This,cmdID,pfRet);
}
static __WIDL_INLINE HRESULT IHTMLControlRange_queryCommandEnabled(IHTMLControlRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandEnabled(This,cmdID,pfRet);
}
static __WIDL_INLINE HRESULT IHTMLControlRange_queryCommandState(IHTMLControlRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandState(This,cmdID,pfRet);
}
static __WIDL_INLINE HRESULT IHTMLControlRange_queryCommandIndeterm(IHTMLControlRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandIndeterm(This,cmdID,pfRet);
}
static __WIDL_INLINE HRESULT IHTMLControlRange_queryCommandText(IHTMLControlRange* This,BSTR cmdID,BSTR *pcmdText) {
    return This->lpVtbl->queryCommandText(This,cmdID,pcmdText);
}
static __WIDL_INLINE HRESULT IHTMLControlRange_queryCommandValue(IHTMLControlRange* This,BSTR cmdID,VARIANT *pcmdValue) {
    return This->lpVtbl->queryCommandValue(This,cmdID,pcmdValue);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLControlRange_execCommandShowHelp(IHTMLControlRange* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->execCommandShowHelp(This,cmdID,pfRet);
}
static __WIDL_INLINE HRESULT IHTMLControlRange_commonParentElement(IHTMLControlRange* This,IHTMLElement **parent) {
    return This->lpVtbl->commonParentElement(This,parent);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLControlRange2_QueryInterface(IHTMLControlRange2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLControlRange2_AddRef(IHTMLControlRange2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLControlRange2_Release(IHTMLControlRange2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLControlRange2_GetTypeInfoCount(IHTMLControlRange2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLControlRange2_GetTypeInfo(IHTMLControlRange2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLImgEvents2_QueryInterface(HTMLImgEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLImgEvents2_AddRef(HTMLImgEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLImgEvents2_Release(HTMLImgEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLImgEvents2_GetTypeInfoCount(HTMLImgEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLImgEvents2_GetTypeInfo(HTMLImgEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLImgEvents_QueryInterface(HTMLImgEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLImgEvents_AddRef(HTMLImgEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLImgEvents_Release(HTMLImgEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLImgEvents_GetTypeInfoCount(HTMLImgEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLImgEvents_GetTypeInfo(HTMLImgEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLImgElement_QueryInterface(IHTMLImgElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLImgElement_AddRef(IHTMLImgElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLImgElement_Release(IHTMLImgElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLImgElement_GetTypeInfoCount(IHTMLImgElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_GetTypeInfo(IHTMLImgElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLImgElement_put_isMap(IHTMLImgElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_isMap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_isMap(IHTMLImgElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isMap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_useMap(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_useMap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_useMap(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_useMap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_mimeType(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_mimeType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_fileSize(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_fileSize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_fileCreatedDate(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_fileCreatedDate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_fileModifiedDate(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_fileModifiedDate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_fileUpdatedDate(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_fileUpdatedDate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_protocol(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_protocol(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_href(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_nameProp(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_nameProp(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_border(IHTMLImgElement* This,VARIANT v) {
    return This->lpVtbl->put_border(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_border(IHTMLImgElement* This,VARIANT *p) {
    return This->lpVtbl->get_border(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_vspace(IHTMLImgElement* This,LONG v) {
    return This->lpVtbl->put_vspace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_vspace(IHTMLImgElement* This,LONG *p) {
    return This->lpVtbl->get_vspace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_hspace(IHTMLImgElement* This,LONG v) {
    return This->lpVtbl->put_hspace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_hspace(IHTMLImgElement* This,LONG *p) {
    return This->lpVtbl->get_hspace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_alt(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_alt(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_alt(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_alt(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_src(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_src(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_lowsrc(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_lowsrc(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_lowsrc(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_lowsrc(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_vrml(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_vrml(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_vrml(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_vrml(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_dynsrc(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_dynsrc(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_dynsrc(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_dynsrc(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_readyState(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_complete(IHTMLImgElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_complete(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_loop(IHTMLImgElement* This,VARIANT v) {
    return This->lpVtbl->put_loop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_loop(IHTMLImgElement* This,VARIANT *p) {
    return This->lpVtbl->get_loop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_align(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_align(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_onload(IHTMLImgElement* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_onload(IHTMLImgElement* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_onerror(IHTMLImgElement* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_onerror(IHTMLImgElement* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_onabort(IHTMLImgElement* This,VARIANT v) {
    return This->lpVtbl->put_onabort(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_onabort(IHTMLImgElement* This,VARIANT *p) {
    return This->lpVtbl->get_onabort(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_name(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_name(IHTMLImgElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_width(IHTMLImgElement* This,LONG v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_width(IHTMLImgElement* This,LONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_height(IHTMLImgElement* This,LONG v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_get_height(IHTMLImgElement* This,LONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement_put_start(IHTMLImgElement* This,BSTR v) {
    return This->lpVtbl->put_start(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLImgElement2_QueryInterface(IHTMLImgElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLImgElement2_AddRef(IHTMLImgElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLImgElement2_Release(IHTMLImgElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLImgElement2_GetTypeInfoCount(IHTMLImgElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLImgElement2_GetTypeInfo(IHTMLImgElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLImgElement2_put_longDesc(IHTMLImgElement2* This,BSTR v) {
    return This->lpVtbl->put_longDesc(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLImgElement3_QueryInterface(IHTMLImgElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLImgElement3_AddRef(IHTMLImgElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLImgElement3_Release(IHTMLImgElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLImgElement3_GetTypeInfoCount(IHTMLImgElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLImgElement3_GetTypeInfo(IHTMLImgElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLImgElement3_put_longDesc(IHTMLImgElement3* This,BSTR v) {
    return This->lpVtbl->put_longDesc(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement3_get_longDesc(IHTMLImgElement3* This,BSTR *p) {
    return This->lpVtbl->get_longDesc(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement3_put_vrml(IHTMLImgElement3* This,BSTR v) {
    return This->lpVtbl->put_vrml(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement3_get_vrml(IHTMLImgElement3* This,BSTR *p) {
    return This->lpVtbl->get_vrml(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement3_put_lowsrc(IHTMLImgElement3* This,BSTR v) {
    return This->lpVtbl->put_lowsrc(This,v);
}
static __WIDL_INLINE HRESULT IHTMLImgElement3_get_lowsrc(IHTMLImgElement3* This,BSTR *p) {
    return This->lpVtbl->get_lowsrc(This,p);
}
static __WIDL_INLINE HRESULT IHTMLImgElement3_put_dynsrc(IHTMLImgElement3* This,BSTR v) {
    return This->lpVtbl->put_dynsrc(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLImgElement4_QueryInterface(IHTMLImgElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLImgElement4_AddRef(IHTMLImgElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLImgElement4_Release(IHTMLImgElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLImgElement4_GetTypeInfoCount(IHTMLImgElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLImgElement4_GetTypeInfo(IHTMLImgElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLImgElement4_get_naturalWidth(IHTMLImgElement4* This,LONG *p) {
    return This->lpVtbl->get_naturalWidth(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMSImgElement_QueryInterface(IHTMLMSImgElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLMSImgElement_AddRef(IHTMLMSImgElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLMSImgElement_Release(IHTMLMSImgElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLMSImgElement_GetTypeInfoCount(IHTMLMSImgElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLMSImgElement_GetTypeInfo(IHTMLMSImgElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMSImgElement_put_msPlayToDisabled(IHTMLMSImgElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_msPlayToDisabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMSImgElement_get_msPlayToDisabled(IHTMLMSImgElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_msPlayToDisabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMSImgElement_put_msPlayToPrimary(IHTMLMSImgElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_msPlayToPrimary(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLImageElementFactory_QueryInterface(IHTMLImageElementFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLImageElementFactory_AddRef(IHTMLImageElementFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLImageElementFactory_Release(IHTMLImageElementFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLImageElementFactory_GetTypeInfoCount(IHTMLImageElementFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLImageElementFactory_GetTypeInfo(IHTMLImageElementFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLImg_QueryInterface(DispHTMLImg* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLImg_AddRef(DispHTMLImg* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLImg_Release(DispHTMLImg* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLImg_GetTypeInfoCount(DispHTMLImg* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLImg_GetTypeInfo(DispHTMLImg* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBodyElement_QueryInterface(IHTMLBodyElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLBodyElement_AddRef(IHTMLBodyElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLBodyElement_Release(IHTMLBodyElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLBodyElement_GetTypeInfoCount(IHTMLBodyElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_GetTypeInfo(IHTMLBodyElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBodyElement_put_background(IHTMLBodyElement* This,BSTR v) {
    return This->lpVtbl->put_background(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_background(IHTMLBodyElement* This,BSTR *p) {
    return This->lpVtbl->get_background(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_bgProperties(IHTMLBodyElement* This,BSTR v) {
    return This->lpVtbl->put_bgProperties(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_bgProperties(IHTMLBodyElement* This,BSTR *p) {
    return This->lpVtbl->get_bgProperties(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_leftMargin(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_leftMargin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_leftMargin(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_leftMargin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_topMargin(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_topMargin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_topMargin(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_topMargin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_rightMargin(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_rightMargin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_rightMargin(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_rightMargin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_bottomMargin(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_bottomMargin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_bottomMargin(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_bottomMargin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_noWrap(IHTMLBodyElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noWrap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_noWrap(IHTMLBodyElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_noWrap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_bgColor(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_bgColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_bgColor(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_bgColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_text(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_text(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_text(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_link(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_link(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_link(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_link(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_vLink(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_vLink(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_vLink(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_vLink(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_aLink(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_aLink(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_aLink(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_aLink(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_onload(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_onload(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_onunload(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_onunload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_onunload(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_onunload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_scroll(IHTMLBodyElement* This,BSTR v) {
    return This->lpVtbl->put_scroll(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_scroll(IHTMLBodyElement* This,BSTR *p) {
    return This->lpVtbl->get_scroll(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_onselect(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_onselect(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_put_onbeforeunload(IHTMLBodyElement* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeunload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement_get_onbeforeunload(IHTMLBodyElement* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeunload(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBodyElement2_QueryInterface(IHTMLBodyElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLBodyElement2_AddRef(IHTMLBodyElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLBodyElement2_Release(IHTMLBodyElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLBodyElement2_GetTypeInfoCount(IHTMLBodyElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement2_GetTypeInfo(IHTMLBodyElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBodyElement2_put_onbeforeprint(IHTMLBodyElement2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeprint(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement2_get_onbeforeprint(IHTMLBodyElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeprint(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement2_put_onafterprint(IHTMLBodyElement2* This,VARIANT v) {
    return This->lpVtbl->put_onafterprint(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBodyElement3_QueryInterface(IHTMLBodyElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLBodyElement3_AddRef(IHTMLBodyElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLBodyElement3_Release(IHTMLBodyElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLBodyElement3_GetTypeInfoCount(IHTMLBodyElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement3_GetTypeInfo(IHTMLBodyElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBodyElement3_put_background(IHTMLBodyElement3* This,BSTR v) {
    return This->lpVtbl->put_background(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement3_get_background(IHTMLBodyElement3* This,BSTR *p) {
    return This->lpVtbl->get_background(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement3_put_ononline(IHTMLBodyElement3* This,VARIANT v) {
    return This->lpVtbl->put_ononline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement3_get_ononline(IHTMLBodyElement3* This,VARIANT *p) {
    return This->lpVtbl->get_ononline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement3_put_onoffline(IHTMLBodyElement3* This,VARIANT v) {
    return This->lpVtbl->put_onoffline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement3_get_onoffline(IHTMLBodyElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onoffline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement3_put_onhashchange(IHTMLBodyElement3* This,VARIANT v) {
    return This->lpVtbl->put_onhashchange(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBodyElement4_QueryInterface(IHTMLBodyElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLBodyElement4_AddRef(IHTMLBodyElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLBodyElement4_Release(IHTMLBodyElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLBodyElement4_GetTypeInfoCount(IHTMLBodyElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement4_GetTypeInfo(IHTMLBodyElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBodyElement4_put_onmessage(IHTMLBodyElement4* This,VARIANT v) {
    return This->lpVtbl->put_onmessage(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement4_get_onmessage(IHTMLBodyElement4* This,VARIANT *p) {
    return This->lpVtbl->get_onmessage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement4_put_onstorage(IHTMLBodyElement4* This,VARIANT v) {
    return This->lpVtbl->put_onstorage(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBodyElement5_QueryInterface(IHTMLBodyElement5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLBodyElement5_AddRef(IHTMLBodyElement5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLBodyElement5_Release(IHTMLBodyElement5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLBodyElement5_GetTypeInfoCount(IHTMLBodyElement5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLBodyElement5_GetTypeInfo(IHTMLBodyElement5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBodyElement5_put_onpopstate(IHTMLBodyElement5* This,VARIANT v) {
    return This->lpVtbl->put_onpopstate(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLBody_QueryInterface(DispHTMLBody* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLBody_AddRef(DispHTMLBody* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLBody_Release(DispHTMLBody* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLBody_GetTypeInfoCount(DispHTMLBody* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLBody_GetTypeInfo(DispHTMLBody* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFontElement_QueryInterface(IHTMLFontElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFontElement_AddRef(IHTMLFontElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFontElement_Release(IHTMLFontElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFontElement_GetTypeInfoCount(IHTMLFontElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFontElement_GetTypeInfo(IHTMLFontElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFontElement_put_color(IHTMLFontElement* This,VARIANT v) {
    return This->lpVtbl->put_color(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFontElement_get_color(IHTMLFontElement* This,VARIANT *p) {
    return This->lpVtbl->get_color(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFontElement_put_face(IHTMLFontElement* This,BSTR v) {
    return This->lpVtbl->put_face(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFontElement_get_face(IHTMLFontElement* This,BSTR *p) {
    return This->lpVtbl->get_face(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFontElement_put_size(IHTMLFontElement* This,VARIANT v) {
    return This->lpVtbl->put_size(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLFontElement_QueryInterface(DispHTMLFontElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLFontElement_AddRef(DispHTMLFontElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLFontElement_Release(DispHTMLFontElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLFontElement_GetTypeInfoCount(DispHTMLFontElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLFontElement_GetTypeInfo(DispHTMLFontElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLAnchorEvents2_QueryInterface(HTMLAnchorEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLAnchorEvents2_AddRef(HTMLAnchorEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLAnchorEvents2_Release(HTMLAnchorEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLAnchorEvents2_GetTypeInfoCount(HTMLAnchorEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLAnchorEvents2_GetTypeInfo(HTMLAnchorEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLAnchorEvents_QueryInterface(HTMLAnchorEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLAnchorEvents_AddRef(HTMLAnchorEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLAnchorEvents_Release(HTMLAnchorEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLAnchorEvents_GetTypeInfoCount(HTMLAnchorEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLAnchorEvents_GetTypeInfo(HTMLAnchorEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAnchorElement_QueryInterface(IHTMLAnchorElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAnchorElement_AddRef(IHTMLAnchorElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAnchorElement_Release(IHTMLAnchorElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAnchorElement_GetTypeInfoCount(IHTMLAnchorElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_GetTypeInfo(IHTMLAnchorElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAnchorElement_put_href(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_href(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_target(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_target(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_target(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_target(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_rel(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_rel(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_rel(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_rel(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_rev(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_rev(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_rev(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_rev(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_urn(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_urn(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_urn(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_urn(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_Methods(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_Methods(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_Methods(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_Methods(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_name(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_name(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_host(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_host(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_host(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_host(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_hostname(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_hostname(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_hostname(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_hostname(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_pathname(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_pathname(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_pathname(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_pathname(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_port(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_port(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_port(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_port(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_protocol(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_protocol(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_protocol(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_protocol(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_search(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_search(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_search(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_search(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_hash(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_hash(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_hash(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_hash(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_onblur(IHTMLAnchorElement* This,VARIANT v) {
    return This->lpVtbl->put_onblur(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_onblur(IHTMLAnchorElement* This,VARIANT *p) {
    return This->lpVtbl->get_onblur(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_onfocus(IHTMLAnchorElement* This,VARIANT v) {
    return This->lpVtbl->put_onfocus(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_onfocus(IHTMLAnchorElement* This,VARIANT *p) {
    return This->lpVtbl->get_onfocus(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_accessKey(IHTMLAnchorElement* This,BSTR v) {
    return This->lpVtbl->put_accessKey(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_accessKey(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_accessKey(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_protocolLong(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_protocolLong(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_mimeType(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_mimeType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_nameProp(IHTMLAnchorElement* This,BSTR *p) {
    return This->lpVtbl->get_nameProp(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_put_tabIndex(IHTMLAnchorElement* This,short v) {
    return This->lpVtbl->put_tabIndex(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_get_tabIndex(IHTMLAnchorElement* This,short *p) {
    return This->lpVtbl->get_tabIndex(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement_focus(IHTMLAnchorElement* This) {
    return This->lpVtbl->focus(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAnchorElement2_QueryInterface(IHTMLAnchorElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAnchorElement2_AddRef(IHTMLAnchorElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAnchorElement2_Release(IHTMLAnchorElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAnchorElement2_GetTypeInfoCount(IHTMLAnchorElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement2_GetTypeInfo(IHTMLAnchorElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAnchorElement2_put_charset(IHTMLAnchorElement2* This,BSTR v) {
    return This->lpVtbl->put_charset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement2_get_charset(IHTMLAnchorElement2* This,BSTR *p) {
    return This->lpVtbl->get_charset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement2_put_coords(IHTMLAnchorElement2* This,BSTR v) {
    return This->lpVtbl->put_coords(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement2_get_coords(IHTMLAnchorElement2* This,BSTR *p) {
    return This->lpVtbl->get_coords(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement2_put_hreflang(IHTMLAnchorElement2* This,BSTR v) {
    return This->lpVtbl->put_hreflang(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement2_get_hreflang(IHTMLAnchorElement2* This,BSTR *p) {
    return This->lpVtbl->get_hreflang(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement2_put_shape(IHTMLAnchorElement2* This,BSTR v) {
    return This->lpVtbl->put_shape(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement2_get_shape(IHTMLAnchorElement2* This,BSTR *p) {
    return This->lpVtbl->get_shape(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement2_put_type(IHTMLAnchorElement2* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAnchorElement3_QueryInterface(IHTMLAnchorElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAnchorElement3_AddRef(IHTMLAnchorElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAnchorElement3_Release(IHTMLAnchorElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAnchorElement3_GetTypeInfoCount(IHTMLAnchorElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement3_GetTypeInfo(IHTMLAnchorElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAnchorElement3_put_shape(IHTMLAnchorElement3* This,BSTR v) {
    return This->lpVtbl->put_shape(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement3_get_shape(IHTMLAnchorElement3* This,BSTR *p) {
    return This->lpVtbl->get_shape(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement3_put_coords(IHTMLAnchorElement3* This,BSTR v) {
    return This->lpVtbl->put_coords(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement3_get_coords(IHTMLAnchorElement3* This,BSTR *p) {
    return This->lpVtbl->get_coords(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAnchorElement3_put_href(IHTMLAnchorElement3* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLAnchorElement_QueryInterface(DispHTMLAnchorElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLAnchorElement_AddRef(DispHTMLAnchorElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLAnchorElement_Release(DispHTMLAnchorElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLAnchorElement_GetTypeInfoCount(DispHTMLAnchorElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLAnchorElement_GetTypeInfo(DispHTMLAnchorElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLLabelEvents2_QueryInterface(HTMLLabelEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLLabelEvents2_AddRef(HTMLLabelEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLLabelEvents2_Release(HTMLLabelEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLLabelEvents2_GetTypeInfoCount(HTMLLabelEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLLabelEvents2_GetTypeInfo(HTMLLabelEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLLabelEvents_QueryInterface(HTMLLabelEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLLabelEvents_AddRef(HTMLLabelEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLLabelEvents_Release(HTMLLabelEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLLabelEvents_GetTypeInfoCount(HTMLLabelEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLLabelEvents_GetTypeInfo(HTMLLabelEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLabelElement_QueryInterface(IHTMLLabelElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLLabelElement_AddRef(IHTMLLabelElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLLabelElement_Release(IHTMLLabelElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLLabelElement_GetTypeInfoCount(IHTMLLabelElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLLabelElement_GetTypeInfo(IHTMLLabelElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLabelElement_put_htmlFor(IHTMLLabelElement* This,BSTR v) {
    return This->lpVtbl->put_htmlFor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLabelElement_get_htmlFor(IHTMLLabelElement* This,BSTR *p) {
    return This->lpVtbl->get_htmlFor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLabelElement_put_accessKey(IHTMLLabelElement* This,BSTR v) {
    return This->lpVtbl->put_accessKey(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLabelElement2_QueryInterface(IHTMLLabelElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLLabelElement2_AddRef(IHTMLLabelElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLLabelElement2_Release(IHTMLLabelElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLLabelElement2_GetTypeInfoCount(IHTMLLabelElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLLabelElement2_GetTypeInfo(IHTMLLabelElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLLabelElement_QueryInterface(DispHTMLLabelElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLLabelElement_AddRef(DispHTMLLabelElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLLabelElement_Release(DispHTMLLabelElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLLabelElement_GetTypeInfoCount(DispHTMLLabelElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLLabelElement_GetTypeInfo(DispHTMLLabelElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLListElement_QueryInterface(IHTMLListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLListElement_AddRef(IHTMLListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLListElement_Release(IHTMLListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLListElement_GetTypeInfoCount(IHTMLListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLListElement_GetTypeInfo(IHTMLListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLListElement2_QueryInterface(IHTMLListElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLListElement2_AddRef(IHTMLListElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLListElement2_Release(IHTMLListElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLListElement2_GetTypeInfoCount(IHTMLListElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLListElement2_GetTypeInfo(IHTMLListElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLListElement2_put_compact(IHTMLListElement2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_compact(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLListElement_QueryInterface(DispHTMLListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLListElement_AddRef(DispHTMLListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLListElement_Release(DispHTMLListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLListElement_GetTypeInfoCount(DispHTMLListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLListElement_GetTypeInfo(DispHTMLListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLUListElement_QueryInterface(IHTMLUListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLUListElement_AddRef(IHTMLUListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLUListElement_Release(IHTMLUListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLUListElement_GetTypeInfoCount(IHTMLUListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLUListElement_GetTypeInfo(IHTMLUListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLUListElement_put_compact(IHTMLUListElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_compact(This,v);
}
static __WIDL_INLINE HRESULT IHTMLUListElement_get_compact(IHTMLUListElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_compact(This,p);
}
static __WIDL_INLINE HRESULT IHTMLUListElement_put_type(IHTMLUListElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLUListElement_QueryInterface(DispHTMLUListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLUListElement_AddRef(DispHTMLUListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLUListElement_Release(DispHTMLUListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLUListElement_GetTypeInfoCount(DispHTMLUListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLUListElement_GetTypeInfo(DispHTMLUListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOListElement_QueryInterface(IHTMLOListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLOListElement_AddRef(IHTMLOListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLOListElement_Release(IHTMLOListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLOListElement_GetTypeInfoCount(IHTMLOListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLOListElement_GetTypeInfo(IHTMLOListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOListElement_put_compact(IHTMLOListElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_compact(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOListElement_get_compact(IHTMLOListElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_compact(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOListElement_put_start(IHTMLOListElement* This,LONG v) {
    return This->lpVtbl->put_start(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOListElement_get_start(IHTMLOListElement* This,LONG *p) {
    return This->lpVtbl->get_start(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOListElement_put_type(IHTMLOListElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLOListElement_QueryInterface(DispHTMLOListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLOListElement_AddRef(DispHTMLOListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLOListElement_Release(DispHTMLOListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLOListElement_GetTypeInfoCount(DispHTMLOListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLOListElement_GetTypeInfo(DispHTMLOListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLIElement_QueryInterface(IHTMLLIElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLLIElement_AddRef(IHTMLLIElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLLIElement_Release(IHTMLLIElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLLIElement_GetTypeInfoCount(IHTMLLIElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLLIElement_GetTypeInfo(IHTMLLIElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLIElement_put_type(IHTMLLIElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLIElement_get_type(IHTMLLIElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLIElement_put_value(IHTMLLIElement* This,LONG v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLLIElement_QueryInterface(DispHTMLLIElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLLIElement_AddRef(DispHTMLLIElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLLIElement_Release(DispHTMLLIElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLLIElement_GetTypeInfoCount(DispHTMLLIElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLLIElement_GetTypeInfo(DispHTMLLIElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBlockElement_QueryInterface(IHTMLBlockElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLBlockElement_AddRef(IHTMLBlockElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLBlockElement_Release(IHTMLBlockElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLBlockElement_GetTypeInfoCount(IHTMLBlockElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLBlockElement_GetTypeInfo(IHTMLBlockElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBlockElement_put_clear(IHTMLBlockElement* This,BSTR v) {
    return This->lpVtbl->put_clear(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBlockElement2_QueryInterface(IHTMLBlockElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLBlockElement2_AddRef(IHTMLBlockElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLBlockElement2_Release(IHTMLBlockElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLBlockElement2_GetTypeInfoCount(IHTMLBlockElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLBlockElement2_GetTypeInfo(IHTMLBlockElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBlockElement2_put_cite(IHTMLBlockElement2* This,BSTR v) {
    return This->lpVtbl->put_cite(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBlockElement2_get_cite(IHTMLBlockElement2* This,BSTR *p) {
    return This->lpVtbl->get_cite(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBlockElement2_put_width(IHTMLBlockElement2* This,BSTR v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBlockElement3_QueryInterface(IHTMLBlockElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLBlockElement3_AddRef(IHTMLBlockElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLBlockElement3_Release(IHTMLBlockElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLBlockElement3_GetTypeInfoCount(IHTMLBlockElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLBlockElement3_GetTypeInfo(IHTMLBlockElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBlockElement3_put_cite(IHTMLBlockElement3* This,BSTR v) {
    return This->lpVtbl->put_cite(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLBlockElement_QueryInterface(DispHTMLBlockElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLBlockElement_AddRef(DispHTMLBlockElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLBlockElement_Release(DispHTMLBlockElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLBlockElement_GetTypeInfoCount(DispHTMLBlockElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLBlockElement_GetTypeInfo(DispHTMLBlockElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDivElement_QueryInterface(IHTMLDivElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDivElement_AddRef(IHTMLDivElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDivElement_Release(IHTMLDivElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDivElement_GetTypeInfoCount(IHTMLDivElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDivElement_GetTypeInfo(IHTMLDivElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDivElement_put_align(IHTMLDivElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDivElement_get_align(IHTMLDivElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDivElement_put_noWrap(IHTMLDivElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noWrap(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLDivElement_QueryInterface(DispHTMLDivElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLDivElement_AddRef(DispHTMLDivElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLDivElement_Release(DispHTMLDivElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLDivElement_GetTypeInfoCount(DispHTMLDivElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLDivElement_GetTypeInfo(DispHTMLDivElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDDElement_QueryInterface(IHTMLDDElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDDElement_AddRef(IHTMLDDElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDDElement_Release(IHTMLDDElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDDElement_GetTypeInfoCount(IHTMLDDElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDDElement_GetTypeInfo(IHTMLDDElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDDElement_put_noWrap(IHTMLDDElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noWrap(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLDDElement_QueryInterface(DispHTMLDDElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLDDElement_AddRef(DispHTMLDDElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLDDElement_Release(DispHTMLDDElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLDDElement_GetTypeInfoCount(DispHTMLDDElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLDDElement_GetTypeInfo(DispHTMLDDElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDTElement_QueryInterface(IHTMLDTElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDTElement_AddRef(IHTMLDTElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDTElement_Release(IHTMLDTElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDTElement_GetTypeInfoCount(IHTMLDTElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDTElement_GetTypeInfo(IHTMLDTElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDTElement_put_noWrap(IHTMLDTElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noWrap(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLDTElement_QueryInterface(DispHTMLDTElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLDTElement_AddRef(DispHTMLDTElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLDTElement_Release(DispHTMLDTElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLDTElement_GetTypeInfoCount(DispHTMLDTElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLDTElement_GetTypeInfo(DispHTMLDTElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBRElement_QueryInterface(IHTMLBRElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLBRElement_AddRef(IHTMLBRElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLBRElement_Release(IHTMLBRElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLBRElement_GetTypeInfoCount(IHTMLBRElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLBRElement_GetTypeInfo(IHTMLBRElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBRElement_put_clear(IHTMLBRElement* This,BSTR v) {
    return This->lpVtbl->put_clear(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLBRElement_QueryInterface(DispHTMLBRElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLBRElement_AddRef(DispHTMLBRElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLBRElement_Release(DispHTMLBRElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLBRElement_GetTypeInfoCount(DispHTMLBRElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLBRElement_GetTypeInfo(DispHTMLBRElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDListElement_QueryInterface(IHTMLDListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDListElement_AddRef(IHTMLDListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDListElement_Release(IHTMLDListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDListElement_GetTypeInfoCount(IHTMLDListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDListElement_GetTypeInfo(IHTMLDListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDListElement_put_compact(IHTMLDListElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_compact(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLDListElement_QueryInterface(DispHTMLDListElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLDListElement_AddRef(DispHTMLDListElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLDListElement_Release(DispHTMLDListElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLDListElement_GetTypeInfoCount(DispHTMLDListElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLDListElement_GetTypeInfo(DispHTMLDListElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLHRElement_QueryInterface(IHTMLHRElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLHRElement_AddRef(IHTMLHRElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLHRElement_Release(IHTMLHRElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLHRElement_GetTypeInfoCount(IHTMLHRElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLHRElement_GetTypeInfo(IHTMLHRElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLHRElement_put_align(IHTMLHRElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE HRESULT IHTMLHRElement_get_align(IHTMLHRElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static __WIDL_INLINE HRESULT IHTMLHRElement_put_color(IHTMLHRElement* This,VARIANT v) {
    return This->lpVtbl->put_color(This,v);
}
static __WIDL_INLINE HRESULT IHTMLHRElement_get_color(IHTMLHRElement* This,VARIANT *p) {
    return This->lpVtbl->get_color(This,p);
}
static __WIDL_INLINE HRESULT IHTMLHRElement_put_noShade(IHTMLHRElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noShade(This,v);
}
static __WIDL_INLINE HRESULT IHTMLHRElement_get_noShade(IHTMLHRElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_noShade(This,p);
}
static __WIDL_INLINE HRESULT IHTMLHRElement_put_width(IHTMLHRElement* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLHRElement_get_width(IHTMLHRElement* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLHRElement_put_size(IHTMLHRElement* This,VARIANT v) {
    return This->lpVtbl->put_size(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLHRElement_QueryInterface(DispHTMLHRElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLHRElement_AddRef(DispHTMLHRElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLHRElement_Release(DispHTMLHRElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLHRElement_GetTypeInfoCount(DispHTMLHRElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLHRElement_GetTypeInfo(DispHTMLHRElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLParaElement_QueryInterface(IHTMLParaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLParaElement_AddRef(IHTMLParaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLParaElement_Release(IHTMLParaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLParaElement_GetTypeInfoCount(IHTMLParaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLParaElement_GetTypeInfo(IHTMLParaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLParaElement_put_align(IHTMLParaElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLParaElement_QueryInterface(DispHTMLParaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLParaElement_AddRef(DispHTMLParaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLParaElement_Release(DispHTMLParaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLParaElement_GetTypeInfoCount(DispHTMLParaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLParaElement_GetTypeInfo(DispHTMLParaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElementCollection_QueryInterface(IHTMLElementCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLElementCollection_AddRef(IHTMLElementCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLElementCollection_Release(IHTMLElementCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLElementCollection_GetTypeInfoCount(IHTMLElementCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLElementCollection_GetTypeInfo(IHTMLElementCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElementCollection_toString(IHTMLElementCollection* This,BSTR *String) {
    return This->lpVtbl->toString(This,String);
}
static __WIDL_INLINE HRESULT IHTMLElementCollection_put_length(IHTMLElementCollection* This,LONG v) {
    return This->lpVtbl->put_length(This,v);
}
static __WIDL_INLINE HRESULT IHTMLElementCollection_get_length(IHTMLElementCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElementCollection_get__newEnum(IHTMLElementCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElementCollection_item(IHTMLElementCollection* This,VARIANT name,VARIANT index,IDispatch **pdisp) {
    return This->lpVtbl->item(This,name,index,pdisp);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElementCollection2_QueryInterface(IHTMLElementCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLElementCollection2_AddRef(IHTMLElementCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLElementCollection2_Release(IHTMLElementCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLElementCollection2_GetTypeInfoCount(IHTMLElementCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLElementCollection2_GetTypeInfo(IHTMLElementCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElementCollection3_QueryInterface(IHTMLElementCollection3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLElementCollection3_AddRef(IHTMLElementCollection3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLElementCollection3_Release(IHTMLElementCollection3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLElementCollection3_GetTypeInfoCount(IHTMLElementCollection3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLElementCollection3_GetTypeInfo(IHTMLElementCollection3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElementCollection4_QueryInterface(IHTMLElementCollection4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLElementCollection4_AddRef(IHTMLElementCollection4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLElementCollection4_Release(IHTMLElementCollection4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLElementCollection4_GetTypeInfoCount(IHTMLElementCollection4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLElementCollection4_GetTypeInfo(IHTMLElementCollection4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLElementCollection4_get_length(IHTMLElementCollection4* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLElementCollection4_item(IHTMLElementCollection4* This,LONG index,IHTMLElement2 **pNode) {
    return This->lpVtbl->item(This,index,pNode);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLElementCollection_QueryInterface(DispHTMLElementCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLElementCollection_AddRef(DispHTMLElementCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLElementCollection_Release(DispHTMLElementCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLElementCollection_GetTypeInfoCount(DispHTMLElementCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLElementCollection_GetTypeInfo(DispHTMLElementCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLHeaderElement_QueryInterface(IHTMLHeaderElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLHeaderElement_AddRef(IHTMLHeaderElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLHeaderElement_Release(IHTMLHeaderElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLHeaderElement_GetTypeInfoCount(IHTMLHeaderElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLHeaderElement_GetTypeInfo(IHTMLHeaderElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLHeaderElement_put_align(IHTMLHeaderElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLHeaderElement_QueryInterface(DispHTMLHeaderElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLHeaderElement_AddRef(DispHTMLHeaderElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLHeaderElement_Release(DispHTMLHeaderElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLHeaderElement_GetTypeInfoCount(DispHTMLHeaderElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLHeaderElement_GetTypeInfo(DispHTMLHeaderElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLSelectElementEvents2_QueryInterface(HTMLSelectElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLSelectElementEvents2_AddRef(HTMLSelectElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLSelectElementEvents2_Release(HTMLSelectElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLSelectElementEvents2_GetTypeInfoCount(HTMLSelectElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLSelectElementEvents2_GetTypeInfo(HTMLSelectElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLSelectElementEvents_QueryInterface(HTMLSelectElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLSelectElementEvents_AddRef(HTMLSelectElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLSelectElementEvents_Release(HTMLSelectElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLSelectElementEvents_GetTypeInfoCount(HTMLSelectElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLSelectElementEvents_GetTypeInfo(HTMLSelectElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSelectElementEx_QueryInterface(IHTMLSelectElementEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLSelectElementEx_AddRef(IHTMLSelectElementEx* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLSelectElementEx_Release(IHTMLSelectElementEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLSelectElementEx methods ***/
static __WIDL_INLINE HRESULT IHTMLSelectElementEx_ShowDropdown(IHTMLSelectElementEx* This,WINBOOL fShow) {
    return This->lpVtbl->ShowDropdown(This,fShow);
}
static __WIDL_INLINE HRESULT IHTMLSelectElementEx_SetSelectExFlags(IHTMLSelectElementEx* This,DWORD lFlags) {
    return This->lpVtbl->SetSelectExFlags(This,lFlags);
}
static __WIDL_INLINE HRESULT IHTMLSelectElementEx_GetSelectExFlags(IHTMLSelectElementEx* This,DWORD *pFlags) {
    return This->lpVtbl->GetSelectExFlags(This,pFlags);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSelectElement_QueryInterface(IHTMLSelectElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLSelectElement_AddRef(IHTMLSelectElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLSelectElement_Release(IHTMLSelectElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLSelectElement_GetTypeInfoCount(IHTMLSelectElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_GetTypeInfo(IHTMLSelectElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSelectElement_put_size(IHTMLSelectElement* This,LONG v) {
    return This->lpVtbl->put_size(This,v);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_get_size(IHTMLSelectElement* This,LONG *p) {
    return This->lpVtbl->get_size(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_put_multiple(IHTMLSelectElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_multiple(This,v);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_get_multiple(IHTMLSelectElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_multiple(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_put_name(IHTMLSelectElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_get_name(IHTMLSelectElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_get_options(IHTMLSelectElement* This,IDispatch **p) {
    return This->lpVtbl->get_options(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_put_onchange(IHTMLSelectElement* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_get_onchange(IHTMLSelectElement* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_put_selectedIndex(IHTMLSelectElement* This,LONG v) {
    return This->lpVtbl->put_selectedIndex(This,v);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_get_selectedIndex(IHTMLSelectElement* This,LONG *p) {
    return This->lpVtbl->get_selectedIndex(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_get_type(IHTMLSelectElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_put_value(IHTMLSelectElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_get_value(IHTMLSelectElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_put_disabled(IHTMLSelectElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_get_disabled(IHTMLSelectElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_get_form(IHTMLSelectElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_add(IHTMLSelectElement* This,IHTMLElement *element,VARIANT before) {
    return This->lpVtbl->add(This,element,before);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_remove(IHTMLSelectElement* This,LONG index) {
    return This->lpVtbl->remove(This,index);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_put_length(IHTMLSelectElement* This,LONG v) {
    return This->lpVtbl->put_length(This,v);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_get_length(IHTMLSelectElement* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_get__newEnum(IHTMLSelectElement* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement_item(IHTMLSelectElement* This,VARIANT name,VARIANT index,IDispatch **pdisp) {
    return This->lpVtbl->item(This,name,index,pdisp);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSelectElement2_QueryInterface(IHTMLSelectElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLSelectElement2_AddRef(IHTMLSelectElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLSelectElement2_Release(IHTMLSelectElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLSelectElement2_GetTypeInfoCount(IHTMLSelectElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement2_GetTypeInfo(IHTMLSelectElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSelectElement4_QueryInterface(IHTMLSelectElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLSelectElement4_AddRef(IHTMLSelectElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLSelectElement4_Release(IHTMLSelectElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLSelectElement4_GetTypeInfoCount(IHTMLSelectElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement4_GetTypeInfo(IHTMLSelectElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSelectElement5_QueryInterface(IHTMLSelectElement5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLSelectElement5_AddRef(IHTMLSelectElement5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLSelectElement5_Release(IHTMLSelectElement5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLSelectElement5_GetTypeInfoCount(IHTMLSelectElement5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement5_GetTypeInfo(IHTMLSelectElement5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSelectElement6_QueryInterface(IHTMLSelectElement6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLSelectElement6_AddRef(IHTMLSelectElement6* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLSelectElement6_Release(IHTMLSelectElement6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLSelectElement6_GetTypeInfoCount(IHTMLSelectElement6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement6_GetTypeInfo(IHTMLSelectElement6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSelectElement6_add(IHTMLSelectElement6* This,IHTMLOptionElement *pElem,VARIANT *pvarBefore) {
    return This->lpVtbl->add(This,pElem,pvarBefore);
}
static __WIDL_INLINE HRESULT IHTMLSelectElement6_put_value(IHTMLSelectElement6* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLSelectElement_QueryInterface(DispHTMLSelectElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLSelectElement_AddRef(DispHTMLSelectElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLSelectElement_Release(DispHTMLSelectElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLSelectElement_GetTypeInfoCount(DispHTMLSelectElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLSelectElement_GetTypeInfo(DispHTMLSelectElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLWndSelectElement_QueryInterface(DispHTMLWndSelectElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLWndSelectElement_AddRef(DispHTMLWndSelectElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLWndSelectElement_Release(DispHTMLWndSelectElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLWndSelectElement_GetTypeInfoCount(DispHTMLWndSelectElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLWndSelectElement_GetTypeInfo(DispHTMLWndSelectElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSelectionObject_QueryInterface(IHTMLSelectionObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLSelectionObject_AddRef(IHTMLSelectionObject* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLSelectionObject_Release(IHTMLSelectionObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLSelectionObject_GetTypeInfoCount(IHTMLSelectionObject* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLSelectionObject_GetTypeInfo(IHTMLSelectionObject* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSelectionObject_createRange(IHTMLSelectionObject* This,IDispatch **range) {
    return This->lpVtbl->createRange(This,range);
}
static __WIDL_INLINE HRESULT IHTMLSelectionObject_empty(IHTMLSelectionObject* This) {
    return This->lpVtbl->empty(This);
}
static __WIDL_INLINE HRESULT IHTMLSelectionObject_clear(IHTMLSelectionObject* This) {
    return This->lpVtbl->clear(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSelectionObject2_QueryInterface(IHTMLSelectionObject2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLSelectionObject2_AddRef(IHTMLSelectionObject2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLSelectionObject2_Release(IHTMLSelectionObject2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLSelectionObject2_GetTypeInfoCount(IHTMLSelectionObject2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLSelectionObject2_GetTypeInfo(IHTMLSelectionObject2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSelectionObject2_createRangeCollection(IHTMLSelectionObject2* This,IDispatch **rangeCollection) {
    return This->lpVtbl->createRangeCollection(This,rangeCollection);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSelection_QueryInterface(IHTMLSelection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLSelection_AddRef(IHTMLSelection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLSelection_Release(IHTMLSelection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLSelection_GetTypeInfoCount(IHTMLSelection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLSelection_GetTypeInfo(IHTMLSelection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSelection_get_anchorNode(IHTMLSelection* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_anchorNode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelection_get_anchorOffset(IHTMLSelection* This,LONG *p) {
    return This->lpVtbl->get_anchorOffset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelection_get_focusNode(IHTMLSelection* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_focusNode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelection_get_focusOffset(IHTMLSelection* This,LONG *p) {
    return This->lpVtbl->get_focusOffset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelection_get_isCollapsed(IHTMLSelection* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isCollapsed(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelection_collapse(IHTMLSelection* This,IDispatch *parentNode,LONG offfset) {
    return This->lpVtbl->collapse(This,parentNode,offfset);
}
static __WIDL_INLINE HRESULT IHTMLSelection_collapseToStart(IHTMLSelection* This) {
    return This->lpVtbl->collapseToStart(This);
}
static __WIDL_INLINE HRESULT IHTMLSelection_collapseToEnd(IHTMLSelection* This) {
    return This->lpVtbl->collapseToEnd(This);
}
static __WIDL_INLINE HRESULT IHTMLSelection_selectAllChildren(IHTMLSelection* This,IDispatch *parentNode) {
    return This->lpVtbl->selectAllChildren(This,parentNode);
}
static __WIDL_INLINE HRESULT IHTMLSelection_deleteFromDocument(IHTMLSelection* This) {
    return This->lpVtbl->deleteFromDocument(This);
}
static __WIDL_INLINE HRESULT IHTMLSelection_get_rangeCount(IHTMLSelection* This,LONG *p) {
    return This->lpVtbl->get_rangeCount(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSelection_getRangeAt(IHTMLSelection* This,LONG index,IHTMLDOMRange **ppRange) {
    return This->lpVtbl->getRangeAt(This,index,ppRange);
}
static __WIDL_INLINE HRESULT IHTMLSelection_addRange(IHTMLSelection* This,IDispatch *range) {
    return This->lpVtbl->addRange(This,range);
}
static __WIDL_INLINE HRESULT IHTMLSelection_removeRange(IHTMLSelection* This,IDispatch *range) {
    return This->lpVtbl->removeRange(This,range);
}
static __WIDL_INLINE HRESULT IHTMLSelection_removeAllRanges(IHTMLSelection* This) {
    return This->lpVtbl->removeAllRanges(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOptionElement_QueryInterface(IHTMLOptionElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLOptionElement_AddRef(IHTMLOptionElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLOptionElement_Release(IHTMLOptionElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLOptionElement_GetTypeInfoCount(IHTMLOptionElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLOptionElement_GetTypeInfo(IHTMLOptionElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOptionElement_put_selected(IHTMLOptionElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selected(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionElement_get_selected(IHTMLOptionElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selected(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionElement_put_value(IHTMLOptionElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionElement_get_value(IHTMLOptionElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionElement_put_defaultSelected(IHTMLOptionElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_defaultSelected(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionElement_get_defaultSelected(IHTMLOptionElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_defaultSelected(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionElement_put_index(IHTMLOptionElement* This,LONG v) {
    return This->lpVtbl->put_index(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionElement_get_index(IHTMLOptionElement* This,LONG *p) {
    return This->lpVtbl->get_index(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionElement_put_text(IHTMLOptionElement* This,BSTR v) {
    return This->lpVtbl->put_text(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionElement_get_text(IHTMLOptionElement* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOptionElement3_QueryInterface(IHTMLOptionElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLOptionElement3_AddRef(IHTMLOptionElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLOptionElement3_Release(IHTMLOptionElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLOptionElement3_GetTypeInfoCount(IHTMLOptionElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLOptionElement3_GetTypeInfo(IHTMLOptionElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOptionElement3_put_label(IHTMLOptionElement3* This,BSTR v) {
    return This->lpVtbl->put_label(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOptionElement4_QueryInterface(IHTMLOptionElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLOptionElement4_AddRef(IHTMLOptionElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLOptionElement4_Release(IHTMLOptionElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLOptionElement4_GetTypeInfoCount(IHTMLOptionElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLOptionElement4_GetTypeInfo(IHTMLOptionElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOptionElement4_put_value(IHTMLOptionElement4* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOptionElementFactory_QueryInterface(IHTMLOptionElementFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLOptionElementFactory_AddRef(IHTMLOptionElementFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLOptionElementFactory_Release(IHTMLOptionElementFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLOptionElementFactory_GetTypeInfoCount(IHTMLOptionElementFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLOptionElementFactory_GetTypeInfo(IHTMLOptionElementFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLOptionElement_QueryInterface(DispHTMLOptionElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLOptionElement_AddRef(DispHTMLOptionElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLOptionElement_Release(DispHTMLOptionElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLOptionElement_GetTypeInfoCount(DispHTMLOptionElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLOptionElement_GetTypeInfo(DispHTMLOptionElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLWndOptionElement_QueryInterface(DispHTMLWndOptionElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLWndOptionElement_AddRef(DispHTMLWndOptionElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLWndOptionElement_Release(DispHTMLWndOptionElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLWndOptionElement_GetTypeInfoCount(DispHTMLWndOptionElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLWndOptionElement_GetTypeInfo(DispHTMLWndOptionElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLButtonElementEvents2_QueryInterface(HTMLButtonElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLButtonElementEvents2_AddRef(HTMLButtonElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLButtonElementEvents2_Release(HTMLButtonElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLButtonElementEvents2_GetTypeInfoCount(HTMLButtonElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLButtonElementEvents2_GetTypeInfo(HTMLButtonElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLButtonElementEvents_QueryInterface(HTMLButtonElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLButtonElementEvents_AddRef(HTMLButtonElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLButtonElementEvents_Release(HTMLButtonElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLButtonElementEvents_GetTypeInfoCount(HTMLButtonElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLButtonElementEvents_GetTypeInfo(HTMLButtonElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLInputTextElementEvents2_QueryInterface(HTMLInputTextElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLInputTextElementEvents2_AddRef(HTMLInputTextElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLInputTextElementEvents2_Release(HTMLInputTextElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLInputTextElementEvents2_GetTypeInfoCount(HTMLInputTextElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLInputTextElementEvents2_GetTypeInfo(HTMLInputTextElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLOptionButtonElementEvents2_QueryInterface(HTMLOptionButtonElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLOptionButtonElementEvents2_AddRef(HTMLOptionButtonElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLOptionButtonElementEvents2_Release(HTMLOptionButtonElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLOptionButtonElementEvents2_GetTypeInfoCount(HTMLOptionButtonElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLOptionButtonElementEvents2_GetTypeInfo(HTMLOptionButtonElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLInputFileElementEvents2_QueryInterface(HTMLInputFileElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLInputFileElementEvents2_AddRef(HTMLInputFileElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLInputFileElementEvents2_Release(HTMLInputFileElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLInputFileElementEvents2_GetTypeInfoCount(HTMLInputFileElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLInputFileElementEvents2_GetTypeInfo(HTMLInputFileElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLInputImageEvents2_QueryInterface(HTMLInputImageEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLInputImageEvents2_AddRef(HTMLInputImageEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLInputImageEvents2_Release(HTMLInputImageEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLInputImageEvents2_GetTypeInfoCount(HTMLInputImageEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLInputImageEvents2_GetTypeInfo(HTMLInputImageEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLInputTextElementEvents_QueryInterface(HTMLInputTextElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLInputTextElementEvents_AddRef(HTMLInputTextElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLInputTextElementEvents_Release(HTMLInputTextElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLInputTextElementEvents_GetTypeInfoCount(HTMLInputTextElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLInputTextElementEvents_GetTypeInfo(HTMLInputTextElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLOptionButtonElementEvents_QueryInterface(HTMLOptionButtonElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLOptionButtonElementEvents_AddRef(HTMLOptionButtonElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLOptionButtonElementEvents_Release(HTMLOptionButtonElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLOptionButtonElementEvents_GetTypeInfoCount(HTMLOptionButtonElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLOptionButtonElementEvents_GetTypeInfo(HTMLOptionButtonElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLInputFileElementEvents_QueryInterface(HTMLInputFileElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLInputFileElementEvents_AddRef(HTMLInputFileElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLInputFileElementEvents_Release(HTMLInputFileElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLInputFileElementEvents_GetTypeInfoCount(HTMLInputFileElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLInputFileElementEvents_GetTypeInfo(HTMLInputFileElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLInputImageEvents_QueryInterface(HTMLInputImageEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLInputImageEvents_AddRef(HTMLInputImageEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLInputImageEvents_Release(HTMLInputImageEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLInputImageEvents_GetTypeInfoCount(HTMLInputImageEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLInputImageEvents_GetTypeInfo(HTMLInputImageEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputElement_QueryInterface(IHTMLInputElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLInputElement_AddRef(IHTMLInputElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLInputElement_Release(IHTMLInputElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLInputElement_GetTypeInfoCount(IHTMLInputElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_GetTypeInfo(IHTMLInputElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputElement_put_type(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_type(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_value(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_value(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_name(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_name(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_status(IHTMLInputElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_status(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_status(IHTMLInputElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_status(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_disabled(IHTMLInputElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_disabled(IHTMLInputElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_form(IHTMLInputElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_size(IHTMLInputElement* This,LONG v) {
    return This->lpVtbl->put_size(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_size(IHTMLInputElement* This,LONG *p) {
    return This->lpVtbl->get_size(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_maxLength(IHTMLInputElement* This,LONG v) {
    return This->lpVtbl->put_maxLength(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_maxLength(IHTMLInputElement* This,LONG *p) {
    return This->lpVtbl->get_maxLength(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_select(IHTMLInputElement* This) {
    return This->lpVtbl->select(This);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_onchange(IHTMLInputElement* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_onchange(IHTMLInputElement* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_onselect(IHTMLInputElement* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_onselect(IHTMLInputElement* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_defaultValue(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_defaultValue(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_defaultValue(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_defaultValue(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_readOnly(IHTMLInputElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_readOnly(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_readOnly(IHTMLInputElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_readOnly(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_createTextRange(IHTMLInputElement* This,IHTMLTxtRange **range) {
    return This->lpVtbl->createTextRange(This,range);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_indeterminate(IHTMLInputElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_indeterminate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_indeterminate(IHTMLInputElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_indeterminate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_defaultChecked(IHTMLInputElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_defaultChecked(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_defaultChecked(IHTMLInputElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_defaultChecked(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_checked(IHTMLInputElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_checked(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_checked(IHTMLInputElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_checked(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_border(IHTMLInputElement* This,VARIANT v) {
    return This->lpVtbl->put_border(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_border(IHTMLInputElement* This,VARIANT *p) {
    return This->lpVtbl->get_border(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_vspace(IHTMLInputElement* This,LONG v) {
    return This->lpVtbl->put_vspace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_vspace(IHTMLInputElement* This,LONG *p) {
    return This->lpVtbl->get_vspace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_hspace(IHTMLInputElement* This,LONG v) {
    return This->lpVtbl->put_hspace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_hspace(IHTMLInputElement* This,LONG *p) {
    return This->lpVtbl->get_hspace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_alt(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_alt(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_alt(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_alt(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_src(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_src(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_lowsrc(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_lowsrc(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_lowsrc(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_lowsrc(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_vrml(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_vrml(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_vrml(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_vrml(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_dynsrc(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_dynsrc(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_dynsrc(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_dynsrc(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_readyState(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_complete(IHTMLInputElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_complete(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_loop(IHTMLInputElement* This,VARIANT v) {
    return This->lpVtbl->put_loop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_loop(IHTMLInputElement* This,VARIANT *p) {
    return This->lpVtbl->get_loop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_align(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_align(IHTMLInputElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_onload(IHTMLInputElement* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_onload(IHTMLInputElement* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_onerror(IHTMLInputElement* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_onerror(IHTMLInputElement* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_onabort(IHTMLInputElement* This,VARIANT v) {
    return This->lpVtbl->put_onabort(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_onabort(IHTMLInputElement* This,VARIANT *p) {
    return This->lpVtbl->get_onabort(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_width(IHTMLInputElement* This,LONG v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_width(IHTMLInputElement* This,LONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_height(IHTMLInputElement* This,LONG v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_get_height(IHTMLInputElement* This,LONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement_put_start(IHTMLInputElement* This,BSTR v) {
    return This->lpVtbl->put_start(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputElement2_QueryInterface(IHTMLInputElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLInputElement2_AddRef(IHTMLInputElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLInputElement2_Release(IHTMLInputElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLInputElement2_GetTypeInfoCount(IHTMLInputElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLInputElement2_GetTypeInfo(IHTMLInputElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputElement2_put_accept(IHTMLInputElement2* This,BSTR v) {
    return This->lpVtbl->put_accept(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement2_get_accept(IHTMLInputElement2* This,BSTR *p) {
    return This->lpVtbl->get_accept(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement2_put_useMap(IHTMLInputElement2* This,BSTR v) {
    return This->lpVtbl->put_useMap(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputElement3_QueryInterface(IHTMLInputElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLInputElement3_AddRef(IHTMLInputElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLInputElement3_Release(IHTMLInputElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLInputElement3_GetTypeInfoCount(IHTMLInputElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLInputElement3_GetTypeInfo(IHTMLInputElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputElement3_put_src(IHTMLInputElement3* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement3_get_src(IHTMLInputElement3* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement3_put_lowsrc(IHTMLInputElement3* This,BSTR v) {
    return This->lpVtbl->put_lowsrc(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement3_get_lowsrc(IHTMLInputElement3* This,BSTR *p) {
    return This->lpVtbl->get_lowsrc(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement3_put_vrml(IHTMLInputElement3* This,BSTR v) {
    return This->lpVtbl->put_vrml(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputElement3_get_vrml(IHTMLInputElement3* This,BSTR *p) {
    return This->lpVtbl->get_vrml(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputElement3_put_dynsrc(IHTMLInputElement3* This,BSTR v) {
    return This->lpVtbl->put_dynsrc(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputButtonElement_QueryInterface(IHTMLInputButtonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLInputButtonElement_AddRef(IHTMLInputButtonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLInputButtonElement_Release(IHTMLInputButtonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLInputButtonElement_GetTypeInfoCount(IHTMLInputButtonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLInputButtonElement_GetTypeInfo(IHTMLInputButtonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputButtonElement_get_type(IHTMLInputButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputButtonElement_put_value(IHTMLInputButtonElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputButtonElement_get_value(IHTMLInputButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputButtonElement_put_name(IHTMLInputButtonElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputButtonElement_get_name(IHTMLInputButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputButtonElement_put_status(IHTMLInputButtonElement* This,VARIANT v) {
    return This->lpVtbl->put_status(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputButtonElement_get_status(IHTMLInputButtonElement* This,VARIANT *p) {
    return This->lpVtbl->get_status(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputButtonElement_put_disabled(IHTMLInputButtonElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputButtonElement_get_disabled(IHTMLInputButtonElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputButtonElement_get_form(IHTMLInputButtonElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputHiddenElement_QueryInterface(IHTMLInputHiddenElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLInputHiddenElement_AddRef(IHTMLInputHiddenElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLInputHiddenElement_Release(IHTMLInputHiddenElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLInputHiddenElement_GetTypeInfoCount(IHTMLInputHiddenElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLInputHiddenElement_GetTypeInfo(IHTMLInputHiddenElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputHiddenElement_get_type(IHTMLInputHiddenElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputHiddenElement_put_value(IHTMLInputHiddenElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputHiddenElement_get_value(IHTMLInputHiddenElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputHiddenElement_put_name(IHTMLInputHiddenElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputHiddenElement_get_name(IHTMLInputHiddenElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputHiddenElement_put_status(IHTMLInputHiddenElement* This,VARIANT v) {
    return This->lpVtbl->put_status(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputHiddenElement_get_status(IHTMLInputHiddenElement* This,VARIANT *p) {
    return This->lpVtbl->get_status(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputHiddenElement_put_disabled(IHTMLInputHiddenElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputHiddenElement_get_disabled(IHTMLInputHiddenElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputHiddenElement_get_form(IHTMLInputHiddenElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputTextElement_QueryInterface(IHTMLInputTextElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLInputTextElement_AddRef(IHTMLInputTextElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLInputTextElement_Release(IHTMLInputTextElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLInputTextElement_GetTypeInfoCount(IHTMLInputTextElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_GetTypeInfo(IHTMLInputTextElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputTextElement_get_type(IHTMLInputTextElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_put_value(IHTMLInputTextElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_get_value(IHTMLInputTextElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_put_name(IHTMLInputTextElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_get_name(IHTMLInputTextElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_put_status(IHTMLInputTextElement* This,VARIANT v) {
    return This->lpVtbl->put_status(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_get_status(IHTMLInputTextElement* This,VARIANT *p) {
    return This->lpVtbl->get_status(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_put_disabled(IHTMLInputTextElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_get_disabled(IHTMLInputTextElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_get_form(IHTMLInputTextElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_put_defaultValue(IHTMLInputTextElement* This,BSTR v) {
    return This->lpVtbl->put_defaultValue(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_get_defaultValue(IHTMLInputTextElement* This,BSTR *p) {
    return This->lpVtbl->get_defaultValue(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_put_size(IHTMLInputTextElement* This,LONG v) {
    return This->lpVtbl->put_size(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_get_size(IHTMLInputTextElement* This,LONG *p) {
    return This->lpVtbl->get_size(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_put_maxLength(IHTMLInputTextElement* This,LONG v) {
    return This->lpVtbl->put_maxLength(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_get_maxLength(IHTMLInputTextElement* This,LONG *p) {
    return This->lpVtbl->get_maxLength(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_select(IHTMLInputTextElement* This) {
    return This->lpVtbl->select(This);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_put_onchange(IHTMLInputTextElement* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_get_onchange(IHTMLInputTextElement* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_put_onselect(IHTMLInputTextElement* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_get_onselect(IHTMLInputTextElement* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_put_readOnly(IHTMLInputTextElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_readOnly(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement_get_readOnly(IHTMLInputTextElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_readOnly(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputTextElement2_QueryInterface(IHTMLInputTextElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLInputTextElement2_AddRef(IHTMLInputTextElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLInputTextElement2_Release(IHTMLInputTextElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLInputTextElement2_GetTypeInfoCount(IHTMLInputTextElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement2_GetTypeInfo(IHTMLInputTextElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputTextElement2_put_selectionStart(IHTMLInputTextElement2* This,LONG v) {
    return This->lpVtbl->put_selectionStart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement2_get_selectionStart(IHTMLInputTextElement2* This,LONG *p) {
    return This->lpVtbl->get_selectionStart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement2_put_selectionEnd(IHTMLInputTextElement2* This,LONG v) {
    return This->lpVtbl->put_selectionEnd(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputTextElement2_get_selectionEnd(IHTMLInputTextElement2* This,LONG *p) {
    return This->lpVtbl->get_selectionEnd(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputFileElement_QueryInterface(IHTMLInputFileElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLInputFileElement_AddRef(IHTMLInputFileElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLInputFileElement_Release(IHTMLInputFileElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLInputFileElement_GetTypeInfoCount(IHTMLInputFileElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_GetTypeInfo(IHTMLInputFileElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputFileElement_get_type(IHTMLInputFileElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_put_name(IHTMLInputFileElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_get_name(IHTMLInputFileElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_put_status(IHTMLInputFileElement* This,VARIANT v) {
    return This->lpVtbl->put_status(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_get_status(IHTMLInputFileElement* This,VARIANT *p) {
    return This->lpVtbl->get_status(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_put_disabled(IHTMLInputFileElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_get_disabled(IHTMLInputFileElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_get_form(IHTMLInputFileElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_put_size(IHTMLInputFileElement* This,LONG v) {
    return This->lpVtbl->put_size(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_get_size(IHTMLInputFileElement* This,LONG *p) {
    return This->lpVtbl->get_size(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_put_maxLength(IHTMLInputFileElement* This,LONG v) {
    return This->lpVtbl->put_maxLength(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_get_maxLength(IHTMLInputFileElement* This,LONG *p) {
    return This->lpVtbl->get_maxLength(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_select(IHTMLInputFileElement* This) {
    return This->lpVtbl->select(This);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_put_onchange(IHTMLInputFileElement* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_get_onchange(IHTMLInputFileElement* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_put_onselect(IHTMLInputFileElement* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_get_onselect(IHTMLInputFileElement* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputFileElement_put_value(IHTMLInputFileElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOptionButtonElement_QueryInterface(IHTMLOptionButtonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLOptionButtonElement_AddRef(IHTMLOptionButtonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLOptionButtonElement_Release(IHTMLOptionButtonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_GetTypeInfoCount(IHTMLOptionButtonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_GetTypeInfo(IHTMLOptionButtonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOptionButtonElement_put_value(IHTMLOptionButtonElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_get_value(IHTMLOptionButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_get_type(IHTMLOptionButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_put_name(IHTMLOptionButtonElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_get_name(IHTMLOptionButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_put_checked(IHTMLOptionButtonElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_checked(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_get_checked(IHTMLOptionButtonElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_checked(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_put_defaultChecked(IHTMLOptionButtonElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_defaultChecked(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_get_defaultChecked(IHTMLOptionButtonElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_defaultChecked(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_put_onchange(IHTMLOptionButtonElement* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_get_onchange(IHTMLOptionButtonElement* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_put_disabled(IHTMLOptionButtonElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_get_disabled(IHTMLOptionButtonElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_put_status(IHTMLOptionButtonElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_status(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_get_status(IHTMLOptionButtonElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_status(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_put_indeterminate(IHTMLOptionButtonElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_indeterminate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionButtonElement_get_indeterminate(IHTMLOptionButtonElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_indeterminate(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputImage_QueryInterface(IHTMLInputImage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLInputImage_AddRef(IHTMLInputImage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLInputImage_Release(IHTMLInputImage* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLInputImage_GetTypeInfoCount(IHTMLInputImage* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_GetTypeInfo(IHTMLInputImage* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputImage_get_type(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_disabled(IHTMLInputImage* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_disabled(IHTMLInputImage* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_border(IHTMLInputImage* This,VARIANT v) {
    return This->lpVtbl->put_border(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_border(IHTMLInputImage* This,VARIANT *p) {
    return This->lpVtbl->get_border(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_vspace(IHTMLInputImage* This,LONG v) {
    return This->lpVtbl->put_vspace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_vspace(IHTMLInputImage* This,LONG *p) {
    return This->lpVtbl->get_vspace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_hspace(IHTMLInputImage* This,LONG v) {
    return This->lpVtbl->put_hspace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_hspace(IHTMLInputImage* This,LONG *p) {
    return This->lpVtbl->get_hspace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_alt(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_alt(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_alt(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_alt(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_src(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_src(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_lowsrc(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_lowsrc(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_lowsrc(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_lowsrc(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_vrml(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_vrml(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_vrml(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_vrml(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_dynsrc(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_dynsrc(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_dynsrc(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_dynsrc(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_readyState(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_complete(IHTMLInputImage* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_complete(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_loop(IHTMLInputImage* This,VARIANT v) {
    return This->lpVtbl->put_loop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_loop(IHTMLInputImage* This,VARIANT *p) {
    return This->lpVtbl->get_loop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_align(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_align(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_onload(IHTMLInputImage* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_onload(IHTMLInputImage* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_onerror(IHTMLInputImage* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_onerror(IHTMLInputImage* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_onabort(IHTMLInputImage* This,VARIANT v) {
    return This->lpVtbl->put_onabort(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_onabort(IHTMLInputImage* This,VARIANT *p) {
    return This->lpVtbl->get_onabort(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_name(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_name(IHTMLInputImage* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_width(IHTMLInputImage* This,LONG v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_width(IHTMLInputImage* This,LONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_height(IHTMLInputImage* This,LONG v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_get_height(IHTMLInputImage* This,LONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputImage_put_start(IHTMLInputImage* This,BSTR v) {
    return This->lpVtbl->put_start(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputRangeElement_QueryInterface(IHTMLInputRangeElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLInputRangeElement_AddRef(IHTMLInputRangeElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLInputRangeElement_Release(IHTMLInputRangeElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_GetTypeInfoCount(IHTMLInputRangeElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_GetTypeInfo(IHTMLInputRangeElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLInputRangeElement_put_disabled(IHTMLInputRangeElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_get_disabled(IHTMLInputRangeElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_get_type(IHTMLInputRangeElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_put_alt(IHTMLInputRangeElement* This,BSTR v) {
    return This->lpVtbl->put_alt(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_get_alt(IHTMLInputRangeElement* This,BSTR *p) {
    return This->lpVtbl->get_alt(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_put_name(IHTMLInputRangeElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_get_name(IHTMLInputRangeElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_put_value(IHTMLInputRangeElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_get_value(IHTMLInputRangeElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_put_min(IHTMLInputRangeElement* This,BSTR v) {
    return This->lpVtbl->put_min(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_get_min(IHTMLInputRangeElement* This,BSTR *p) {
    return This->lpVtbl->get_min(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_put_max(IHTMLInputRangeElement* This,BSTR v) {
    return This->lpVtbl->put_max(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_get_max(IHTMLInputRangeElement* This,BSTR *p) {
    return This->lpVtbl->get_max(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_put_step(IHTMLInputRangeElement* This,BSTR v) {
    return This->lpVtbl->put_step(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_get_step(IHTMLInputRangeElement* This,BSTR *p) {
    return This->lpVtbl->get_step(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_put_valueAsNumber(IHTMLInputRangeElement* This,double v) {
    return This->lpVtbl->put_valueAsNumber(This,v);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_get_valueAsNumber(IHTMLInputRangeElement* This,double *p) {
    return This->lpVtbl->get_valueAsNumber(This,p);
}
static __WIDL_INLINE HRESULT IHTMLInputRangeElement_stepUp(IHTMLInputRangeElement* This,LONG n) {
    return This->lpVtbl->stepUp(This,n);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLInputElement_QueryInterface(DispHTMLInputElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLInputElement_AddRef(DispHTMLInputElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLInputElement_Release(DispHTMLInputElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLInputElement_GetTypeInfoCount(DispHTMLInputElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLInputElement_GetTypeInfo(DispHTMLInputElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTextAreaElement_QueryInterface(IHTMLTextAreaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTextAreaElement_AddRef(IHTMLTextAreaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTextAreaElement_Release(IHTMLTextAreaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_GetTypeInfoCount(IHTMLTextAreaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_GetTypeInfo(IHTMLTextAreaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTextAreaElement_get_type(IHTMLTextAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_put_value(IHTMLTextAreaElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_get_value(IHTMLTextAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_put_name(IHTMLTextAreaElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_get_name(IHTMLTextAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_put_status(IHTMLTextAreaElement* This,VARIANT v) {
    return This->lpVtbl->put_status(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_get_status(IHTMLTextAreaElement* This,VARIANT *p) {
    return This->lpVtbl->get_status(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_put_disabled(IHTMLTextAreaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_get_disabled(IHTMLTextAreaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_get_form(IHTMLTextAreaElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_put_defaultValue(IHTMLTextAreaElement* This,BSTR v) {
    return This->lpVtbl->put_defaultValue(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_get_defaultValue(IHTMLTextAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_defaultValue(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_select(IHTMLTextAreaElement* This) {
    return This->lpVtbl->select(This);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_put_onchange(IHTMLTextAreaElement* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_get_onchange(IHTMLTextAreaElement* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_put_onselect(IHTMLTextAreaElement* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_get_onselect(IHTMLTextAreaElement* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_put_readOnly(IHTMLTextAreaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_readOnly(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_get_readOnly(IHTMLTextAreaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_readOnly(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_put_rows(IHTMLTextAreaElement* This,LONG v) {
    return This->lpVtbl->put_rows(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_get_rows(IHTMLTextAreaElement* This,LONG *p) {
    return This->lpVtbl->get_rows(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_put_cols(IHTMLTextAreaElement* This,LONG v) {
    return This->lpVtbl->put_cols(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_get_cols(IHTMLTextAreaElement* This,LONG *p) {
    return This->lpVtbl->get_cols(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_put_wrap(IHTMLTextAreaElement* This,BSTR v) {
    return This->lpVtbl->put_wrap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement_get_wrap(IHTMLTextAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_wrap(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTextAreaElement2_QueryInterface(IHTMLTextAreaElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTextAreaElement2_AddRef(IHTMLTextAreaElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTextAreaElement2_Release(IHTMLTextAreaElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTextAreaElement2_GetTypeInfoCount(IHTMLTextAreaElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement2_GetTypeInfo(IHTMLTextAreaElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTextAreaElement2_put_selectionStart(IHTMLTextAreaElement2* This,LONG v) {
    return This->lpVtbl->put_selectionStart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement2_get_selectionStart(IHTMLTextAreaElement2* This,LONG *p) {
    return This->lpVtbl->get_selectionStart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement2_put_selectionEnd(IHTMLTextAreaElement2* This,LONG v) {
    return This->lpVtbl->put_selectionEnd(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTextAreaElement2_get_selectionEnd(IHTMLTextAreaElement2* This,LONG *p) {
    return This->lpVtbl->get_selectionEnd(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLTextAreaElement_QueryInterface(DispHTMLTextAreaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLTextAreaElement_AddRef(DispHTMLTextAreaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLTextAreaElement_Release(DispHTMLTextAreaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLTextAreaElement_GetTypeInfoCount(DispHTMLTextAreaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLTextAreaElement_GetTypeInfo(DispHTMLTextAreaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLRichtextElement_QueryInterface(DispHTMLRichtextElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLRichtextElement_AddRef(DispHTMLRichtextElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLRichtextElement_Release(DispHTMLRichtextElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLRichtextElement_GetTypeInfoCount(DispHTMLRichtextElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLRichtextElement_GetTypeInfo(DispHTMLRichtextElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLButtonElement_QueryInterface(IHTMLButtonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLButtonElement_AddRef(IHTMLButtonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLButtonElement_Release(IHTMLButtonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLButtonElement_GetTypeInfoCount(IHTMLButtonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLButtonElement_GetTypeInfo(IHTMLButtonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLButtonElement_get_type(IHTMLButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLButtonElement_put_value(IHTMLButtonElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLButtonElement_get_value(IHTMLButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLButtonElement_put_name(IHTMLButtonElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLButtonElement_get_name(IHTMLButtonElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLButtonElement_put_status(IHTMLButtonElement* This,VARIANT v) {
    return This->lpVtbl->put_status(This,v);
}
static __WIDL_INLINE HRESULT IHTMLButtonElement_get_status(IHTMLButtonElement* This,VARIANT *p) {
    return This->lpVtbl->get_status(This,p);
}
static __WIDL_INLINE HRESULT IHTMLButtonElement_put_disabled(IHTMLButtonElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLButtonElement_get_disabled(IHTMLButtonElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLButtonElement_get_form(IHTMLButtonElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLButtonElement2_QueryInterface(IHTMLButtonElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLButtonElement2_AddRef(IHTMLButtonElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLButtonElement2_Release(IHTMLButtonElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLButtonElement2_GetTypeInfoCount(IHTMLButtonElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLButtonElement2_GetTypeInfo(IHTMLButtonElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLButtonElement2_put_type(IHTMLButtonElement2* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLButtonElement_QueryInterface(DispHTMLButtonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLButtonElement_AddRef(DispHTMLButtonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLButtonElement_Release(DispHTMLButtonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLButtonElement_GetTypeInfoCount(DispHTMLButtonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLButtonElement_GetTypeInfo(DispHTMLButtonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLMarqueeElementEvents2_QueryInterface(HTMLMarqueeElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLMarqueeElementEvents2_AddRef(HTMLMarqueeElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLMarqueeElementEvents2_Release(HTMLMarqueeElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLMarqueeElementEvents2_GetTypeInfoCount(HTMLMarqueeElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLMarqueeElementEvents2_GetTypeInfo(HTMLMarqueeElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLMarqueeElementEvents_QueryInterface(HTMLMarqueeElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLMarqueeElementEvents_AddRef(HTMLMarqueeElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLMarqueeElementEvents_Release(HTMLMarqueeElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLMarqueeElementEvents_GetTypeInfoCount(HTMLMarqueeElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLMarqueeElementEvents_GetTypeInfo(HTMLMarqueeElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMarqueeElement_QueryInterface(IHTMLMarqueeElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLMarqueeElement_AddRef(IHTMLMarqueeElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLMarqueeElement_Release(IHTMLMarqueeElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_GetTypeInfoCount(IHTMLMarqueeElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_GetTypeInfo(IHTMLMarqueeElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMarqueeElement_put_bgColor(IHTMLMarqueeElement* This,VARIANT v) {
    return This->lpVtbl->put_bgColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_get_bgColor(IHTMLMarqueeElement* This,VARIANT *p) {
    return This->lpVtbl->get_bgColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_put_scrollDelay(IHTMLMarqueeElement* This,LONG v) {
    return This->lpVtbl->put_scrollDelay(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_get_scrollDelay(IHTMLMarqueeElement* This,LONG *p) {
    return This->lpVtbl->get_scrollDelay(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_put_direction(IHTMLMarqueeElement* This,BSTR v) {
    return This->lpVtbl->put_direction(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_get_direction(IHTMLMarqueeElement* This,BSTR *p) {
    return This->lpVtbl->get_direction(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_put_behavior(IHTMLMarqueeElement* This,BSTR v) {
    return This->lpVtbl->put_behavior(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_get_behavior(IHTMLMarqueeElement* This,BSTR *p) {
    return This->lpVtbl->get_behavior(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_put_scrollAmount(IHTMLMarqueeElement* This,LONG v) {
    return This->lpVtbl->put_scrollAmount(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_get_scrollAmount(IHTMLMarqueeElement* This,LONG *p) {
    return This->lpVtbl->get_scrollAmount(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_put_loop(IHTMLMarqueeElement* This,LONG v) {
    return This->lpVtbl->put_loop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_get_loop(IHTMLMarqueeElement* This,LONG *p) {
    return This->lpVtbl->get_loop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_put_vspace(IHTMLMarqueeElement* This,LONG v) {
    return This->lpVtbl->put_vspace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_get_vspace(IHTMLMarqueeElement* This,LONG *p) {
    return This->lpVtbl->get_vspace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_put_hspace(IHTMLMarqueeElement* This,LONG v) {
    return This->lpVtbl->put_hspace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_get_hspace(IHTMLMarqueeElement* This,LONG *p) {
    return This->lpVtbl->get_hspace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_put_onfinish(IHTMLMarqueeElement* This,VARIANT v) {
    return This->lpVtbl->put_onfinish(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_get_onfinish(IHTMLMarqueeElement* This,VARIANT *p) {
    return This->lpVtbl->get_onfinish(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_put_onstart(IHTMLMarqueeElement* This,VARIANT v) {
    return This->lpVtbl->put_onstart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_get_onstart(IHTMLMarqueeElement* This,VARIANT *p) {
    return This->lpVtbl->get_onstart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_put_onbounce(IHTMLMarqueeElement* This,VARIANT v) {
    return This->lpVtbl->put_onbounce(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_get_onbounce(IHTMLMarqueeElement* This,VARIANT *p) {
    return This->lpVtbl->get_onbounce(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_put_width(IHTMLMarqueeElement* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_get_width(IHTMLMarqueeElement* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_put_height(IHTMLMarqueeElement* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_get_height(IHTMLMarqueeElement* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_put_trueSpeed(IHTMLMarqueeElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_trueSpeed(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_get_trueSpeed(IHTMLMarqueeElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_trueSpeed(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMarqueeElement_start(IHTMLMarqueeElement* This) {
    return This->lpVtbl->start(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLMarqueeElement_QueryInterface(DispHTMLMarqueeElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLMarqueeElement_AddRef(DispHTMLMarqueeElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLMarqueeElement_Release(DispHTMLMarqueeElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLMarqueeElement_GetTypeInfoCount(DispHTMLMarqueeElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLMarqueeElement_GetTypeInfo(DispHTMLMarqueeElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLHtmlElement_QueryInterface(IHTMLHtmlElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLHtmlElement_AddRef(IHTMLHtmlElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLHtmlElement_Release(IHTMLHtmlElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLHtmlElement_GetTypeInfoCount(IHTMLHtmlElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLHtmlElement_GetTypeInfo(IHTMLHtmlElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLHtmlElement_put_version(IHTMLHtmlElement* This,BSTR v) {
    return This->lpVtbl->put_version(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLHeadElement_QueryInterface(IHTMLHeadElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLHeadElement_AddRef(IHTMLHeadElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLHeadElement_Release(IHTMLHeadElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLHeadElement_GetTypeInfoCount(IHTMLHeadElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLHeadElement_GetTypeInfo(IHTMLHeadElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLHeadElement_put_profile(IHTMLHeadElement* This,BSTR v) {
    return This->lpVtbl->put_profile(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLHeadElement2_QueryInterface(IHTMLHeadElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLHeadElement2_AddRef(IHTMLHeadElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLHeadElement2_Release(IHTMLHeadElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLHeadElement2_GetTypeInfoCount(IHTMLHeadElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLHeadElement2_GetTypeInfo(IHTMLHeadElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLHeadElement2_put_profile(IHTMLHeadElement2* This,BSTR v) {
    return This->lpVtbl->put_profile(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTitleElement_QueryInterface(IHTMLTitleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTitleElement_AddRef(IHTMLTitleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTitleElement_Release(IHTMLTitleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTitleElement_GetTypeInfoCount(IHTMLTitleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTitleElement_GetTypeInfo(IHTMLTitleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTitleElement_put_text(IHTMLTitleElement* This,BSTR v) {
    return This->lpVtbl->put_text(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMetaElement_QueryInterface(IHTMLMetaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLMetaElement_AddRef(IHTMLMetaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLMetaElement_Release(IHTMLMetaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLMetaElement_GetTypeInfoCount(IHTMLMetaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLMetaElement_GetTypeInfo(IHTMLMetaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMetaElement_put_httpEquiv(IHTMLMetaElement* This,BSTR v) {
    return This->lpVtbl->put_httpEquiv(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMetaElement_get_httpEquiv(IHTMLMetaElement* This,BSTR *p) {
    return This->lpVtbl->get_httpEquiv(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMetaElement_put_content(IHTMLMetaElement* This,BSTR v) {
    return This->lpVtbl->put_content(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMetaElement_get_content(IHTMLMetaElement* This,BSTR *p) {
    return This->lpVtbl->get_content(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMetaElement_put_name(IHTMLMetaElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMetaElement_get_name(IHTMLMetaElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMetaElement_put_url(IHTMLMetaElement* This,BSTR v) {
    return This->lpVtbl->put_url(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMetaElement_get_url(IHTMLMetaElement* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMetaElement_put_charset(IHTMLMetaElement* This,BSTR v) {
    return This->lpVtbl->put_charset(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMetaElement2_QueryInterface(IHTMLMetaElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLMetaElement2_AddRef(IHTMLMetaElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLMetaElement2_Release(IHTMLMetaElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLMetaElement2_GetTypeInfoCount(IHTMLMetaElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLMetaElement2_GetTypeInfo(IHTMLMetaElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMetaElement2_put_scheme(IHTMLMetaElement2* This,BSTR v) {
    return This->lpVtbl->put_scheme(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMetaElement3_QueryInterface(IHTMLMetaElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLMetaElement3_AddRef(IHTMLMetaElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLMetaElement3_Release(IHTMLMetaElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLMetaElement3_GetTypeInfoCount(IHTMLMetaElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLMetaElement3_GetTypeInfo(IHTMLMetaElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMetaElement3_put_url(IHTMLMetaElement3* This,BSTR v) {
    return This->lpVtbl->put_url(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBaseElement_QueryInterface(IHTMLBaseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLBaseElement_AddRef(IHTMLBaseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLBaseElement_Release(IHTMLBaseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLBaseElement_GetTypeInfoCount(IHTMLBaseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLBaseElement_GetTypeInfo(IHTMLBaseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBaseElement_put_href(IHTMLBaseElement* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBaseElement_get_href(IHTMLBaseElement* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBaseElement_put_target(IHTMLBaseElement* This,BSTR v) {
    return This->lpVtbl->put_target(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBaseElement2_QueryInterface(IHTMLBaseElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLBaseElement2_AddRef(IHTMLBaseElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLBaseElement2_Release(IHTMLBaseElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLBaseElement2_GetTypeInfoCount(IHTMLBaseElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLBaseElement2_GetTypeInfo(IHTMLBaseElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBaseElement2_put_href(IHTMLBaseElement2* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLIsIndexElement_QueryInterface(IHTMLIsIndexElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLIsIndexElement_AddRef(IHTMLIsIndexElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLIsIndexElement_Release(IHTMLIsIndexElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLIsIndexElement_GetTypeInfoCount(IHTMLIsIndexElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLIsIndexElement_GetTypeInfo(IHTMLIsIndexElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLIsIndexElement_put_prompt(IHTMLIsIndexElement* This,BSTR v) {
    return This->lpVtbl->put_prompt(This,v);
}
static __WIDL_INLINE HRESULT IHTMLIsIndexElement_get_prompt(IHTMLIsIndexElement* This,BSTR *p) {
    return This->lpVtbl->get_prompt(This,p);
}
static __WIDL_INLINE HRESULT IHTMLIsIndexElement_put_action(IHTMLIsIndexElement* This,BSTR v) {
    return This->lpVtbl->put_action(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLIsIndexElement2_QueryInterface(IHTMLIsIndexElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLIsIndexElement2_AddRef(IHTMLIsIndexElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLIsIndexElement2_Release(IHTMLIsIndexElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLIsIndexElement2_GetTypeInfoCount(IHTMLIsIndexElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLIsIndexElement2_GetTypeInfo(IHTMLIsIndexElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLNextIdElement_QueryInterface(IHTMLNextIdElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLNextIdElement_AddRef(IHTMLNextIdElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLNextIdElement_Release(IHTMLNextIdElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLNextIdElement_GetTypeInfoCount(IHTMLNextIdElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLNextIdElement_GetTypeInfo(IHTMLNextIdElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLNextIdElement_put_n(IHTMLNextIdElement* This,BSTR v) {
    return This->lpVtbl->put_n(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLHtmlElement_QueryInterface(DispHTMLHtmlElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLHtmlElement_AddRef(DispHTMLHtmlElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLHtmlElement_Release(DispHTMLHtmlElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLHtmlElement_GetTypeInfoCount(DispHTMLHtmlElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLHtmlElement_GetTypeInfo(DispHTMLHtmlElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLHeadElement_QueryInterface(DispHTMLHeadElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLHeadElement_AddRef(DispHTMLHeadElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLHeadElement_Release(DispHTMLHeadElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLHeadElement_GetTypeInfoCount(DispHTMLHeadElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLHeadElement_GetTypeInfo(DispHTMLHeadElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLTitleElement_QueryInterface(DispHTMLTitleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLTitleElement_AddRef(DispHTMLTitleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLTitleElement_Release(DispHTMLTitleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLTitleElement_GetTypeInfoCount(DispHTMLTitleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLTitleElement_GetTypeInfo(DispHTMLTitleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLMetaElement_QueryInterface(DispHTMLMetaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLMetaElement_AddRef(DispHTMLMetaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLMetaElement_Release(DispHTMLMetaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLMetaElement_GetTypeInfoCount(DispHTMLMetaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLMetaElement_GetTypeInfo(DispHTMLMetaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLBaseElement_QueryInterface(DispHTMLBaseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLBaseElement_AddRef(DispHTMLBaseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLBaseElement_Release(DispHTMLBaseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLBaseElement_GetTypeInfoCount(DispHTMLBaseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLBaseElement_GetTypeInfo(DispHTMLBaseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLIsIndexElement_QueryInterface(DispHTMLIsIndexElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLIsIndexElement_AddRef(DispHTMLIsIndexElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLIsIndexElement_Release(DispHTMLIsIndexElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLIsIndexElement_GetTypeInfoCount(DispHTMLIsIndexElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLIsIndexElement_GetTypeInfo(DispHTMLIsIndexElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLNextIdElement_QueryInterface(DispHTMLNextIdElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLNextIdElement_AddRef(DispHTMLNextIdElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLNextIdElement_Release(DispHTMLNextIdElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLNextIdElement_GetTypeInfoCount(DispHTMLNextIdElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLNextIdElement_GetTypeInfo(DispHTMLNextIdElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBaseFontElement_QueryInterface(IHTMLBaseFontElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLBaseFontElement_AddRef(IHTMLBaseFontElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLBaseFontElement_Release(IHTMLBaseFontElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLBaseFontElement_GetTypeInfoCount(IHTMLBaseFontElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLBaseFontElement_GetTypeInfo(IHTMLBaseFontElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBaseFontElement_put_color(IHTMLBaseFontElement* This,VARIANT v) {
    return This->lpVtbl->put_color(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBaseFontElement_get_color(IHTMLBaseFontElement* This,VARIANT *p) {
    return This->lpVtbl->get_color(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBaseFontElement_put_face(IHTMLBaseFontElement* This,BSTR v) {
    return This->lpVtbl->put_face(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBaseFontElement_get_face(IHTMLBaseFontElement* This,BSTR *p) {
    return This->lpVtbl->get_face(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBaseFontElement_put_size(IHTMLBaseFontElement* This,LONG v) {
    return This->lpVtbl->put_size(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLBaseFontElement_QueryInterface(DispHTMLBaseFontElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLBaseFontElement_AddRef(DispHTMLBaseFontElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLBaseFontElement_Release(DispHTMLBaseFontElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLBaseFontElement_GetTypeInfoCount(DispHTMLBaseFontElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLBaseFontElement_GetTypeInfo(DispHTMLBaseFontElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLUnknownElement_QueryInterface(IHTMLUnknownElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLUnknownElement_AddRef(IHTMLUnknownElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLUnknownElement_Release(IHTMLUnknownElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLUnknownElement_GetTypeInfoCount(IHTMLUnknownElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLUnknownElement_GetTypeInfo(IHTMLUnknownElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLUnknownElement_QueryInterface(DispHTMLUnknownElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLUnknownElement_AddRef(DispHTMLUnknownElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLUnknownElement_Release(DispHTMLUnknownElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLUnknownElement_GetTypeInfoCount(DispHTMLUnknownElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLUnknownElement_GetTypeInfo(DispHTMLUnknownElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IOmHistory_QueryInterface(IOmHistory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IOmHistory_AddRef(IOmHistory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IOmHistory_Release(IOmHistory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IOmHistory_GetTypeInfoCount(IOmHistory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IOmHistory_GetTypeInfo(IOmHistory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IOmHistory_get_length(IOmHistory* This,short *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IOmHistory_back(IOmHistory* This,VARIANT *pvargdistance) {
    return This->lpVtbl->back(This,pvargdistance);
}
static __WIDL_INLINE HRESULT IOmHistory_forward(IOmHistory* This,VARIANT *pvargdistance) {
    return This->lpVtbl->forward(This,pvargdistance);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMimeTypesCollection_QueryInterface(IHTMLMimeTypesCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLMimeTypesCollection_AddRef(IHTMLMimeTypesCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLMimeTypesCollection_Release(IHTMLMimeTypesCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLMimeTypesCollection_GetTypeInfoCount(IHTMLMimeTypesCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLMimeTypesCollection_GetTypeInfo(IHTMLMimeTypesCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPluginsCollection_QueryInterface(IHTMLPluginsCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLPluginsCollection_AddRef(IHTMLPluginsCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLPluginsCollection_Release(IHTMLPluginsCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLPluginsCollection_GetTypeInfoCount(IHTMLPluginsCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLPluginsCollection_GetTypeInfo(IHTMLPluginsCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPluginsCollection_get_length(IHTMLPluginsCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOpsProfile_QueryInterface(IHTMLOpsProfile* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLOpsProfile_AddRef(IHTMLOpsProfile* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLOpsProfile_Release(IHTMLOpsProfile* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLOpsProfile_GetTypeInfoCount(IHTMLOpsProfile* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLOpsProfile_GetTypeInfo(IHTMLOpsProfile* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOpsProfile_addRequest(IHTMLOpsProfile* This,BSTR name,VARIANT reserved,VARIANT_BOOL *success) {
    return This->lpVtbl->addRequest(This,name,reserved,success);
}
static __WIDL_INLINE HRESULT IHTMLOpsProfile_clearRequest(IHTMLOpsProfile* This) {
    return This->lpVtbl->clearRequest(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOpsProfile_getAttribute(IHTMLOpsProfile* This,BSTR name,BSTR *value) {
    return This->lpVtbl->getAttribute(This,name,value);
}
static __WIDL_INLINE HRESULT IHTMLOpsProfile_setAttribute(IHTMLOpsProfile* This,BSTR name,BSTR value,VARIANT prefs,VARIANT_BOOL *success) {
    return This->lpVtbl->setAttribute(This,name,value,prefs,success);
}
static __WIDL_INLINE HRESULT IHTMLOpsProfile_commitChanges(IHTMLOpsProfile* This,VARIANT_BOOL *success) {
    return This->lpVtbl->commitChanges(This,success);
}
static __WIDL_INLINE HRESULT IHTMLOpsProfile_addReadRequest(IHTMLOpsProfile* This,BSTR name,VARIANT reserved,VARIANT_BOOL *success) {
    return This->lpVtbl->addReadRequest(This,name,reserved,success);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IOmNavigator_QueryInterface(IOmNavigator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IOmNavigator_AddRef(IOmNavigator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IOmNavigator_Release(IOmNavigator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IOmNavigator_GetTypeInfoCount(IOmNavigator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IOmNavigator_GetTypeInfo(IOmNavigator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IOmNavigator_get_appCodeName(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_appCodeName(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_appName(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_appName(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_appVersion(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_appVersion(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_userAgent(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_userAgent(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_javaEnabled(IOmNavigator* This,VARIANT_BOOL *enabled) {
    return This->lpVtbl->javaEnabled(This,enabled);
}
static __WIDL_INLINE HRESULT IOmNavigator_taintEnabled(IOmNavigator* This,VARIANT_BOOL *enabled) {
    return This->lpVtbl->taintEnabled(This,enabled);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_mimeTypes(IOmNavigator* This,IHTMLMimeTypesCollection **p) {
    return This->lpVtbl->get_mimeTypes(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_plugins(IOmNavigator* This,IHTMLPluginsCollection **p) {
    return This->lpVtbl->get_plugins(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_cookieEnabled(IOmNavigator* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_cookieEnabled(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_opsProfile(IOmNavigator* This,IHTMLOpsProfile **p) {
    return This->lpVtbl->get_opsProfile(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_toString(IOmNavigator* This,BSTR *string) {
    return This->lpVtbl->toString(This,string);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_cpuClass(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_cpuClass(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_systemLanguage(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_systemLanguage(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_browserLanguage(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_browserLanguage(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_userLanguage(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_userLanguage(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_platform(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_platform(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_appMinorVersion(IOmNavigator* This,BSTR *p) {
    return This->lpVtbl->get_appMinorVersion(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_connectionSpeed(IOmNavigator* This,LONG *p) {
    return This->lpVtbl->get_connectionSpeed(This,p);
}
static __WIDL_INLINE HRESULT IOmNavigator_get_onLine(IOmNavigator* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_onLine(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT INavigatorGeolocation_QueryInterface(INavigatorGeolocation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG INavigatorGeolocation_AddRef(INavigatorGeolocation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG INavigatorGeolocation_Release(INavigatorGeolocation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT INavigatorGeolocation_GetTypeInfoCount(INavigatorGeolocation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT INavigatorGeolocation_GetTypeInfo(INavigatorGeolocation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT INavigatorDoNotTrack_QueryInterface(INavigatorDoNotTrack* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG INavigatorDoNotTrack_AddRef(INavigatorDoNotTrack* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG INavigatorDoNotTrack_Release(INavigatorDoNotTrack* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT INavigatorDoNotTrack_GetTypeInfoCount(INavigatorDoNotTrack* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT INavigatorDoNotTrack_GetTypeInfo(INavigatorDoNotTrack* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLocation_QueryInterface(IHTMLLocation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLLocation_AddRef(IHTMLLocation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLLocation_Release(IHTMLLocation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLLocation_GetTypeInfoCount(IHTMLLocation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLLocation_GetTypeInfo(IHTMLLocation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLocation_put_href(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLocation_get_href(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLocation_put_protocol(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_protocol(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLocation_get_protocol(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_protocol(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLocation_put_host(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_host(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLocation_get_host(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_host(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLocation_put_hostname(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_hostname(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLocation_get_hostname(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_hostname(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLocation_put_port(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_port(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLocation_get_port(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_port(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLocation_put_pathname(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_pathname(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLocation_get_pathname(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_pathname(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLocation_put_search(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_search(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLocation_get_search(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_search(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLocation_put_hash(IHTMLLocation* This,BSTR v) {
    return This->lpVtbl->put_hash(This,v);
}
static __WIDL_INLINE HRESULT IHTMLLocation_get_hash(IHTMLLocation* This,BSTR *p) {
    return This->lpVtbl->get_hash(This,p);
}
static __WIDL_INLINE HRESULT IHTMLLocation_reload(IHTMLLocation* This,VARIANT_BOOL flag) {
    return This->lpVtbl->reload(This,flag);
}
static __WIDL_INLINE HRESULT IHTMLLocation_replace(IHTMLLocation* This,BSTR bstr) {
    return This->lpVtbl->replace(This,bstr);
}
static __WIDL_INLINE HRESULT IHTMLLocation_assign(IHTMLLocation* This,BSTR bstr) {
    return This->lpVtbl->assign(This,bstr);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLHistory_QueryInterface(DispHTMLHistory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLHistory_AddRef(DispHTMLHistory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLHistory_Release(DispHTMLHistory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLHistory_GetTypeInfoCount(DispHTMLHistory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLHistory_GetTypeInfo(DispHTMLHistory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispCPlugins_QueryInterface(DispCPlugins* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispCPlugins_AddRef(DispCPlugins* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispCPlugins_Release(DispCPlugins* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispCPlugins_GetTypeInfoCount(DispCPlugins* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispCPlugins_GetTypeInfo(DispCPlugins* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLNavigator_QueryInterface(DispHTMLNavigator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLNavigator_AddRef(DispHTMLNavigator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLNavigator_Release(DispHTMLNavigator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLNavigator_GetTypeInfoCount(DispHTMLNavigator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLNavigator_GetTypeInfo(DispHTMLNavigator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLLocation_QueryInterface(DispHTMLLocation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLLocation_AddRef(DispHTMLLocation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLLocation_Release(DispHTMLLocation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLLocation_GetTypeInfoCount(DispHTMLLocation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLLocation_GetTypeInfo(DispHTMLLocation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBookmarkCollection_QueryInterface(IHTMLBookmarkCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLBookmarkCollection_AddRef(IHTMLBookmarkCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLBookmarkCollection_Release(IHTMLBookmarkCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLBookmarkCollection_GetTypeInfoCount(IHTMLBookmarkCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLBookmarkCollection_GetTypeInfo(IHTMLBookmarkCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBookmarkCollection_get_length(IHTMLBookmarkCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBookmarkCollection_get__newEnum(IHTMLBookmarkCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDataTransfer_QueryInterface(IHTMLDataTransfer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDataTransfer_AddRef(IHTMLDataTransfer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDataTransfer_Release(IHTMLDataTransfer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDataTransfer_GetTypeInfoCount(IHTMLDataTransfer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDataTransfer_GetTypeInfo(IHTMLDataTransfer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDataTransfer_setData(IHTMLDataTransfer* This,BSTR format,VARIANT *data,VARIANT_BOOL *pret) {
    return This->lpVtbl->setData(This,format,data,pret);
}
static __WIDL_INLINE HRESULT IHTMLDataTransfer_getData(IHTMLDataTransfer* This,BSTR format,VARIANT *pvarRet) {
    return This->lpVtbl->getData(This,format,pvarRet);
}
static __WIDL_INLINE HRESULT IHTMLDataTransfer_clearData(IHTMLDataTransfer* This,BSTR format,VARIANT_BOOL *pret) {
    return This->lpVtbl->clearData(This,format,pret);
}
static __WIDL_INLINE HRESULT IHTMLDataTransfer_put_dropEffect(IHTMLDataTransfer* This,BSTR v) {
    return This->lpVtbl->put_dropEffect(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDataTransfer_get_dropEffect(IHTMLDataTransfer* This,BSTR *p) {
    return This->lpVtbl->get_dropEffect(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDataTransfer_put_effectAllowed(IHTMLDataTransfer* This,BSTR v) {
    return This->lpVtbl->put_effectAllowed(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEventObj_QueryInterface(IHTMLEventObj* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLEventObj_AddRef(IHTMLEventObj* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLEventObj_Release(IHTMLEventObj* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLEventObj_GetTypeInfoCount(IHTMLEventObj* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_GetTypeInfo(IHTMLEventObj* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEventObj_get_srcElement(IHTMLEventObj* This,IHTMLElement **p) {
    return This->lpVtbl->get_srcElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_altKey(IHTMLEventObj* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_altKey(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_ctrlKey(IHTMLEventObj* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_ctrlKey(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_shiftKey(IHTMLEventObj* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_shiftKey(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_put_returnValue(IHTMLEventObj* This,VARIANT v) {
    return This->lpVtbl->put_returnValue(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_returnValue(IHTMLEventObj* This,VARIANT *p) {
    return This->lpVtbl->get_returnValue(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_put_cancelBubble(IHTMLEventObj* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_cancelBubble(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_cancelBubble(IHTMLEventObj* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_cancelBubble(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_fromElement(IHTMLEventObj* This,IHTMLElement **p) {
    return This->lpVtbl->get_fromElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_toElement(IHTMLEventObj* This,IHTMLElement **p) {
    return This->lpVtbl->get_toElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_put_keyCode(IHTMLEventObj* This,LONG v) {
    return This->lpVtbl->put_keyCode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_keyCode(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_keyCode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_button(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_button(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_type(IHTMLEventObj* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_qualifier(IHTMLEventObj* This,BSTR *p) {
    return This->lpVtbl->get_qualifier(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_reason(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_reason(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_x(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_y(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_clientX(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_clientX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_clientY(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_clientY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_offsetX(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_offsetX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_offsetY(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_offsetY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_screenX(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_screenX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj_get_screenY(IHTMLEventObj* This,LONG *p) {
    return This->lpVtbl->get_screenY(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEventObj2_QueryInterface(IHTMLEventObj2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLEventObj2_AddRef(IHTMLEventObj2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLEventObj2_Release(IHTMLEventObj2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLEventObj2_GetTypeInfoCount(IHTMLEventObj2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_GetTypeInfo(IHTMLEventObj2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEventObj2_setAttribute(IHTMLEventObj2* This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags) {
    return This->lpVtbl->setAttribute(This,strAttributeName,AttributeValue,lFlags);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_getAttribute(IHTMLEventObj2* This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) {
    return This->lpVtbl->getAttribute(This,strAttributeName,lFlags,AttributeValue);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_removeAttribute(IHTMLEventObj2* This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess) {
    return This->lpVtbl->removeAttribute(This,strAttributeName,lFlags,pfSuccess);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_propertyName(IHTMLEventObj2* This,BSTR v) {
    return This->lpVtbl->put_propertyName(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_propertyName(IHTMLEventObj2* This,BSTR *p) {
    return This->lpVtbl->get_propertyName(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_putref_bookmarks(IHTMLEventObj2* This,IHTMLBookmarkCollection *v) {
    return This->lpVtbl->putref_bookmarks(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_bookmarks(IHTMLEventObj2* This,IHTMLBookmarkCollection **p) {
    return This->lpVtbl->get_bookmarks(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_putref_recordset(IHTMLEventObj2* This,IDispatch *v) {
    return This->lpVtbl->putref_recordset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_recordset(IHTMLEventObj2* This,IDispatch **p) {
    return This->lpVtbl->get_recordset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_dataFld(IHTMLEventObj2* This,BSTR v) {
    return This->lpVtbl->put_dataFld(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_dataFld(IHTMLEventObj2* This,BSTR *p) {
    return This->lpVtbl->get_dataFld(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_putref_boundElements(IHTMLEventObj2* This,IHTMLElementCollection *v) {
    return This->lpVtbl->putref_boundElements(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_boundElements(IHTMLEventObj2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_boundElements(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_repeat(IHTMLEventObj2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_repeat(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_repeat(IHTMLEventObj2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_repeat(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_srcUrn(IHTMLEventObj2* This,BSTR v) {
    return This->lpVtbl->put_srcUrn(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_srcUrn(IHTMLEventObj2* This,BSTR *p) {
    return This->lpVtbl->get_srcUrn(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_putref_srcElement(IHTMLEventObj2* This,IHTMLElement *v) {
    return This->lpVtbl->putref_srcElement(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_srcElement(IHTMLEventObj2* This,IHTMLElement **p) {
    return This->lpVtbl->get_srcElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_altKey(IHTMLEventObj2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_altKey(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_altKey(IHTMLEventObj2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_altKey(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_ctrlKey(IHTMLEventObj2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_ctrlKey(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_ctrlKey(IHTMLEventObj2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_ctrlKey(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_shiftKey(IHTMLEventObj2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_shiftKey(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_shiftKey(IHTMLEventObj2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_shiftKey(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_putref_fromElement(IHTMLEventObj2* This,IHTMLElement *v) {
    return This->lpVtbl->putref_fromElement(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_fromElement(IHTMLEventObj2* This,IHTMLElement **p) {
    return This->lpVtbl->get_fromElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_putref_toElement(IHTMLEventObj2* This,IHTMLElement *v) {
    return This->lpVtbl->putref_toElement(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_toElement(IHTMLEventObj2* This,IHTMLElement **p) {
    return This->lpVtbl->get_toElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_button(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_button(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_button(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_button(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_type(IHTMLEventObj2* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_type(IHTMLEventObj2* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_qualifier(IHTMLEventObj2* This,BSTR v) {
    return This->lpVtbl->put_qualifier(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_qualifier(IHTMLEventObj2* This,BSTR *p) {
    return This->lpVtbl->get_qualifier(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_reason(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_reason(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_reason(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_reason(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_x(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_x(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_y(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_y(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_clientX(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_clientX(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_clientX(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_clientX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_clientY(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_clientY(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_clientY(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_clientY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_offsetX(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_offsetX(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_offsetX(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_offsetX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_offsetY(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_offsetY(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_offsetY(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_offsetY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_screenX(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_screenX(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_screenX(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_screenX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_put_screenY(IHTMLEventObj2* This,LONG v) {
    return This->lpVtbl->put_screenY(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_screenY(IHTMLEventObj2* This,LONG *p) {
    return This->lpVtbl->get_screenY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_putref_srcFilter(IHTMLEventObj2* This,IDispatch *v) {
    return This->lpVtbl->putref_srcFilter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj2_get_srcFilter(IHTMLEventObj2* This,IDispatch **p) {
    return This->lpVtbl->get_srcFilter(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEventObj3_QueryInterface(IHTMLEventObj3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLEventObj3_AddRef(IHTMLEventObj3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLEventObj3_Release(IHTMLEventObj3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLEventObj3_GetTypeInfoCount(IHTMLEventObj3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_GetTypeInfo(IHTMLEventObj3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEventObj3_get_contentOverflow(IHTMLEventObj3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_contentOverflow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_put_shiftLeft(IHTMLEventObj3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_shiftLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_get_shiftLeft(IHTMLEventObj3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_shiftLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_put_altLeft(IHTMLEventObj3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_altLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_get_altLeft(IHTMLEventObj3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_altLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_put_ctrlLeft(IHTMLEventObj3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_ctrlLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_get_ctrlLeft(IHTMLEventObj3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_ctrlLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_get_imeCompositionChange(IHTMLEventObj3* This,LONG_PTR *p) {
    return This->lpVtbl->get_imeCompositionChange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_get_imeNotifyCommand(IHTMLEventObj3* This,LONG_PTR *p) {
    return This->lpVtbl->get_imeNotifyCommand(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_get_imeNotifyData(IHTMLEventObj3* This,LONG_PTR *p) {
    return This->lpVtbl->get_imeNotifyData(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_get_imeRequest(IHTMLEventObj3* This,LONG_PTR *p) {
    return This->lpVtbl->get_imeRequest(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_get_imeRequestData(IHTMLEventObj3* This,LONG_PTR *p) {
    return This->lpVtbl->get_imeRequestData(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_get_keyboardLayout(IHTMLEventObj3* This,LONG_PTR *p) {
    return This->lpVtbl->get_keyboardLayout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_get_behaviorCookie(IHTMLEventObj3* This,LONG *p) {
    return This->lpVtbl->get_behaviorCookie(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj3_get_behaviorPart(IHTMLEventObj3* This,LONG *p) {
    return This->lpVtbl->get_behaviorPart(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEventObj4_QueryInterface(IHTMLEventObj4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLEventObj4_AddRef(IHTMLEventObj4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLEventObj4_Release(IHTMLEventObj4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLEventObj4_GetTypeInfoCount(IHTMLEventObj4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLEventObj4_GetTypeInfo(IHTMLEventObj4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEventObj5_QueryInterface(IHTMLEventObj5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLEventObj5_AddRef(IHTMLEventObj5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLEventObj5_Release(IHTMLEventObj5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLEventObj5_GetTypeInfoCount(IHTMLEventObj5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLEventObj5_GetTypeInfo(IHTMLEventObj5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEventObj5_put_url(IHTMLEventObj5* This,BSTR v) {
    return This->lpVtbl->put_url(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj5_get_url(IHTMLEventObj5* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj5_put_data(IHTMLEventObj5* This,BSTR v) {
    return This->lpVtbl->put_data(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj5_get_data(IHTMLEventObj5* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj5_get_source(IHTMLEventObj5* This,IDispatch **p) {
    return This->lpVtbl->get_source(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj5_put_origin(IHTMLEventObj5* This,BSTR v) {
    return This->lpVtbl->put_origin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEventObj5_get_origin(IHTMLEventObj5* This,BSTR *p) {
    return This->lpVtbl->get_origin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEventObj5_put_issession(IHTMLEventObj5* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_issession(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEventObj6_QueryInterface(IHTMLEventObj6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLEventObj6_AddRef(IHTMLEventObj6* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLEventObj6_Release(IHTMLEventObj6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLEventObj6_GetTypeInfoCount(IHTMLEventObj6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLEventObj6_GetTypeInfo(IHTMLEventObj6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEventObj6_get_actionURL(IHTMLEventObj6* This,BSTR *p) {
    return This->lpVtbl->get_actionURL(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispCEventObj_QueryInterface(DispCEventObj* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispCEventObj_AddRef(DispCEventObj* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispCEventObj_Release(DispCEventObj* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispCEventObj_GetTypeInfoCount(DispCEventObj* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispCEventObj_GetTypeInfo(DispCEventObj* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleMedia_QueryInterface(IHTMLStyleMedia* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleMedia_AddRef(IHTMLStyleMedia* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleMedia_Release(IHTMLStyleMedia* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleMedia_GetTypeInfoCount(IHTMLStyleMedia* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleMedia_GetTypeInfo(IHTMLStyleMedia* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleMedia_get_type(IHTMLStyleMedia* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLStyleMedia_QueryInterface(DispHTMLStyleMedia* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLStyleMedia_AddRef(DispHTMLStyleMedia* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLStyleMedia_Release(DispHTMLStyleMedia* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLStyleMedia_GetTypeInfoCount(DispHTMLStyleMedia* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLStyleMedia_GetTypeInfo(DispHTMLStyleMedia* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLWindowEvents3_QueryInterface(HTMLWindowEvents3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLWindowEvents3_AddRef(HTMLWindowEvents3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLWindowEvents3_Release(HTMLWindowEvents3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLWindowEvents3_GetTypeInfoCount(HTMLWindowEvents3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLWindowEvents3_GetTypeInfo(HTMLWindowEvents3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLWindowEvents2_QueryInterface(HTMLWindowEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLWindowEvents2_AddRef(HTMLWindowEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLWindowEvents2_Release(HTMLWindowEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLWindowEvents2_GetTypeInfoCount(HTMLWindowEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLWindowEvents2_GetTypeInfo(HTMLWindowEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLWindowEvents_QueryInterface(HTMLWindowEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLWindowEvents_AddRef(HTMLWindowEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLWindowEvents_Release(HTMLWindowEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLWindowEvents_GetTypeInfoCount(HTMLWindowEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLWindowEvents_GetTypeInfo(HTMLWindowEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFramesCollection2_QueryInterface(IHTMLFramesCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFramesCollection2_AddRef(IHTMLFramesCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFramesCollection2_Release(IHTMLFramesCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFramesCollection2_GetTypeInfoCount(IHTMLFramesCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFramesCollection2_GetTypeInfo(IHTMLFramesCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFramesCollection2_item(IHTMLFramesCollection2* This,VARIANT *pvarIndex,VARIANT *pvarResult) {
    return This->lpVtbl->item(This,pvarIndex,pvarResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLScreen_QueryInterface(IHTMLScreen* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLScreen_AddRef(IHTMLScreen* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLScreen_Release(IHTMLScreen* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLScreen_GetTypeInfoCount(IHTMLScreen* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLScreen_GetTypeInfo(IHTMLScreen* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLScreen_get_colorDepth(IHTMLScreen* This,LONG *p) {
    return This->lpVtbl->get_colorDepth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScreen_put_bufferDepth(IHTMLScreen* This,LONG v) {
    return This->lpVtbl->put_bufferDepth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLScreen_get_bufferDepth(IHTMLScreen* This,LONG *p) {
    return This->lpVtbl->get_bufferDepth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScreen_get_width(IHTMLScreen* This,LONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScreen_get_height(IHTMLScreen* This,LONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScreen_put_updateInterval(IHTMLScreen* This,LONG v) {
    return This->lpVtbl->put_updateInterval(This,v);
}
static __WIDL_INLINE HRESULT IHTMLScreen_get_updateInterval(IHTMLScreen* This,LONG *p) {
    return This->lpVtbl->get_updateInterval(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScreen_get_availHeight(IHTMLScreen* This,LONG *p) {
    return This->lpVtbl->get_availHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScreen_get_availWidth(IHTMLScreen* This,LONG *p) {
    return This->lpVtbl->get_availWidth(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLScreen2_QueryInterface(IHTMLScreen2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLScreen2_AddRef(IHTMLScreen2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLScreen2_Release(IHTMLScreen2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLScreen2_GetTypeInfoCount(IHTMLScreen2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLScreen2_GetTypeInfo(IHTMLScreen2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLScreen2_get_logicalXDPI(IHTMLScreen2* This,LONG *p) {
    return This->lpVtbl->get_logicalXDPI(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScreen2_get_logicalYDPI(IHTMLScreen2* This,LONG *p) {
    return This->lpVtbl->get_logicalYDPI(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScreen2_get_deviceXDPI(IHTMLScreen2* This,LONG *p) {
    return This->lpVtbl->get_deviceXDPI(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLScreen3_QueryInterface(IHTMLScreen3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLScreen3_AddRef(IHTMLScreen3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLScreen3_Release(IHTMLScreen3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLScreen3_GetTypeInfoCount(IHTMLScreen3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLScreen3_GetTypeInfo(IHTMLScreen3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLScreen3_get_systemXDPI(IHTMLScreen3* This,LONG *p) {
    return This->lpVtbl->get_systemXDPI(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLScreen4_QueryInterface(IHTMLScreen4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLScreen4_AddRef(IHTMLScreen4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLScreen4_Release(IHTMLScreen4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLScreen4_GetTypeInfoCount(IHTMLScreen4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLScreen4_GetTypeInfo(IHTMLScreen4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow2_QueryInterface(IHTMLWindow2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLWindow2_AddRef(IHTMLWindow2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLWindow2_Release(IHTMLWindow2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLWindow2_GetTypeInfoCount(IHTMLWindow2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_GetTypeInfo(IHTMLWindow2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow2_item(IHTMLWindow2* This,VARIANT *pvarIndex,VARIANT *pvarResult) {
    return This->lpVtbl->item(This,pvarIndex,pvarResult);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_length(IHTMLWindow2* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
/*** IHTMLWindow2 methods ***/
static __WIDL_INLINE HRESULT IHTMLWindow2_get_frames(IHTMLWindow2* This,IHTMLFramesCollection2 **p) {
    return This->lpVtbl->get_frames(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_put_defaultStatus(IHTMLWindow2* This,BSTR v) {
    return This->lpVtbl->put_defaultStatus(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_defaultStatus(IHTMLWindow2* This,BSTR *p) {
    return This->lpVtbl->get_defaultStatus(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_put_status(IHTMLWindow2* This,BSTR v) {
    return This->lpVtbl->put_status(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_status(IHTMLWindow2* This,BSTR *p) {
    return This->lpVtbl->get_status(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_setTimeout(IHTMLWindow2* This,BSTR expression,LONG msec,VARIANT *language,LONG *timerID) {
    return This->lpVtbl->setTimeout(This,expression,msec,language,timerID);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_clearTimeout(IHTMLWindow2* This,LONG timerID) {
    return This->lpVtbl->clearTimeout(This,timerID);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_alert(IHTMLWindow2* This,BSTR message) {
    return This->lpVtbl->alert(This,message);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_confirm(IHTMLWindow2* This,BSTR message,VARIANT_BOOL *confirmed) {
    return This->lpVtbl->confirm(This,message,confirmed);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_prompt(IHTMLWindow2* This,BSTR message,BSTR defstr,VARIANT *textdata) {
    return This->lpVtbl->prompt(This,message,defstr,textdata);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_Image(IHTMLWindow2* This,IHTMLImageElementFactory **p) {
    return This->lpVtbl->get_Image(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_location(IHTMLWindow2* This,IHTMLLocation **p) {
    return This->lpVtbl->get_location(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_history(IHTMLWindow2* This,IOmHistory **p) {
    return This->lpVtbl->get_history(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_close(IHTMLWindow2* This) {
    return This->lpVtbl->close(This);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_put_opener(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_opener(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_opener(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_opener(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_navigator(IHTMLWindow2* This,IOmNavigator **p) {
    return This->lpVtbl->get_navigator(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_put_name(IHTMLWindow2* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_name(IHTMLWindow2* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_parent(IHTMLWindow2* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_parent(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow2_get_self(IHTMLWindow2* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_self(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_top(IHTMLWindow2* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_top(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_window(IHTMLWindow2* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_window(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_navigate(IHTMLWindow2* This,BSTR url) {
    return This->lpVtbl->navigate(This,url);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_put_onfocus(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onfocus(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_onfocus(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onfocus(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_put_onblur(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onblur(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_onblur(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onblur(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_put_onload(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_onload(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_put_onbeforeunload(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeunload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_onbeforeunload(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeunload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_put_onunload(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onunload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_onunload(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onunload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_put_onhelp(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onhelp(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_onhelp(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onhelp(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_put_onerror(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_onerror(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_put_onresize(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onresize(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_onresize(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onresize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_put_onscroll(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_onscroll(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_onscroll(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_onscroll(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_document(IHTMLWindow2* This,IHTMLDocument2 **p) {
    return This->lpVtbl->get_document(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_event(IHTMLWindow2* This,IHTMLEventObj **p) {
    return This->lpVtbl->get_event(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get__newEnum(IHTMLWindow2* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_showModalDialog(IHTMLWindow2* This,BSTR dialog,VARIANT *varArgIn,VARIANT *varOptions,VARIANT *varArgOut) {
    return This->lpVtbl->showModalDialog(This,dialog,varArgIn,varOptions,varArgOut);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_showHelp(IHTMLWindow2* This,BSTR helpURL,VARIANT helpArg,BSTR features) {
    return This->lpVtbl->showHelp(This,helpURL,helpArg,features);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_screen(IHTMLWindow2* This,IHTMLScreen **p) {
    return This->lpVtbl->get_screen(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_Option(IHTMLWindow2* This,IHTMLOptionElementFactory **p) {
    return This->lpVtbl->get_Option(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_focus(IHTMLWindow2* This) {
    return This->lpVtbl->focus(This);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_closed(IHTMLWindow2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_closed(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_blur(IHTMLWindow2* This) {
    return This->lpVtbl->blur(This);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_scroll(IHTMLWindow2* This,LONG x,LONG y) {
    return This->lpVtbl->scroll(This,x,y);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_clientInformation(IHTMLWindow2* This,IOmNavigator **p) {
    return This->lpVtbl->get_clientInformation(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_setInterval(IHTMLWindow2* This,BSTR expression,LONG msec,VARIANT *language,LONG *timerID) {
    return This->lpVtbl->setInterval(This,expression,msec,language,timerID);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_clearInterval(IHTMLWindow2* This,LONG timerID) {
    return This->lpVtbl->clearInterval(This,timerID);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_put_offscreenBuffering(IHTMLWindow2* This,VARIANT v) {
    return This->lpVtbl->put_offscreenBuffering(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_get_offscreenBuffering(IHTMLWindow2* This,VARIANT *p) {
    return This->lpVtbl->get_offscreenBuffering(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_execScript(IHTMLWindow2* This,BSTR code,BSTR language,VARIANT *pvarRet) {
    return This->lpVtbl->execScript(This,code,language,pvarRet);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_toString(IHTMLWindow2* This,BSTR *String) {
    return This->lpVtbl->toString(This,String);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_scrollBy(IHTMLWindow2* This,LONG x,LONG y) {
    return This->lpVtbl->scrollBy(This,x,y);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_scrollTo(IHTMLWindow2* This,LONG x,LONG y) {
    return This->lpVtbl->scrollTo(This,x,y);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_moveTo(IHTMLWindow2* This,LONG x,LONG y) {
    return This->lpVtbl->moveTo(This,x,y);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_moveBy(IHTMLWindow2* This,LONG x,LONG y) {
    return This->lpVtbl->moveBy(This,x,y);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_resizeTo(IHTMLWindow2* This,LONG x,LONG y) {
    return This->lpVtbl->resizeTo(This,x,y);
}
static __WIDL_INLINE HRESULT IHTMLWindow2_resizeBy(IHTMLWindow2* This,LONG x,LONG y) {
    return This->lpVtbl->resizeBy(This,x,y);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow3_QueryInterface(IHTMLWindow3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLWindow3_AddRef(IHTMLWindow3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLWindow3_Release(IHTMLWindow3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLWindow3_GetTypeInfoCount(IHTMLWindow3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLWindow3_GetTypeInfo(IHTMLWindow3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow3_get_screenLeft(IHTMLWindow3* This,LONG *p) {
    return This->lpVtbl->get_screenLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow3_get_screenTop(IHTMLWindow3* This,LONG *p) {
    return This->lpVtbl->get_screenTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow3_attachEvent(IHTMLWindow3* This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult) {
    return This->lpVtbl->attachEvent(This,event,pDisp,pfResult);
}
static __WIDL_INLINE HRESULT IHTMLWindow3_detachEvent(IHTMLWindow3* This,BSTR event,IDispatch *pDisp) {
    return This->lpVtbl->detachEvent(This,event,pDisp);
}
static __WIDL_INLINE HRESULT IHTMLWindow3_setTimeout(IHTMLWindow3* This,VARIANT *expression,LONG msec,VARIANT *language,LONG *timerID) {
    return This->lpVtbl->setTimeout(This,expression,msec,language,timerID);
}
static __WIDL_INLINE HRESULT IHTMLWindow3_setInterval(IHTMLWindow3* This,VARIANT *expression,LONG msec,VARIANT *language,LONG *timerID) {
    return This->lpVtbl->setInterval(This,expression,msec,language,timerID);
}
static __WIDL_INLINE HRESULT IHTMLWindow3_print(IHTMLWindow3* This) {
    return This->lpVtbl->print(This);
}
static __WIDL_INLINE HRESULT IHTMLWindow3_put_onbeforeprint(IHTMLWindow3* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeprint(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow3_get_onbeforeprint(IHTMLWindow3* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeprint(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow3_put_onafterprint(IHTMLWindow3* This,VARIANT v) {
    return This->lpVtbl->put_onafterprint(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow3_get_onafterprint(IHTMLWindow3* This,VARIANT *p) {
    return This->lpVtbl->get_onafterprint(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow3_get_clipboardData(IHTMLWindow3* This,IHTMLDataTransfer **p) {
    return This->lpVtbl->get_clipboardData(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow4_QueryInterface(IHTMLWindow4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLWindow4_AddRef(IHTMLWindow4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLWindow4_Release(IHTMLWindow4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLWindow4_GetTypeInfoCount(IHTMLWindow4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLWindow4_GetTypeInfo(IHTMLWindow4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow4_createPopup(IHTMLWindow4* This,VARIANT *varArgIn,IDispatch **ppPopup) {
    return This->lpVtbl->createPopup(This,varArgIn,ppPopup);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow5_QueryInterface(IHTMLWindow5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLWindow5_AddRef(IHTMLWindow5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLWindow5_Release(IHTMLWindow5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLWindow5_GetTypeInfoCount(IHTMLWindow5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLWindow5_GetTypeInfo(IHTMLWindow5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow5_put_XMLHttpRequest(IHTMLWindow5* This,VARIANT v) {
    return This->lpVtbl->put_XMLHttpRequest(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow6_QueryInterface(IHTMLWindow6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLWindow6_AddRef(IHTMLWindow6* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLWindow6_Release(IHTMLWindow6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLWindow6_GetTypeInfoCount(IHTMLWindow6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLWindow6_GetTypeInfo(IHTMLWindow6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow6_put_XDomainRequest(IHTMLWindow6* This,VARIANT v) {
    return This->lpVtbl->put_XDomainRequest(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow6_get_XDomainRequest(IHTMLWindow6* This,VARIANT *p) {
    return This->lpVtbl->get_XDomainRequest(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow6_get_sessionStorage(IHTMLWindow6* This,IHTMLStorage **p) {
    return This->lpVtbl->get_sessionStorage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow6_get_localStorage(IHTMLWindow6* This,IHTMLStorage **p) {
    return This->lpVtbl->get_localStorage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow6_put_onhashchange(IHTMLWindow6* This,VARIANT v) {
    return This->lpVtbl->put_onhashchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow6_get_onhashchange(IHTMLWindow6* This,VARIANT *p) {
    return This->lpVtbl->get_onhashchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow6_get_maxConnectionsPerServer(IHTMLWindow6* This,LONG *p) {
    return This->lpVtbl->get_maxConnectionsPerServer(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow6_postMessage(IHTMLWindow6* This,BSTR msg,VARIANT targetOrigin) {
    return This->lpVtbl->postMessage(This,msg,targetOrigin);
}
static __WIDL_INLINE HRESULT IHTMLWindow6_toStaticHTML(IHTMLWindow6* This,BSTR bstrHTML,BSTR *pbstrStaticHTML) {
    return This->lpVtbl->toStaticHTML(This,bstrHTML,pbstrStaticHTML);
}
static __WIDL_INLINE HRESULT IHTMLWindow6_put_onmessage(IHTMLWindow6* This,VARIANT v) {
    return This->lpVtbl->put_onmessage(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow6_get_onmessage(IHTMLWindow6* This,VARIANT *p) {
    return This->lpVtbl->get_onmessage(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow7_QueryInterface(IHTMLWindow7* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLWindow7_AddRef(IHTMLWindow7* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLWindow7_Release(IHTMLWindow7* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLWindow7_GetTypeInfoCount(IHTMLWindow7* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_GetTypeInfo(IHTMLWindow7* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow7_getSelection(IHTMLWindow7* This,IHTMLSelection **ppIHTMLSelection) {
    return This->lpVtbl->getSelection(This,ppIHTMLSelection);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_getComputedStyle(IHTMLWindow7* This,IHTMLDOMNode *varArgIn,BSTR bstrPseudoElt,IHTMLCSSStyleDeclaration **ppComputedStyle) {
    return This->lpVtbl->getComputedStyle(This,varArgIn,bstrPseudoElt,ppComputedStyle);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_styleMedia(IHTMLWindow7* This,IHTMLStyleMedia **p) {
    return This->lpVtbl->get_styleMedia(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_performance(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_performance(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_performance(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_performance(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_innerWidth(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_innerWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_innerHeight(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_innerHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_pageXOffset(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_pageXOffset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_pageYOffset(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_pageYOffset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_screenX(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_screenX(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_screenY(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_screenY(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_outerWidth(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_outerWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_outerHeight(IHTMLWindow7* This,LONG *p) {
    return This->lpVtbl->get_outerHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onabort(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onabort(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onabort(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onabort(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_oncanplay(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_oncanplay(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_oncanplay(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_oncanplay(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_oncanplaythrough(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_oncanplaythrough(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_oncanplaythrough(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_oncanplaythrough(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onchange(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onchange(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onclick(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onclick(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onclick(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onclick(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_oncontextmenu(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_oncontextmenu(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_oncontextmenu(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_oncontextmenu(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_ondblclick(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondblclick(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_ondblclick(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondblclick(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_ondrag(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondrag(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_ondrag(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondrag(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_ondragend(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondragend(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_ondragend(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragend(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_ondragenter(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondragenter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_ondragenter(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragenter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_ondragleave(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondragleave(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_ondragleave(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragleave(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_ondragover(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondragover(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_ondragover(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragover(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_ondragstart(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondragstart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_ondragstart(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragstart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_ondrop(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondrop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_ondrop(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondrop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_ondurationchange(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ondurationchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_ondurationchange(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ondurationchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onfocusin(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onfocusin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onfocusin(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onfocusin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onfocusout(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onfocusout(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onfocusout(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onfocusout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_oninput(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_oninput(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_oninput(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_oninput(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onemptied(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onemptied(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onemptied(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onemptied(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onended(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onended(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onended(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onended(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onkeydown(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onkeydown(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onkeydown(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onkeydown(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onkeypress(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onkeypress(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onkeypress(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onkeypress(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onkeyup(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onkeyup(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onkeyup(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onkeyup(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onloadeddata(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onloadeddata(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onloadeddata(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onloadeddata(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onloadedmetadata(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onloadedmetadata(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onloadedmetadata(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onloadedmetadata(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onloadstart(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onloadstart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onloadstart(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onloadstart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onmousedown(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmousedown(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onmousedown(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmousedown(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onmouseenter(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmouseenter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onmouseenter(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseenter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onmouseleave(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmouseleave(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onmouseleave(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseleave(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onmousemove(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmousemove(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onmousemove(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmousemove(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onmouseout(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmouseout(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onmouseout(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onmouseover(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmouseover(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onmouseover(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseover(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onmouseup(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmouseup(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onmouseup(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseup(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onmousewheel(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onmousewheel(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onmousewheel(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onmousewheel(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onoffline(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onoffline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onoffline(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onoffline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_ononline(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ononline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_ononline(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ononline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onprogress(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onprogress(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onprogress(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onprogress(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onratechange(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onratechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onratechange(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onratechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onreadystatechange(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onreadystatechange(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onreset(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onreset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onreset(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onreset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onseeked(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onseeked(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onseeked(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onseeked(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onseeking(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onseeking(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onseeking(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onseeking(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onselect(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onselect(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onstalled(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onstalled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onstalled(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onstalled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onstorage(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onstorage(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onstorage(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onstorage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onsubmit(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onsubmit(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onsubmit(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onsubmit(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onsuspend(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onsuspend(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onsuspend(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onsuspend(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_ontimeupdate(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_ontimeupdate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_ontimeupdate(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_ontimeupdate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onpause(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onpause(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onpause(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onpause(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onplay(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onplay(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onplay(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onplay(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onplaying(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onplaying(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onplaying(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onplaying(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onvolumechange(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onvolumechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_get_onvolumechange(IHTMLWindow7* This,VARIANT *p) {
    return This->lpVtbl->get_onvolumechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow7_put_onwaiting(IHTMLWindow7* This,VARIANT v) {
    return This->lpVtbl->put_onwaiting(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow8_QueryInterface(IHTMLWindow8* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLWindow8_AddRef(IHTMLWindow8* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLWindow8_Release(IHTMLWindow8* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLWindow8_GetTypeInfoCount(IHTMLWindow8* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_GetTypeInfo(IHTMLWindow8* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLWindow8_put_onmspointerdown(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerdown(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_onmspointerdown(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerdown(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_put_onmspointermove(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointermove(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_onmspointermove(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointermove(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_put_onmspointerup(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerup(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_onmspointerup(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerup(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_put_onmspointerover(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerover(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_onmspointerover(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerover(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_put_onmspointerout(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerout(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_onmspointerout(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_put_onmspointercancel(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointercancel(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_onmspointercancel(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointercancel(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_put_onmspointerhover(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerhover(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_onmspointerhover(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerhover(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_put_onmsgesturestart(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturestart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_onmsgesturestart(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturestart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_put_onmsgesturechange(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_onmsgesturechange(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_put_onmsgestureend(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgestureend(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_onmsgestureend(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgestureend(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_put_onmsgesturehold(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturehold(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_onmsgesturehold(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturehold(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_put_onmsgesturetap(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturetap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_onmsgesturetap(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturetap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_put_onmsgesturedoubletap(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturedoubletap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_onmsgesturedoubletap(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturedoubletap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_put_onmsinertiastart(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onmsinertiastart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_onmsinertiastart(IHTMLWindow8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsinertiastart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_get_applicationCache(IHTMLWindow8* This,IHTMLApplicationCache **p) {
    return This->lpVtbl->get_applicationCache(This,p);
}
static __WIDL_INLINE HRESULT IHTMLWindow8_put_onpopstate(IHTMLWindow8* This,VARIANT v) {
    return This->lpVtbl->put_onpopstate(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLScreen_QueryInterface(DispHTMLScreen* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLScreen_AddRef(DispHTMLScreen* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLScreen_Release(DispHTMLScreen* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLScreen_GetTypeInfoCount(DispHTMLScreen* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLScreen_GetTypeInfo(DispHTMLScreen* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLWindow2_QueryInterface(DispHTMLWindow2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLWindow2_AddRef(DispHTMLWindow2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLWindow2_Release(DispHTMLWindow2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLWindow2_GetTypeInfoCount(DispHTMLWindow2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLWindow2_GetTypeInfo(DispHTMLWindow2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLWindowProxy_QueryInterface(DispHTMLWindowProxy* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLWindowProxy_AddRef(DispHTMLWindowProxy* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLWindowProxy_Release(DispHTMLWindowProxy* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLWindowProxy_GetTypeInfoCount(DispHTMLWindowProxy* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLWindowProxy_GetTypeInfo(DispHTMLWindowProxy* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocumentCompatibleInfo_QueryInterface(IHTMLDocumentCompatibleInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDocumentCompatibleInfo_AddRef(IHTMLDocumentCompatibleInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDocumentCompatibleInfo_Release(IHTMLDocumentCompatibleInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDocumentCompatibleInfo_GetTypeInfoCount(IHTMLDocumentCompatibleInfo* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDocumentCompatibleInfo_GetTypeInfo(IHTMLDocumentCompatibleInfo* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocumentCompatibleInfo_get_userAgent(IHTMLDocumentCompatibleInfo* This,BSTR *p) {
    return This->lpVtbl->get_userAgent(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocumentCompatibleInfoCollection_QueryInterface(IHTMLDocumentCompatibleInfoCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDocumentCompatibleInfoCollection_AddRef(IHTMLDocumentCompatibleInfoCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDocumentCompatibleInfoCollection_Release(IHTMLDocumentCompatibleInfoCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDocumentCompatibleInfoCollection_GetTypeInfoCount(IHTMLDocumentCompatibleInfoCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDocumentCompatibleInfoCollection_GetTypeInfo(IHTMLDocumentCompatibleInfoCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocumentCompatibleInfoCollection_get_length(IHTMLDocumentCompatibleInfoCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLDocumentCompatibleInfo_QueryInterface(DispHTMLDocumentCompatibleInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLDocumentCompatibleInfo_AddRef(DispHTMLDocumentCompatibleInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLDocumentCompatibleInfo_Release(DispHTMLDocumentCompatibleInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLDocumentCompatibleInfo_GetTypeInfoCount(DispHTMLDocumentCompatibleInfo* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLDocumentCompatibleInfo_GetTypeInfo(DispHTMLDocumentCompatibleInfo* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLDocumentCompatibleInfoCollection_QueryInterface(DispHTMLDocumentCompatibleInfoCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLDocumentCompatibleInfoCollection_AddRef(DispHTMLDocumentCompatibleInfoCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLDocumentCompatibleInfoCollection_Release(DispHTMLDocumentCompatibleInfoCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLDocumentCompatibleInfoCollection_GetTypeInfoCount(DispHTMLDocumentCompatibleInfoCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLDocumentCompatibleInfoCollection_GetTypeInfo(DispHTMLDocumentCompatibleInfoCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLDocumentEvents4_QueryInterface(HTMLDocumentEvents4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLDocumentEvents4_AddRef(HTMLDocumentEvents4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLDocumentEvents4_Release(HTMLDocumentEvents4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLDocumentEvents4_GetTypeInfoCount(HTMLDocumentEvents4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLDocumentEvents4_GetTypeInfo(HTMLDocumentEvents4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLDocumentEvents3_QueryInterface(HTMLDocumentEvents3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLDocumentEvents3_AddRef(HTMLDocumentEvents3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLDocumentEvents3_Release(HTMLDocumentEvents3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLDocumentEvents3_GetTypeInfoCount(HTMLDocumentEvents3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLDocumentEvents3_GetTypeInfo(HTMLDocumentEvents3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLDocumentEvents2_QueryInterface(HTMLDocumentEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLDocumentEvents2_AddRef(HTMLDocumentEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLDocumentEvents2_Release(HTMLDocumentEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLDocumentEvents2_GetTypeInfoCount(HTMLDocumentEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLDocumentEvents2_GetTypeInfo(HTMLDocumentEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLDocumentEvents_QueryInterface(HTMLDocumentEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLDocumentEvents_AddRef(HTMLDocumentEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLDocumentEvents_Release(HTMLDocumentEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLDocumentEvents_GetTypeInfoCount(HTMLDocumentEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLDocumentEvents_GetTypeInfo(HTMLDocumentEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument_QueryInterface(IHTMLDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDocument_AddRef(IHTMLDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDocument_Release(IHTMLDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDocument_GetTypeInfoCount(IHTMLDocument* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDocument_GetTypeInfo(IHTMLDocument* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument2_QueryInterface(IHTMLDocument2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDocument2_AddRef(IHTMLDocument2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDocument2_Release(IHTMLDocument2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDocument2_GetTypeInfoCount(IHTMLDocument2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_GetTypeInfo(IHTMLDocument2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument2_get_Script(IHTMLDocument2* This,IDispatch **p) {
    return This->lpVtbl->get_Script(This,p);
}
/*** IHTMLDocument2 methods ***/
static __WIDL_INLINE HRESULT IHTMLDocument2_get_all(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_all(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_body(IHTMLDocument2* This,IHTMLElement **p) {
    return This->lpVtbl->get_body(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_activeElement(IHTMLDocument2* This,IHTMLElement **p) {
    return This->lpVtbl->get_activeElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_images(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_images(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_applets(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_applets(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_links(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_links(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_forms(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_forms(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_anchors(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_anchors(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_title(IHTMLDocument2* This,BSTR v) {
    return This->lpVtbl->put_title(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_title(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_title(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_scripts(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_scripts(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_designMode(IHTMLDocument2* This,BSTR v) {
    return This->lpVtbl->put_designMode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_designMode(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_designMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_selection(IHTMLDocument2* This,IHTMLSelectionObject **p) {
    return This->lpVtbl->get_selection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_readyState(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_frames(IHTMLDocument2* This,IHTMLFramesCollection2 **p) {
    return This->lpVtbl->get_frames(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_embeds(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_embeds(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_plugins(IHTMLDocument2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_plugins(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_alinkColor(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_alinkColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_alinkColor(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_alinkColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_bgColor(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_bgColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_bgColor(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_bgColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_fgColor(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_fgColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_fgColor(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_fgColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_linkColor(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_linkColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_linkColor(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_linkColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_vlinkColor(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_vlinkColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_vlinkColor(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_vlinkColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_referrer(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_referrer(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_location(IHTMLDocument2* This,IHTMLLocation **p) {
    return This->lpVtbl->get_location(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_lastModified(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_lastModified(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_URL(IHTMLDocument2* This,BSTR v) {
    return This->lpVtbl->put_URL(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_URL(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_URL(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_domain(IHTMLDocument2* This,BSTR v) {
    return This->lpVtbl->put_domain(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_domain(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_domain(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_cookie(IHTMLDocument2* This,BSTR v) {
    return This->lpVtbl->put_cookie(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_cookie(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_cookie(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_expando(IHTMLDocument2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_expando(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_expando(IHTMLDocument2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_expando(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_charset(IHTMLDocument2* This,BSTR v) {
    return This->lpVtbl->put_charset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_charset(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_charset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_defaultCharset(IHTMLDocument2* This,BSTR v) {
    return This->lpVtbl->put_defaultCharset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_defaultCharset(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_defaultCharset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_mimeType(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_mimeType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_fileSize(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_fileSize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_fileCreatedDate(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_fileCreatedDate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_fileModifiedDate(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_fileModifiedDate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_fileUpdatedDate(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_fileUpdatedDate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_security(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_security(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_protocol(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_protocol(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_nameProp(IHTMLDocument2* This,BSTR *p) {
    return This->lpVtbl->get_nameProp(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_write(IHTMLDocument2* This,SAFEARRAY *psarray) {
    return This->lpVtbl->write(This,psarray);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_writeln(IHTMLDocument2* This,SAFEARRAY *psarray) {
    return This->lpVtbl->writeln(This,psarray);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument2_close(IHTMLDocument2* This) {
    return This->lpVtbl->close(This);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_clear(IHTMLDocument2* This) {
    return This->lpVtbl->clear(This);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_queryCommandSupported(IHTMLDocument2* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandSupported(This,cmdID,pfRet);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_queryCommandEnabled(IHTMLDocument2* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandEnabled(This,cmdID,pfRet);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_queryCommandState(IHTMLDocument2* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandState(This,cmdID,pfRet);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_queryCommandIndeterm(IHTMLDocument2* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->queryCommandIndeterm(This,cmdID,pfRet);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_queryCommandText(IHTMLDocument2* This,BSTR cmdID,BSTR *pcmdText) {
    return This->lpVtbl->queryCommandText(This,cmdID,pcmdText);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_queryCommandValue(IHTMLDocument2* This,BSTR cmdID,VARIANT *pcmdValue) {
    return This->lpVtbl->queryCommandValue(This,cmdID,pcmdValue);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument2_execCommandShowHelp(IHTMLDocument2* This,BSTR cmdID,VARIANT_BOOL *pfRet) {
    return This->lpVtbl->execCommandShowHelp(This,cmdID,pfRet);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_createElement(IHTMLDocument2* This,BSTR eTag,IHTMLElement **newElem) {
    return This->lpVtbl->createElement(This,eTag,newElem);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onhelp(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onhelp(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onhelp(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onhelp(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onclick(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onclick(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onclick(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onclick(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_ondblclick(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_ondblclick(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_ondblclick(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_ondblclick(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onkeyup(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onkeyup(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onkeyup(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onkeyup(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onkeydown(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onkeydown(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onkeydown(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onkeydown(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onkeypress(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onkeypress(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onkeypress(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onkeypress(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onmouseup(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onmouseup(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onmouseup(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseup(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onmousedown(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onmousedown(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onmousedown(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onmousedown(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onmousemove(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onmousemove(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onmousemove(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onmousemove(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onmouseout(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onmouseout(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onmouseout(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onmouseover(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onmouseover(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onmouseover(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onmouseover(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onreadystatechange(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onreadystatechange(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onafterupdate(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onafterupdate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onafterupdate(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onafterupdate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onrowexit(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onrowexit(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onrowexit(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onrowexit(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onrowenter(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onrowenter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onrowenter(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onrowenter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_ondragstart(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_ondragstart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_ondragstart(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_ondragstart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onselectstart(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onselectstart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onselectstart(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onselectstart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_elementFromPoint(IHTMLDocument2* This,LONG x,LONG y,IHTMLElement **elementHit) {
    return This->lpVtbl->elementFromPoint(This,x,y,elementHit);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_parentWindow(IHTMLDocument2* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_parentWindow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_styleSheets(IHTMLDocument2* This,IHTMLStyleSheetsCollection **p) {
    return This->lpVtbl->get_styleSheets(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onbeforeupdate(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeupdate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onbeforeupdate(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeupdate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_put_onerrorupdate(IHTMLDocument2* This,VARIANT v) {
    return This->lpVtbl->put_onerrorupdate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_get_onerrorupdate(IHTMLDocument2* This,VARIANT *p) {
    return This->lpVtbl->get_onerrorupdate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument2_toString(IHTMLDocument2* This,BSTR *String) {
    return This->lpVtbl->toString(This,String);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument3_QueryInterface(IHTMLDocument3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDocument3_AddRef(IHTMLDocument3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDocument3_Release(IHTMLDocument3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDocument3_GetTypeInfoCount(IHTMLDocument3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_GetTypeInfo(IHTMLDocument3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument3_releaseCapture(IHTMLDocument3* This) {
    return This->lpVtbl->releaseCapture(This);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_recalc(IHTMLDocument3* This,VARIANT_BOOL fForce) {
    return This->lpVtbl->recalc(This,fForce);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_createTextNode(IHTMLDocument3* This,BSTR text,IHTMLDOMNode **newTextNode) {
    return This->lpVtbl->createTextNode(This,text,newTextNode);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_documentElement(IHTMLDocument3* This,IHTMLElement **p) {
    return This->lpVtbl->get_documentElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_uniqueID(IHTMLDocument3* This,BSTR *p) {
    return This->lpVtbl->get_uniqueID(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_attachEvent(IHTMLDocument3* This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult) {
    return This->lpVtbl->attachEvent(This,event,pDisp,pfResult);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_detachEvent(IHTMLDocument3* This,BSTR event,IDispatch *pDisp) {
    return This->lpVtbl->detachEvent(This,event,pDisp);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_put_onrowsdelete(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_onrowsdelete(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_onrowsdelete(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_onrowsdelete(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_put_onrowsinserted(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_onrowsinserted(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_onrowsinserted(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_onrowsinserted(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_put_oncellchange(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_oncellchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_oncellchange(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_oncellchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_put_ondatasetchanged(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_ondatasetchanged(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_ondatasetchanged(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_ondatasetchanged(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_put_ondataavailable(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_ondataavailable(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_ondataavailable(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_ondataavailable(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_put_ondatasetcomplete(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_ondatasetcomplete(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_ondatasetcomplete(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_ondatasetcomplete(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_put_onpropertychange(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_onpropertychange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_onpropertychange(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_onpropertychange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_put_dir(IHTMLDocument3* This,BSTR v) {
    return This->lpVtbl->put_dir(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_dir(IHTMLDocument3* This,BSTR *p) {
    return This->lpVtbl->get_dir(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_put_oncontextmenu(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_oncontextmenu(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_oncontextmenu(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_oncontextmenu(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_put_onstop(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_onstop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_onstop(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_onstop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_createDocumentFragment(IHTMLDocument3* This,IHTMLDocument2 **pNewDoc) {
    return This->lpVtbl->createDocumentFragment(This,pNewDoc);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_parentDocument(IHTMLDocument3* This,IHTMLDocument2 **p) {
    return This->lpVtbl->get_parentDocument(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_put_enableDownload(IHTMLDocument3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_enableDownload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_enableDownload(IHTMLDocument3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_enableDownload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_put_baseUrl(IHTMLDocument3* This,BSTR v) {
    return This->lpVtbl->put_baseUrl(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_baseUrl(IHTMLDocument3* This,BSTR *p) {
    return This->lpVtbl->get_baseUrl(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_childNodes(IHTMLDocument3* This,IDispatch **p) {
    return This->lpVtbl->get_childNodes(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_put_inheritStyleSheets(IHTMLDocument3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_inheritStyleSheets(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_inheritStyleSheets(IHTMLDocument3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_inheritStyleSheets(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_put_onbeforeeditfocus(IHTMLDocument3* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeeditfocus(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_get_onbeforeeditfocus(IHTMLDocument3* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeeditfocus(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_getElementsByName(IHTMLDocument3* This,BSTR v,IHTMLElementCollection **pelColl) {
    return This->lpVtbl->getElementsByName(This,v,pelColl);
}
static __WIDL_INLINE HRESULT IHTMLDocument3_getElementById(IHTMLDocument3* This,BSTR v,IHTMLElement **pel) {
    return This->lpVtbl->getElementById(This,v,pel);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument4_QueryInterface(IHTMLDocument4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDocument4_AddRef(IHTMLDocument4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDocument4_Release(IHTMLDocument4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDocument4_GetTypeInfoCount(IHTMLDocument4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDocument4_GetTypeInfo(IHTMLDocument4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument4_focus(IHTMLDocument4* This) {
    return This->lpVtbl->focus(This);
}
static __WIDL_INLINE HRESULT IHTMLDocument4_hasFocus(IHTMLDocument4* This,VARIANT_BOOL *pfFocus) {
    return This->lpVtbl->hasFocus(This,pfFocus);
}
static __WIDL_INLINE HRESULT IHTMLDocument4_put_onselectionchange(IHTMLDocument4* This,VARIANT v) {
    return This->lpVtbl->put_onselectionchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument4_get_onselectionchange(IHTMLDocument4* This,VARIANT *p) {
    return This->lpVtbl->get_onselectionchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument4_get_namespaces(IHTMLDocument4* This,IDispatch **p) {
    return This->lpVtbl->get_namespaces(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument4_createDocumentFromUrl(IHTMLDocument4* This,BSTR bstrUrl,BSTR bstrOptions,IHTMLDocument2 **newDoc) {
    return This->lpVtbl->createDocumentFromUrl(This,bstrUrl,bstrOptions,newDoc);
}
static __WIDL_INLINE HRESULT IHTMLDocument4_put_media(IHTMLDocument4* This,BSTR v) {
    return This->lpVtbl->put_media(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument4_get_media(IHTMLDocument4* This,BSTR *p) {
    return This->lpVtbl->get_media(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument4_createEventObject(IHTMLDocument4* This,VARIANT *pvarEventObject,IHTMLEventObj **ppEventObj) {
    return This->lpVtbl->createEventObject(This,pvarEventObject,ppEventObj);
}
static __WIDL_INLINE HRESULT IHTMLDocument4_fireEvent(IHTMLDocument4* This,BSTR bstrEventName,VARIANT *pvarEventObject,VARIANT_BOOL *pfCancelled) {
    return This->lpVtbl->fireEvent(This,bstrEventName,pvarEventObject,pfCancelled);
}
static __WIDL_INLINE HRESULT IHTMLDocument4_createRenderStyle(IHTMLDocument4* This,BSTR v,IHTMLRenderStyle **ppIHTMLRenderStyle) {
    return This->lpVtbl->createRenderStyle(This,v,ppIHTMLRenderStyle);
}
static __WIDL_INLINE HRESULT IHTMLDocument4_put_oncontrolselect(IHTMLDocument4* This,VARIANT v) {
    return This->lpVtbl->put_oncontrolselect(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument4_get_oncontrolselect(IHTMLDocument4* This,VARIANT *p) {
    return This->lpVtbl->get_oncontrolselect(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument5_QueryInterface(IHTMLDocument5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDocument5_AddRef(IHTMLDocument5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDocument5_Release(IHTMLDocument5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDocument5_GetTypeInfoCount(IHTMLDocument5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_GetTypeInfo(IHTMLDocument5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument5_put_onmousewheel(IHTMLDocument5* This,VARIANT v) {
    return This->lpVtbl->put_onmousewheel(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_get_onmousewheel(IHTMLDocument5* This,VARIANT *p) {
    return This->lpVtbl->get_onmousewheel(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_get_doctype(IHTMLDocument5* This,IHTMLDOMNode **p) {
    return This->lpVtbl->get_doctype(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_get_implementation(IHTMLDocument5* This,IHTMLDOMImplementation **p) {
    return This->lpVtbl->get_implementation(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_createAttribute(IHTMLDocument5* This,BSTR bstrattrName,IHTMLDOMAttribute **ppattribute) {
    return This->lpVtbl->createAttribute(This,bstrattrName,ppattribute);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_createComment(IHTMLDocument5* This,BSTR bstrdata,IHTMLDOMNode **ppRetNode) {
    return This->lpVtbl->createComment(This,bstrdata,ppRetNode);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_put_onfocusin(IHTMLDocument5* This,VARIANT v) {
    return This->lpVtbl->put_onfocusin(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_get_onfocusin(IHTMLDocument5* This,VARIANT *p) {
    return This->lpVtbl->get_onfocusin(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_put_onfocusout(IHTMLDocument5* This,VARIANT v) {
    return This->lpVtbl->put_onfocusout(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_get_onfocusout(IHTMLDocument5* This,VARIANT *p) {
    return This->lpVtbl->get_onfocusout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_put_onactivate(IHTMLDocument5* This,VARIANT v) {
    return This->lpVtbl->put_onactivate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_get_onactivate(IHTMLDocument5* This,VARIANT *p) {
    return This->lpVtbl->get_onactivate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_put_ondeactivate(IHTMLDocument5* This,VARIANT v) {
    return This->lpVtbl->put_ondeactivate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_get_ondeactivate(IHTMLDocument5* This,VARIANT *p) {
    return This->lpVtbl->get_ondeactivate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_put_onbeforeactivate(IHTMLDocument5* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeactivate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_get_onbeforeactivate(IHTMLDocument5* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeactivate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_put_onbeforedeactivate(IHTMLDocument5* This,VARIANT v) {
    return This->lpVtbl->put_onbeforedeactivate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument5_get_onbeforedeactivate(IHTMLDocument5* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforedeactivate(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument6_QueryInterface(IHTMLDocument6* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDocument6_AddRef(IHTMLDocument6* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDocument6_Release(IHTMLDocument6* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDocument6_GetTypeInfoCount(IHTMLDocument6* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDocument6_GetTypeInfo(IHTMLDocument6* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument6_get_compatible(IHTMLDocument6* This,IHTMLDocumentCompatibleInfoCollection **p) {
    return This->lpVtbl->get_compatible(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument6_get_documentMode(IHTMLDocument6* This,VARIANT *p) {
    return This->lpVtbl->get_documentMode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument6_put_onstorage(IHTMLDocument6* This,VARIANT v) {
    return This->lpVtbl->put_onstorage(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument6_get_onstorage(IHTMLDocument6* This,VARIANT *p) {
    return This->lpVtbl->get_onstorage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument6_put_onstoragecommit(IHTMLDocument6* This,VARIANT v) {
    return This->lpVtbl->put_onstoragecommit(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument6_get_onstoragecommit(IHTMLDocument6* This,VARIANT *p) {
    return This->lpVtbl->get_onstoragecommit(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument6_getElementById(IHTMLDocument6* This,BSTR bstrId,IHTMLElement2 **ppRetElement) {
    return This->lpVtbl->getElementById(This,bstrId,ppRetElement);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument7_QueryInterface(IHTMLDocument7* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDocument7_AddRef(IHTMLDocument7* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDocument7_Release(IHTMLDocument7* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDocument7_GetTypeInfoCount(IHTMLDocument7* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_GetTypeInfo(IHTMLDocument7* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument7_get_defaultView(IHTMLDocument7* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_defaultView(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_createCDATASection(IHTMLDocument7* This,BSTR text,IHTMLDOMNode **newCDATASectionNode) {
    return This->lpVtbl->createCDATASection(This,text,newCDATASectionNode);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_getSelection(IHTMLDocument7* This,IHTMLSelection **ppIHTMLSelection) {
    return This->lpVtbl->getSelection(This,ppIHTMLSelection);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_getElementsByTagNameNS(IHTMLDocument7* This,VARIANT *pvarNS,BSTR bstrLocalName,IHTMLElementCollection **pelColl) {
    return This->lpVtbl->getElementsByTagNameNS(This,pvarNS,bstrLocalName,pelColl);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_createElementNS(IHTMLDocument7* This,VARIANT *pvarNS,BSTR bstrTag,IHTMLElement **newElem) {
    return This->lpVtbl->createElementNS(This,pvarNS,bstrTag,newElem);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_createAttributeNS(IHTMLDocument7* This,VARIANT *pvarNS,BSTR bstrAttrName,IHTMLDOMAttribute **ppAttribute) {
    return This->lpVtbl->createAttributeNS(This,pvarNS,bstrAttrName,ppAttribute);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onmsthumbnailclick(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onmsthumbnailclick(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onmsthumbnailclick(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onmsthumbnailclick(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_characterSet(IHTMLDocument7* This,BSTR *p) {
    return This->lpVtbl->get_characterSet(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_createElement(IHTMLDocument7* This,BSTR bstrTag,IHTMLElement **newElem) {
    return This->lpVtbl->createElement(This,bstrTag,newElem);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_createAttribute(IHTMLDocument7* This,BSTR bstrAttrName,IHTMLDOMAttribute **ppAttribute) {
    return This->lpVtbl->createAttribute(This,bstrAttrName,ppAttribute);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_getElementsByClassName(IHTMLDocument7* This,BSTR v,IHTMLElementCollection **pel) {
    return This->lpVtbl->getElementsByClassName(This,v,pel);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_createProcessingInstruction(IHTMLDocument7* This,BSTR bstrTarget,BSTR bstrData,IDOMProcessingInstruction **newProcessingInstruction) {
    return This->lpVtbl->createProcessingInstruction(This,bstrTarget,bstrData,newProcessingInstruction);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_adoptNode(IHTMLDocument7* This,IHTMLDOMNode *pNodeSource,IHTMLDOMNode3 **ppNodeDest) {
    return This->lpVtbl->adoptNode(This,pNodeSource,ppNodeDest);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onmssitemodejumplistitemremoved(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onmssitemodejumplistitemremoved(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onmssitemodejumplistitemremoved(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onmssitemodejumplistitemremoved(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_all(IHTMLDocument7* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_all(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_inputEncoding(IHTMLDocument7* This,BSTR *p) {
    return This->lpVtbl->get_inputEncoding(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_xmlEncoding(IHTMLDocument7* This,BSTR *p) {
    return This->lpVtbl->get_xmlEncoding(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_xmlStandalone(IHTMLDocument7* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_xmlStandalone(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_xmlStandalone(IHTMLDocument7* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_xmlStandalone(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_xmlVersion(IHTMLDocument7* This,BSTR v) {
    return This->lpVtbl->put_xmlVersion(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_xmlVersion(IHTMLDocument7* This,BSTR *p) {
    return This->lpVtbl->get_xmlVersion(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_hasAttributes(IHTMLDocument7* This,VARIANT_BOOL *pfHasAttributes) {
    return This->lpVtbl->hasAttributes(This,pfHasAttributes);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onabort(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onabort(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onabort(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onabort(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onblur(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onblur(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onblur(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onblur(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_oncanplay(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_oncanplay(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_oncanplay(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_oncanplay(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_oncanplaythrough(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_oncanplaythrough(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_oncanplaythrough(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_oncanplaythrough(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onchange(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onchange(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_ondrag(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ondrag(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_ondrag(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ondrag(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_ondragend(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ondragend(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_ondragend(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragend(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_ondragenter(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ondragenter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_ondragenter(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragenter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_ondragleave(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ondragleave(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_ondragleave(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragleave(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_ondragover(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ondragover(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_ondragover(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ondragover(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_ondrop(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ondrop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_ondrop(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ondrop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_ondurationchange(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ondurationchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_ondurationchange(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ondurationchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onemptied(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onemptied(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onemptied(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onemptied(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onended(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onended(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onended(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onended(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onerror(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onerror(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onfocus(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onfocus(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onfocus(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onfocus(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_oninput(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_oninput(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_oninput(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_oninput(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onload(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onload(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onloadeddata(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onloadeddata(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onloadeddata(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onloadeddata(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onloadedmetadata(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onloadedmetadata(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onloadedmetadata(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onloadedmetadata(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onloadstart(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onloadstart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onloadstart(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onloadstart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onpause(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onpause(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onpause(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onpause(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onplay(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onplay(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onplay(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onplay(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onplaying(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onplaying(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onplaying(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onplaying(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onprogress(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onprogress(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onprogress(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onprogress(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onratechange(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onratechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onratechange(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onratechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onreset(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onreset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onreset(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onreset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onscroll(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onscroll(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onscroll(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onscroll(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onseeked(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onseeked(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onseeked(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onseeked(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onseeking(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onseeking(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onseeking(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onseeking(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onselect(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onselect(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onselect(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onselect(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onstalled(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onstalled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onstalled(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onstalled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onsubmit(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onsubmit(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onsubmit(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onsubmit(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onsuspend(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onsuspend(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onsuspend(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onsuspend(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_ontimeupdate(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_ontimeupdate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_ontimeupdate(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_ontimeupdate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onvolumechange(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onvolumechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onvolumechange(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onvolumechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_put_onwaiting(IHTMLDocument7* This,VARIANT v) {
    return This->lpVtbl->put_onwaiting(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_onwaiting(IHTMLDocument7* This,VARIANT *p) {
    return This->lpVtbl->get_onwaiting(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_normalize(IHTMLDocument7* This) {
    return This->lpVtbl->normalize(This);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_importNode(IHTMLDocument7* This,IHTMLDOMNode *pNodeSource,VARIANT_BOOL fDeep,IHTMLDOMNode3 **ppNodeDest) {
    return This->lpVtbl->importNode(This,pNodeSource,fDeep,ppNodeDest);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_parentWindow(IHTMLDocument7* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_parentWindow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_putref_body(IHTMLDocument7* This,IHTMLElement *v) {
    return This->lpVtbl->putref_body(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument7_get_body(IHTMLDocument7* This,IHTMLElement **p) {
    return This->lpVtbl->get_body(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument8_QueryInterface(IHTMLDocument8* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDocument8_AddRef(IHTMLDocument8* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDocument8_Release(IHTMLDocument8* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDocument8_GetTypeInfoCount(IHTMLDocument8* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_GetTypeInfo(IHTMLDocument8* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument8_put_onmscontentzoom(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmscontentzoom(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmscontentzoom(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmscontentzoom(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_onmspointerdown(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerdown(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmspointerdown(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerdown(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_onmspointermove(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointermove(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmspointermove(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointermove(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_onmspointerup(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerup(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmspointerup(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerup(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_onmspointerover(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerover(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmspointerover(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerover(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_onmspointerout(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerout(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmspointerout(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_onmspointercancel(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointercancel(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmspointercancel(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointercancel(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_onmspointerhover(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmspointerhover(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmspointerhover(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmspointerhover(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_onmsgesturestart(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturestart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmsgesturestart(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturestart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_onmsgesturechange(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmsgesturechange(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_onmsgestureend(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgestureend(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmsgestureend(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgestureend(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_onmsgesturehold(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturehold(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmsgesturehold(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturehold(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_onmsgesturetap(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturetap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmsgesturetap(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturetap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_onmsgesturedoubletap(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsgesturedoubletap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmsgesturedoubletap(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsgesturedoubletap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_onmsinertiastart(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsinertiastart(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmsinertiastart(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsinertiastart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_elementsFromPoint(IHTMLDocument8* This,float x,float y,IHTMLDOMChildrenCollection **elementsHit) {
    return This->lpVtbl->elementsFromPoint(This,x,y,elementsHit);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDocument8_put_onmsmanipulationstatechanged(IHTMLDocument8* This,VARIANT v) {
    return This->lpVtbl->put_onmsmanipulationstatechanged(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_get_onmsmanipulationstatechanged(IHTMLDocument8* This,VARIANT *p) {
    return This->lpVtbl->get_onmsmanipulationstatechanged(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDocument8_put_msCapsLockWarningOff(IHTMLDocument8* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_msCapsLockWarningOff(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDocumentEvent_QueryInterface(IDocumentEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDocumentEvent_AddRef(IDocumentEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDocumentEvent_Release(IDocumentEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDocumentEvent_GetTypeInfoCount(IDocumentEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDocumentEvent_GetTypeInfo(IDocumentEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDocumentRange_QueryInterface(IDocumentRange* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDocumentRange_AddRef(IDocumentRange* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDocumentRange_Release(IDocumentRange* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDocumentRange_GetTypeInfoCount(IDocumentRange* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDocumentRange_GetTypeInfo(IDocumentRange* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDocumentSelector_QueryInterface(IDocumentSelector* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDocumentSelector_AddRef(IDocumentSelector* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDocumentSelector_Release(IDocumentSelector* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDocumentSelector_GetTypeInfoCount(IDocumentSelector* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDocumentSelector_GetTypeInfo(IDocumentSelector* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDocumentSelector_querySelector(IDocumentSelector* This,BSTR v,IHTMLElement **pel) {
    return This->lpVtbl->querySelector(This,v,pel);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDocumentTraversal_QueryInterface(IDocumentTraversal* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDocumentTraversal_AddRef(IDocumentTraversal* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDocumentTraversal_Release(IDocumentTraversal* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDocumentTraversal_GetTypeInfoCount(IDocumentTraversal* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDocumentTraversal_GetTypeInfo(IDocumentTraversal* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLDocument_QueryInterface(DispHTMLDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLDocument_AddRef(DispHTMLDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLDocument_Release(DispHTMLDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLDocument_GetTypeInfoCount(DispHTMLDocument* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLDocument_GetTypeInfo(DispHTMLDocument* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DWebBridgeEvents_QueryInterface(DWebBridgeEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DWebBridgeEvents_AddRef(DWebBridgeEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DWebBridgeEvents_Release(DWebBridgeEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DWebBridgeEvents_GetTypeInfoCount(DWebBridgeEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DWebBridgeEvents_GetTypeInfo(DWebBridgeEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWebBridge_QueryInterface(IWebBridge* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWebBridge_AddRef(IWebBridge* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWebBridge_Release(IWebBridge* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWebBridge_GetTypeInfoCount(IWebBridge* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWebBridge_GetTypeInfo(IWebBridge* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWebBridge_put_URL(IWebBridge* This,BSTR v) {
    return This->lpVtbl->put_URL(This,v);
}
static __WIDL_INLINE HRESULT IWebBridge_get_URL(IWebBridge* This,BSTR *p) {
    return This->lpVtbl->get_URL(This,p);
}
static __WIDL_INLINE HRESULT IWebBridge_put_Scrollbar(IWebBridge* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_Scrollbar(This,v);
}
static __WIDL_INLINE HRESULT IWebBridge_get_Scrollbar(IWebBridge* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_Scrollbar(This,p);
}
static __WIDL_INLINE HRESULT IWebBridge_put_embed(IWebBridge* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_embed(This,v);
}
static __WIDL_INLINE HRESULT IWebBridge_get_embed(IWebBridge* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_embed(This,p);
}
static __WIDL_INLINE HRESULT IWebBridge_get_event(IWebBridge* This,IDispatch **p) {
    return This->lpVtbl->get_event(This,p);
}
static __WIDL_INLINE HRESULT IWebBridge_get_readyState(IWebBridge* This,LONG *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWBScriptControl_QueryInterface(IWBScriptControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWBScriptControl_AddRef(IWBScriptControl* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWBScriptControl_Release(IWBScriptControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWBScriptControl_GetTypeInfoCount(IWBScriptControl* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWBScriptControl_GetTypeInfo(IWBScriptControl* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWBScriptControl_raiseEvent(IWBScriptControl* This,BSTR name,VARIANT eventData) {
    return This->lpVtbl->raiseEvent(This,name,eventData);
}
static __WIDL_INLINE HRESULT IWBScriptControl_bubbleEvent(IWBScriptControl* This) {
    return This->lpVtbl->bubbleEvent(This);
}
static __WIDL_INLINE HRESULT IWBScriptControl_setContextMenu(IWBScriptControl* This,VARIANT menuItemPairs) {
    return This->lpVtbl->setContextMenu(This,menuItemPairs);
}
static __WIDL_INLINE HRESULT IWBScriptControl_put_selectableContent(IWBScriptControl* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selectableContent(This,v);
}
static __WIDL_INLINE HRESULT IWBScriptControl_get_selectableContent(IWBScriptControl* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selectableContent(This,p);
}
static __WIDL_INLINE HRESULT IWBScriptControl_get_frozen(IWBScriptControl* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frozen(This,p);
}
static __WIDL_INLINE HRESULT IWBScriptControl_put_scrollbar(IWBScriptControl* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_scrollbar(This,v);
}
static __WIDL_INLINE HRESULT IWBScriptControl_get_scrollbar(IWBScriptControl* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_scrollbar(This,p);
}
static __WIDL_INLINE HRESULT IWBScriptControl_get_version(IWBScriptControl* This,BSTR *p) {
    return This->lpVtbl->get_version(This,p);
}
static __WIDL_INLINE HRESULT IWBScriptControl_get_visibility(IWBScriptControl* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_visibility(This,p);
}
static __WIDL_INLINE HRESULT IWBScriptControl_put_onvisibilitychange(IWBScriptControl* This,VARIANT v) {
    return This->lpVtbl->put_onvisibilitychange(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEmbedElement_QueryInterface(IHTMLEmbedElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLEmbedElement_AddRef(IHTMLEmbedElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLEmbedElement_Release(IHTMLEmbedElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLEmbedElement_GetTypeInfoCount(IHTMLEmbedElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement_GetTypeInfo(IHTMLEmbedElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEmbedElement_put_hidden(IHTMLEmbedElement* This,BSTR v) {
    return This->lpVtbl->put_hidden(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement_get_hidden(IHTMLEmbedElement* This,BSTR *p) {
    return This->lpVtbl->get_hidden(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement_get_palette(IHTMLEmbedElement* This,BSTR *p) {
    return This->lpVtbl->get_palette(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement_get_pluginspage(IHTMLEmbedElement* This,BSTR *p) {
    return This->lpVtbl->get_pluginspage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement_put_src(IHTMLEmbedElement* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement_get_src(IHTMLEmbedElement* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement_put_units(IHTMLEmbedElement* This,BSTR v) {
    return This->lpVtbl->put_units(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement_get_units(IHTMLEmbedElement* This,BSTR *p) {
    return This->lpVtbl->get_units(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement_put_name(IHTMLEmbedElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement_get_name(IHTMLEmbedElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement_put_width(IHTMLEmbedElement* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement_get_width(IHTMLEmbedElement* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement_put_height(IHTMLEmbedElement* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEmbedElement2_QueryInterface(IHTMLEmbedElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLEmbedElement2_AddRef(IHTMLEmbedElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLEmbedElement2_Release(IHTMLEmbedElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLEmbedElement2_GetTypeInfoCount(IHTMLEmbedElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement2_GetTypeInfo(IHTMLEmbedElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEmbedElement2_put_src(IHTMLEmbedElement2* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static __WIDL_INLINE HRESULT IHTMLEmbedElement2_get_src(IHTMLEmbedElement2* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLEmbed_QueryInterface(DispHTMLEmbed* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLEmbed_AddRef(DispHTMLEmbed* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLEmbed_Release(DispHTMLEmbed* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLEmbed_GetTypeInfoCount(DispHTMLEmbed* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLEmbed_GetTypeInfo(DispHTMLEmbed* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLMapEvents2_QueryInterface(HTMLMapEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLMapEvents2_AddRef(HTMLMapEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLMapEvents2_Release(HTMLMapEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLMapEvents2_GetTypeInfoCount(HTMLMapEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLMapEvents2_GetTypeInfo(HTMLMapEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLMapEvents_QueryInterface(HTMLMapEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLMapEvents_AddRef(HTMLMapEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLMapEvents_Release(HTMLMapEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLMapEvents_GetTypeInfoCount(HTMLMapEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLMapEvents_GetTypeInfo(HTMLMapEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAreasCollection_QueryInterface(IHTMLAreasCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAreasCollection_AddRef(IHTMLAreasCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAreasCollection_Release(IHTMLAreasCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAreasCollection_GetTypeInfoCount(IHTMLAreasCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAreasCollection_GetTypeInfo(IHTMLAreasCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAreasCollection_put_length(IHTMLAreasCollection* This,LONG v) {
    return This->lpVtbl->put_length(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreasCollection_get_length(IHTMLAreasCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreasCollection_get__newEnum(IHTMLAreasCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreasCollection_item(IHTMLAreasCollection* This,VARIANT name,VARIANT index,IDispatch **pdisp) {
    return This->lpVtbl->item(This,name,index,pdisp);
}
static __WIDL_INLINE HRESULT IHTMLAreasCollection_tags(IHTMLAreasCollection* This,VARIANT tagName,IDispatch **pdisp) {
    return This->lpVtbl->tags(This,tagName,pdisp);
}
static __WIDL_INLINE HRESULT IHTMLAreasCollection_add(IHTMLAreasCollection* This,IHTMLElement *element,VARIANT before) {
    return This->lpVtbl->add(This,element,before);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAreasCollection2_QueryInterface(IHTMLAreasCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAreasCollection2_AddRef(IHTMLAreasCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAreasCollection2_Release(IHTMLAreasCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAreasCollection2_GetTypeInfoCount(IHTMLAreasCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAreasCollection2_GetTypeInfo(IHTMLAreasCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAreasCollection3_QueryInterface(IHTMLAreasCollection3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAreasCollection3_AddRef(IHTMLAreasCollection3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAreasCollection3_Release(IHTMLAreasCollection3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAreasCollection3_GetTypeInfoCount(IHTMLAreasCollection3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAreasCollection3_GetTypeInfo(IHTMLAreasCollection3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAreasCollection4_QueryInterface(IHTMLAreasCollection4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAreasCollection4_AddRef(IHTMLAreasCollection4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAreasCollection4_Release(IHTMLAreasCollection4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAreasCollection4_GetTypeInfoCount(IHTMLAreasCollection4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAreasCollection4_GetTypeInfo(IHTMLAreasCollection4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAreasCollection4_get_length(IHTMLAreasCollection4* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreasCollection4_item(IHTMLAreasCollection4* This,LONG index,IHTMLElement2 **pNode) {
    return This->lpVtbl->item(This,index,pNode);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMapElement_QueryInterface(IHTMLMapElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLMapElement_AddRef(IHTMLMapElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLMapElement_Release(IHTMLMapElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLMapElement_GetTypeInfoCount(IHTMLMapElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLMapElement_GetTypeInfo(IHTMLMapElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMapElement_get_areas(IHTMLMapElement* This,IHTMLAreasCollection **p) {
    return This->lpVtbl->get_areas(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMapElement_put_name(IHTMLMapElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLAreasCollection_QueryInterface(DispHTMLAreasCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLAreasCollection_AddRef(DispHTMLAreasCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLAreasCollection_Release(DispHTMLAreasCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLAreasCollection_GetTypeInfoCount(DispHTMLAreasCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLAreasCollection_GetTypeInfo(DispHTMLAreasCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLMapElement_QueryInterface(DispHTMLMapElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLMapElement_AddRef(DispHTMLMapElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLMapElement_Release(DispHTMLMapElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLMapElement_GetTypeInfoCount(DispHTMLMapElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLMapElement_GetTypeInfo(DispHTMLMapElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLAreaEvents2_QueryInterface(HTMLAreaEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLAreaEvents2_AddRef(HTMLAreaEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLAreaEvents2_Release(HTMLAreaEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLAreaEvents2_GetTypeInfoCount(HTMLAreaEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLAreaEvents2_GetTypeInfo(HTMLAreaEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLAreaEvents_QueryInterface(HTMLAreaEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLAreaEvents_AddRef(HTMLAreaEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLAreaEvents_Release(HTMLAreaEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLAreaEvents_GetTypeInfoCount(HTMLAreaEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLAreaEvents_GetTypeInfo(HTMLAreaEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAreaElement_QueryInterface(IHTMLAreaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAreaElement_AddRef(IHTMLAreaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAreaElement_Release(IHTMLAreaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAreaElement_GetTypeInfoCount(IHTMLAreaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_GetTypeInfo(IHTMLAreaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAreaElement_put_shape(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_shape(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_shape(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_shape(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_coords(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_coords(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_coords(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_coords(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_href(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_href(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_href(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_target(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_target(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_target(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_target(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_alt(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_alt(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_alt(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_alt(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_noHref(IHTMLAreaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noHref(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_noHref(IHTMLAreaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_noHref(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_host(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_host(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_host(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_host(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_hostname(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_hostname(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_hostname(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_hostname(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_pathname(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_pathname(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_pathname(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_pathname(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_port(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_port(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_port(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_port(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_protocol(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_protocol(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_protocol(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_protocol(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_search(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_search(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_search(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_search(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_hash(IHTMLAreaElement* This,BSTR v) {
    return This->lpVtbl->put_hash(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_hash(IHTMLAreaElement* This,BSTR *p) {
    return This->lpVtbl->get_hash(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_onblur(IHTMLAreaElement* This,VARIANT v) {
    return This->lpVtbl->put_onblur(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_onblur(IHTMLAreaElement* This,VARIANT *p) {
    return This->lpVtbl->get_onblur(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_onfocus(IHTMLAreaElement* This,VARIANT v) {
    return This->lpVtbl->put_onfocus(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_onfocus(IHTMLAreaElement* This,VARIANT *p) {
    return This->lpVtbl->get_onfocus(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_put_tabIndex(IHTMLAreaElement* This,short v) {
    return This->lpVtbl->put_tabIndex(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_get_tabIndex(IHTMLAreaElement* This,short *p) {
    return This->lpVtbl->get_tabIndex(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement_focus(IHTMLAreaElement* This) {
    return This->lpVtbl->focus(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAreaElement2_QueryInterface(IHTMLAreaElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAreaElement2_AddRef(IHTMLAreaElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAreaElement2_Release(IHTMLAreaElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAreaElement2_GetTypeInfoCount(IHTMLAreaElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement2_GetTypeInfo(IHTMLAreaElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAreaElement2_put_shape(IHTMLAreaElement2* This,BSTR v) {
    return This->lpVtbl->put_shape(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement2_get_shape(IHTMLAreaElement2* This,BSTR *p) {
    return This->lpVtbl->get_shape(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement2_put_coords(IHTMLAreaElement2* This,BSTR v) {
    return This->lpVtbl->put_coords(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement2_get_coords(IHTMLAreaElement2* This,BSTR *p) {
    return This->lpVtbl->get_coords(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAreaElement2_put_href(IHTMLAreaElement2* This,BSTR v) {
    return This->lpVtbl->put_href(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLAreaElement_QueryInterface(DispHTMLAreaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLAreaElement_AddRef(DispHTMLAreaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLAreaElement_Release(DispHTMLAreaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLAreaElement_GetTypeInfoCount(DispHTMLAreaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLAreaElement_GetTypeInfo(DispHTMLAreaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableCaption_QueryInterface(IHTMLTableCaption* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableCaption_AddRef(IHTMLTableCaption* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableCaption_Release(IHTMLTableCaption* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableCaption_GetTypeInfoCount(IHTMLTableCaption* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableCaption_GetTypeInfo(IHTMLTableCaption* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableCaption_put_align(IHTMLTableCaption* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCaption_get_align(IHTMLTableCaption* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCaption_put_vAlign(IHTMLTableCaption* This,BSTR v) {
    return This->lpVtbl->put_vAlign(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLTableCaption_QueryInterface(DispHTMLTableCaption* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLTableCaption_AddRef(DispHTMLTableCaption* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLTableCaption_Release(DispHTMLTableCaption* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLTableCaption_GetTypeInfoCount(DispHTMLTableCaption* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLTableCaption_GetTypeInfo(DispHTMLTableCaption* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCommentElement_QueryInterface(IHTMLCommentElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCommentElement_AddRef(IHTMLCommentElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCommentElement_Release(IHTMLCommentElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCommentElement_GetTypeInfoCount(IHTMLCommentElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCommentElement_GetTypeInfo(IHTMLCommentElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCommentElement_put_text(IHTMLCommentElement* This,BSTR v) {
    return This->lpVtbl->put_text(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCommentElement_get_text(IHTMLCommentElement* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCommentElement_put_atomic(IHTMLCommentElement* This,LONG v) {
    return This->lpVtbl->put_atomic(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCommentElement2_QueryInterface(IHTMLCommentElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCommentElement2_AddRef(IHTMLCommentElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCommentElement2_Release(IHTMLCommentElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCommentElement2_GetTypeInfoCount(IHTMLCommentElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCommentElement2_GetTypeInfo(IHTMLCommentElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCommentElement2_put_data(IHTMLCommentElement2* This,BSTR v) {
    return This->lpVtbl->put_data(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCommentElement2_get_data(IHTMLCommentElement2* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCommentElement2_get_length(IHTMLCommentElement2* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCommentElement2_substringData(IHTMLCommentElement2* This,LONG offset,LONG Count,BSTR *pbstrsubString) {
    return This->lpVtbl->substringData(This,offset,Count,pbstrsubString);
}
static __WIDL_INLINE HRESULT IHTMLCommentElement2_appendData(IHTMLCommentElement2* This,BSTR bstrstring) {
    return This->lpVtbl->appendData(This,bstrstring);
}
static __WIDL_INLINE HRESULT IHTMLCommentElement2_insertData(IHTMLCommentElement2* This,LONG offset,BSTR bstrstring) {
    return This->lpVtbl->insertData(This,offset,bstrstring);
}
static __WIDL_INLINE HRESULT IHTMLCommentElement2_deleteData(IHTMLCommentElement2* This,LONG offset,LONG Count) {
    return This->lpVtbl->deleteData(This,offset,Count);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCommentElement3_QueryInterface(IHTMLCommentElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCommentElement3_AddRef(IHTMLCommentElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCommentElement3_Release(IHTMLCommentElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCommentElement3_GetTypeInfoCount(IHTMLCommentElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCommentElement3_GetTypeInfo(IHTMLCommentElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCommentElement3_substringData(IHTMLCommentElement3* This,LONG offset,LONG Count,BSTR *pbstrsubString) {
    return This->lpVtbl->substringData(This,offset,Count,pbstrsubString);
}
static __WIDL_INLINE HRESULT IHTMLCommentElement3_insertData(IHTMLCommentElement3* This,LONG offset,BSTR bstrstring) {
    return This->lpVtbl->insertData(This,offset,bstrstring);
}
static __WIDL_INLINE HRESULT IHTMLCommentElement3_deleteData(IHTMLCommentElement3* This,LONG offset,LONG Count) {
    return This->lpVtbl->deleteData(This,offset,Count);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLCommentElement_QueryInterface(DispHTMLCommentElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLCommentElement_AddRef(DispHTMLCommentElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLCommentElement_Release(DispHTMLCommentElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLCommentElement_GetTypeInfoCount(DispHTMLCommentElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLCommentElement_GetTypeInfo(DispHTMLCommentElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPhraseElement_QueryInterface(IHTMLPhraseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLPhraseElement_AddRef(IHTMLPhraseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLPhraseElement_Release(IHTMLPhraseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLPhraseElement_GetTypeInfoCount(IHTMLPhraseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLPhraseElement_GetTypeInfo(IHTMLPhraseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPhraseElement2_QueryInterface(IHTMLPhraseElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLPhraseElement2_AddRef(IHTMLPhraseElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLPhraseElement2_Release(IHTMLPhraseElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLPhraseElement2_GetTypeInfoCount(IHTMLPhraseElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLPhraseElement2_GetTypeInfo(IHTMLPhraseElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPhraseElement2_put_cite(IHTMLPhraseElement2* This,BSTR v) {
    return This->lpVtbl->put_cite(This,v);
}
static __WIDL_INLINE HRESULT IHTMLPhraseElement2_get_cite(IHTMLPhraseElement2* This,BSTR *p) {
    return This->lpVtbl->get_cite(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPhraseElement2_put_dateTime(IHTMLPhraseElement2* This,BSTR v) {
    return This->lpVtbl->put_dateTime(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPhraseElement3_QueryInterface(IHTMLPhraseElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLPhraseElement3_AddRef(IHTMLPhraseElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLPhraseElement3_Release(IHTMLPhraseElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLPhraseElement3_GetTypeInfoCount(IHTMLPhraseElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLPhraseElement3_GetTypeInfo(IHTMLPhraseElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPhraseElement3_put_cite(IHTMLPhraseElement3* This,BSTR v) {
    return This->lpVtbl->put_cite(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSpanElement_QueryInterface(IHTMLSpanElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLSpanElement_AddRef(IHTMLSpanElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLSpanElement_Release(IHTMLSpanElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLSpanElement_GetTypeInfoCount(IHTMLSpanElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLSpanElement_GetTypeInfo(IHTMLSpanElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLPhraseElement_QueryInterface(DispHTMLPhraseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLPhraseElement_AddRef(DispHTMLPhraseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLPhraseElement_Release(DispHTMLPhraseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLPhraseElement_GetTypeInfoCount(DispHTMLPhraseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLPhraseElement_GetTypeInfo(DispHTMLPhraseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLSpanElement_QueryInterface(DispHTMLSpanElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLSpanElement_AddRef(DispHTMLSpanElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLSpanElement_Release(DispHTMLSpanElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLSpanElement_GetTypeInfoCount(DispHTMLSpanElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLSpanElement_GetTypeInfo(DispHTMLSpanElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLTableEvents2_QueryInterface(HTMLTableEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLTableEvents2_AddRef(HTMLTableEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLTableEvents2_Release(HTMLTableEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLTableEvents2_GetTypeInfoCount(HTMLTableEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLTableEvents2_GetTypeInfo(HTMLTableEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLTableEvents_QueryInterface(HTMLTableEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLTableEvents_AddRef(HTMLTableEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLTableEvents_Release(HTMLTableEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLTableEvents_GetTypeInfoCount(HTMLTableEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLTableEvents_GetTypeInfo(HTMLTableEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTable_QueryInterface(IHTMLTable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTable_AddRef(IHTMLTable* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTable_Release(IHTMLTable* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTable_GetTypeInfoCount(IHTMLTable* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTable_GetTypeInfo(IHTMLTable* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTable_put_cols(IHTMLTable* This,LONG v) {
    return This->lpVtbl->put_cols(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_cols(IHTMLTable* This,LONG *p) {
    return This->lpVtbl->get_cols(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_border(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_border(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_border(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_border(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_frame(IHTMLTable* This,BSTR v) {
    return This->lpVtbl->put_frame(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_frame(IHTMLTable* This,BSTR *p) {
    return This->lpVtbl->get_frame(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_rules(IHTMLTable* This,BSTR v) {
    return This->lpVtbl->put_rules(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_rules(IHTMLTable* This,BSTR *p) {
    return This->lpVtbl->get_rules(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_cellSpacing(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_cellSpacing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_cellSpacing(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_cellSpacing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_cellPadding(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_cellPadding(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_cellPadding(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_cellPadding(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_background(IHTMLTable* This,BSTR v) {
    return This->lpVtbl->put_background(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_background(IHTMLTable* This,BSTR *p) {
    return This->lpVtbl->get_background(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_bgColor(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_bgColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_bgColor(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_bgColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_borderColor(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_borderColor(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_borderColorLight(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_borderColorLight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_borderColorLight(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_borderColorLight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_borderColorDark(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_borderColorDark(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_borderColorDark(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_borderColorDark(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_align(IHTMLTable* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_align(IHTMLTable* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_refresh(IHTMLTable* This) {
    return This->lpVtbl->refresh(This);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_rows(IHTMLTable* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_rows(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_width(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_width(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_height(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_height(IHTMLTable* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_dataPageSize(IHTMLTable* This,LONG v) {
    return This->lpVtbl->put_dataPageSize(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_dataPageSize(IHTMLTable* This,LONG *p) {
    return This->lpVtbl->get_dataPageSize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_nextPage(IHTMLTable* This) {
    return This->lpVtbl->nextPage(This);
}
static __WIDL_INLINE HRESULT IHTMLTable_previousPage(IHTMLTable* This) {
    return This->lpVtbl->previousPage(This);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_tHead(IHTMLTable* This,IHTMLTableSection **p) {
    return This->lpVtbl->get_tHead(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_tFoot(IHTMLTable* This,IHTMLTableSection **p) {
    return This->lpVtbl->get_tFoot(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_tBodies(IHTMLTable* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_tBodies(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_caption(IHTMLTable* This,IHTMLTableCaption **p) {
    return This->lpVtbl->get_caption(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_createTHead(IHTMLTable* This,IDispatch **head) {
    return This->lpVtbl->createTHead(This,head);
}
static __WIDL_INLINE HRESULT IHTMLTable_deleteTHead(IHTMLTable* This) {
    return This->lpVtbl->deleteTHead(This);
}
static __WIDL_INLINE HRESULT IHTMLTable_createTFoot(IHTMLTable* This,IDispatch **foot) {
    return This->lpVtbl->createTFoot(This,foot);
}
static __WIDL_INLINE HRESULT IHTMLTable_deleteTFoot(IHTMLTable* This) {
    return This->lpVtbl->deleteTFoot(This);
}
static __WIDL_INLINE HRESULT IHTMLTable_createCaption(IHTMLTable* This,IHTMLTableCaption **caption) {
    return This->lpVtbl->createCaption(This,caption);
}
static __WIDL_INLINE HRESULT IHTMLTable_deleteCaption(IHTMLTable* This) {
    return This->lpVtbl->deleteCaption(This);
}
static __WIDL_INLINE HRESULT IHTMLTable_insertRow(IHTMLTable* This,LONG index,IDispatch **row) {
    return This->lpVtbl->insertRow(This,index,row);
}
static __WIDL_INLINE HRESULT IHTMLTable_deleteRow(IHTMLTable* This,LONG index) {
    return This->lpVtbl->deleteRow(This,index);
}
static __WIDL_INLINE HRESULT IHTMLTable_get_readyState(IHTMLTable* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable_put_onreadystatechange(IHTMLTable* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTable2_QueryInterface(IHTMLTable2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTable2_AddRef(IHTMLTable2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTable2_Release(IHTMLTable2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTable2_GetTypeInfoCount(IHTMLTable2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTable2_GetTypeInfo(IHTMLTable2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTable2_firstPage(IHTMLTable2* This) {
    return This->lpVtbl->firstPage(This);
}
static __WIDL_INLINE HRESULT IHTMLTable2_lastPage(IHTMLTable2* This) {
    return This->lpVtbl->lastPage(This);
}
static __WIDL_INLINE HRESULT IHTMLTable2_get_cells(IHTMLTable2* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_cells(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTable3_QueryInterface(IHTMLTable3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTable3_AddRef(IHTMLTable3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTable3_Release(IHTMLTable3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTable3_GetTypeInfoCount(IHTMLTable3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTable3_GetTypeInfo(IHTMLTable3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTable3_put_summary(IHTMLTable3* This,BSTR v) {
    return This->lpVtbl->put_summary(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTable4_QueryInterface(IHTMLTable4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTable4_AddRef(IHTMLTable4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTable4_Release(IHTMLTable4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTable4_GetTypeInfoCount(IHTMLTable4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTable4_GetTypeInfo(IHTMLTable4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTable4_putref_tHead(IHTMLTable4* This,IHTMLTableSection *v) {
    return This->lpVtbl->putref_tHead(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable4_get_tHead(IHTMLTable4* This,IHTMLTableSection **p) {
    return This->lpVtbl->get_tHead(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable4_putref_tFoot(IHTMLTable4* This,IHTMLTableSection *v) {
    return This->lpVtbl->putref_tFoot(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable4_get_tFoot(IHTMLTable4* This,IHTMLTableSection **p) {
    return This->lpVtbl->get_tFoot(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable4_putref_caption(IHTMLTable4* This,IHTMLTableCaption *v) {
    return This->lpVtbl->putref_caption(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTable4_get_caption(IHTMLTable4* This,IHTMLTableCaption **p) {
    return This->lpVtbl->get_caption(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTable4_insertRow(IHTMLTable4* This,LONG index,IDispatch **row) {
    return This->lpVtbl->insertRow(This,index,row);
}
static __WIDL_INLINE HRESULT IHTMLTable4_deleteRow(IHTMLTable4* This,LONG index) {
    return This->lpVtbl->deleteRow(This,index);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableCol_QueryInterface(IHTMLTableCol* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableCol_AddRef(IHTMLTableCol* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableCol_Release(IHTMLTableCol* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableCol_GetTypeInfoCount(IHTMLTableCol* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableCol_GetTypeInfo(IHTMLTableCol* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableCol_put_span(IHTMLTableCol* This,LONG v) {
    return This->lpVtbl->put_span(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCol_get_span(IHTMLTableCol* This,LONG *p) {
    return This->lpVtbl->get_span(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCol_put_width(IHTMLTableCol* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCol_get_width(IHTMLTableCol* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCol_put_align(IHTMLTableCol* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCol_get_align(IHTMLTableCol* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCol_put_vAlign(IHTMLTableCol* This,BSTR v) {
    return This->lpVtbl->put_vAlign(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableCol2_QueryInterface(IHTMLTableCol2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableCol2_AddRef(IHTMLTableCol2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableCol2_Release(IHTMLTableCol2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableCol2_GetTypeInfoCount(IHTMLTableCol2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableCol2_GetTypeInfo(IHTMLTableCol2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableCol2_put_ch(IHTMLTableCol2* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCol2_get_ch(IHTMLTableCol2* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCol2_put_chOff(IHTMLTableCol2* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableCol3_QueryInterface(IHTMLTableCol3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableCol3_AddRef(IHTMLTableCol3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableCol3_Release(IHTMLTableCol3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableCol3_GetTypeInfoCount(IHTMLTableCol3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableCol3_GetTypeInfo(IHTMLTableCol3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableCol3_put_ch(IHTMLTableCol3* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCol3_get_ch(IHTMLTableCol3* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCol3_put_chOff(IHTMLTableCol3* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableSection_QueryInterface(IHTMLTableSection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableSection_AddRef(IHTMLTableSection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableSection_Release(IHTMLTableSection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableSection_GetTypeInfoCount(IHTMLTableSection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableSection_GetTypeInfo(IHTMLTableSection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableSection_put_align(IHTMLTableSection* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableSection_get_align(IHTMLTableSection* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableSection_put_vAlign(IHTMLTableSection* This,BSTR v) {
    return This->lpVtbl->put_vAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableSection_get_vAlign(IHTMLTableSection* This,BSTR *p) {
    return This->lpVtbl->get_vAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableSection_put_bgColor(IHTMLTableSection* This,VARIANT v) {
    return This->lpVtbl->put_bgColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableSection_get_bgColor(IHTMLTableSection* This,VARIANT *p) {
    return This->lpVtbl->get_bgColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableSection_get_rows(IHTMLTableSection* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_rows(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableSection_insertRow(IHTMLTableSection* This,LONG index,IDispatch **row) {
    return This->lpVtbl->insertRow(This,index,row);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableSection2_QueryInterface(IHTMLTableSection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableSection2_AddRef(IHTMLTableSection2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableSection2_Release(IHTMLTableSection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableSection2_GetTypeInfoCount(IHTMLTableSection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableSection2_GetTypeInfo(IHTMLTableSection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableSection3_QueryInterface(IHTMLTableSection3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableSection3_AddRef(IHTMLTableSection3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableSection3_Release(IHTMLTableSection3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableSection3_GetTypeInfoCount(IHTMLTableSection3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableSection3_GetTypeInfo(IHTMLTableSection3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableSection3_put_ch(IHTMLTableSection3* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableSection3_get_ch(IHTMLTableSection3* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableSection3_put_chOff(IHTMLTableSection3* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableSection4_QueryInterface(IHTMLTableSection4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableSection4_AddRef(IHTMLTableSection4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableSection4_Release(IHTMLTableSection4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableSection4_GetTypeInfoCount(IHTMLTableSection4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableSection4_GetTypeInfo(IHTMLTableSection4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableSection4_put_ch(IHTMLTableSection4* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableSection4_get_ch(IHTMLTableSection4* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableSection4_put_chOff(IHTMLTableSection4* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableSection4_get_chOff(IHTMLTableSection4* This,BSTR *p) {
    return This->lpVtbl->get_chOff(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableSection4_insertRow(IHTMLTableSection4* This,LONG index,IDispatch **row) {
    return This->lpVtbl->insertRow(This,index,row);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableRow_QueryInterface(IHTMLTableRow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableRow_AddRef(IHTMLTableRow* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableRow_Release(IHTMLTableRow* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableRow_GetTypeInfoCount(IHTMLTableRow* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_GetTypeInfo(IHTMLTableRow* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableRow_put_align(IHTMLTableRow* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_get_align(IHTMLTableRow* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_put_vAlign(IHTMLTableRow* This,BSTR v) {
    return This->lpVtbl->put_vAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_get_vAlign(IHTMLTableRow* This,BSTR *p) {
    return This->lpVtbl->get_vAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_put_bgColor(IHTMLTableRow* This,VARIANT v) {
    return This->lpVtbl->put_bgColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_get_bgColor(IHTMLTableRow* This,VARIANT *p) {
    return This->lpVtbl->get_bgColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_put_borderColor(IHTMLTableRow* This,VARIANT v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_get_borderColor(IHTMLTableRow* This,VARIANT *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_put_borderColorLight(IHTMLTableRow* This,VARIANT v) {
    return This->lpVtbl->put_borderColorLight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_get_borderColorLight(IHTMLTableRow* This,VARIANT *p) {
    return This->lpVtbl->get_borderColorLight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_put_borderColorDark(IHTMLTableRow* This,VARIANT v) {
    return This->lpVtbl->put_borderColorDark(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_get_borderColorDark(IHTMLTableRow* This,VARIANT *p) {
    return This->lpVtbl->get_borderColorDark(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_get_rowIndex(IHTMLTableRow* This,LONG *p) {
    return This->lpVtbl->get_rowIndex(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_get_sectionRowIndex(IHTMLTableRow* This,LONG *p) {
    return This->lpVtbl->get_sectionRowIndex(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_get_cells(IHTMLTableRow* This,IHTMLElementCollection **p) {
    return This->lpVtbl->get_cells(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableRow_insertCell(IHTMLTableRow* This,LONG index,IDispatch **row) {
    return This->lpVtbl->insertCell(This,index,row);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableRow2_QueryInterface(IHTMLTableRow2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableRow2_AddRef(IHTMLTableRow2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableRow2_Release(IHTMLTableRow2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableRow2_GetTypeInfoCount(IHTMLTableRow2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableRow2_GetTypeInfo(IHTMLTableRow2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableRow2_put_height(IHTMLTableRow2* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableRow3_QueryInterface(IHTMLTableRow3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableRow3_AddRef(IHTMLTableRow3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableRow3_Release(IHTMLTableRow3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableRow3_GetTypeInfoCount(IHTMLTableRow3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableRow3_GetTypeInfo(IHTMLTableRow3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableRow3_put_ch(IHTMLTableRow3* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableRow3_get_ch(IHTMLTableRow3* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableRow3_put_chOff(IHTMLTableRow3* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableRow4_QueryInterface(IHTMLTableRow4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableRow4_AddRef(IHTMLTableRow4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableRow4_Release(IHTMLTableRow4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableRow4_GetTypeInfoCount(IHTMLTableRow4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableRow4_GetTypeInfo(IHTMLTableRow4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableRow4_put_ch(IHTMLTableRow4* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableRow4_get_ch(IHTMLTableRow4* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableRow4_put_chOff(IHTMLTableRow4* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableRow4_get_chOff(IHTMLTableRow4* This,BSTR *p) {
    return This->lpVtbl->get_chOff(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableRow4_insertCell(IHTMLTableRow4* This,LONG index,IDispatch **row) {
    return This->lpVtbl->insertCell(This,index,row);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableRowMetrics_QueryInterface(IHTMLTableRowMetrics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableRowMetrics_AddRef(IHTMLTableRowMetrics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableRowMetrics_Release(IHTMLTableRowMetrics* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableRowMetrics_GetTypeInfoCount(IHTMLTableRowMetrics* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableRowMetrics_GetTypeInfo(IHTMLTableRowMetrics* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableRowMetrics_get_clientHeight(IHTMLTableRowMetrics* This,LONG *p) {
    return This->lpVtbl->get_clientHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableRowMetrics_get_clientWidth(IHTMLTableRowMetrics* This,LONG *p) {
    return This->lpVtbl->get_clientWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableRowMetrics_get_clientTop(IHTMLTableRowMetrics* This,LONG *p) {
    return This->lpVtbl->get_clientTop(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableCell_QueryInterface(IHTMLTableCell* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableCell_AddRef(IHTMLTableCell* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableCell_Release(IHTMLTableCell* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableCell_GetTypeInfoCount(IHTMLTableCell* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_GetTypeInfo(IHTMLTableCell* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableCell_put_rowSpan(IHTMLTableCell* This,LONG v) {
    return This->lpVtbl->put_rowSpan(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_get_rowSpan(IHTMLTableCell* This,LONG *p) {
    return This->lpVtbl->get_rowSpan(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_put_colSpan(IHTMLTableCell* This,LONG v) {
    return This->lpVtbl->put_colSpan(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_get_colSpan(IHTMLTableCell* This,LONG *p) {
    return This->lpVtbl->get_colSpan(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_put_align(IHTMLTableCell* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_get_align(IHTMLTableCell* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_put_vAlign(IHTMLTableCell* This,BSTR v) {
    return This->lpVtbl->put_vAlign(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_get_vAlign(IHTMLTableCell* This,BSTR *p) {
    return This->lpVtbl->get_vAlign(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_put_bgColor(IHTMLTableCell* This,VARIANT v) {
    return This->lpVtbl->put_bgColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_get_bgColor(IHTMLTableCell* This,VARIANT *p) {
    return This->lpVtbl->get_bgColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_put_noWrap(IHTMLTableCell* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noWrap(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_get_noWrap(IHTMLTableCell* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_noWrap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_put_background(IHTMLTableCell* This,BSTR v) {
    return This->lpVtbl->put_background(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_get_background(IHTMLTableCell* This,BSTR *p) {
    return This->lpVtbl->get_background(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_put_borderColor(IHTMLTableCell* This,VARIANT v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_get_borderColor(IHTMLTableCell* This,VARIANT *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_put_borderColorLight(IHTMLTableCell* This,VARIANT v) {
    return This->lpVtbl->put_borderColorLight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_get_borderColorLight(IHTMLTableCell* This,VARIANT *p) {
    return This->lpVtbl->get_borderColorLight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_put_borderColorDark(IHTMLTableCell* This,VARIANT v) {
    return This->lpVtbl->put_borderColorDark(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_get_borderColorDark(IHTMLTableCell* This,VARIANT *p) {
    return This->lpVtbl->get_borderColorDark(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_put_width(IHTMLTableCell* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_get_width(IHTMLTableCell* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_put_height(IHTMLTableCell* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell_get_height(IHTMLTableCell* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableCell2_QueryInterface(IHTMLTableCell2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableCell2_AddRef(IHTMLTableCell2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableCell2_Release(IHTMLTableCell2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableCell2_GetTypeInfoCount(IHTMLTableCell2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableCell2_GetTypeInfo(IHTMLTableCell2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableCell2_put_abbr(IHTMLTableCell2* This,BSTR v) {
    return This->lpVtbl->put_abbr(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell2_get_abbr(IHTMLTableCell2* This,BSTR *p) {
    return This->lpVtbl->get_abbr(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell2_put_axis(IHTMLTableCell2* This,BSTR v) {
    return This->lpVtbl->put_axis(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell2_get_axis(IHTMLTableCell2* This,BSTR *p) {
    return This->lpVtbl->get_axis(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell2_put_ch(IHTMLTableCell2* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell2_get_ch(IHTMLTableCell2* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell2_put_chOff(IHTMLTableCell2* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell2_get_chOff(IHTMLTableCell2* This,BSTR *p) {
    return This->lpVtbl->get_chOff(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell2_put_headers(IHTMLTableCell2* This,BSTR v) {
    return This->lpVtbl->put_headers(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell2_get_headers(IHTMLTableCell2* This,BSTR *p) {
    return This->lpVtbl->get_headers(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell2_put_scope(IHTMLTableCell2* This,BSTR v) {
    return This->lpVtbl->put_scope(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableCell3_QueryInterface(IHTMLTableCell3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTableCell3_AddRef(IHTMLTableCell3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTableCell3_Release(IHTMLTableCell3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTableCell3_GetTypeInfoCount(IHTMLTableCell3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTableCell3_GetTypeInfo(IHTMLTableCell3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTableCell3_put_ch(IHTMLTableCell3* This,BSTR v) {
    return This->lpVtbl->put_ch(This,v);
}
static __WIDL_INLINE HRESULT IHTMLTableCell3_get_ch(IHTMLTableCell3* This,BSTR *p) {
    return This->lpVtbl->get_ch(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTableCell3_put_chOff(IHTMLTableCell3* This,BSTR v) {
    return This->lpVtbl->put_chOff(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLTable_QueryInterface(DispHTMLTable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLTable_AddRef(DispHTMLTable* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLTable_Release(DispHTMLTable* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLTable_GetTypeInfoCount(DispHTMLTable* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLTable_GetTypeInfo(DispHTMLTable* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLTableCol_QueryInterface(DispHTMLTableCol* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLTableCol_AddRef(DispHTMLTableCol* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLTableCol_Release(DispHTMLTableCol* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLTableCol_GetTypeInfoCount(DispHTMLTableCol* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLTableCol_GetTypeInfo(DispHTMLTableCol* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLTableSection_QueryInterface(DispHTMLTableSection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLTableSection_AddRef(DispHTMLTableSection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLTableSection_Release(DispHTMLTableSection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLTableSection_GetTypeInfoCount(DispHTMLTableSection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLTableSection_GetTypeInfo(DispHTMLTableSection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLTableRow_QueryInterface(DispHTMLTableRow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLTableRow_AddRef(DispHTMLTableRow* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLTableRow_Release(DispHTMLTableRow* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLTableRow_GetTypeInfoCount(DispHTMLTableRow* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLTableRow_GetTypeInfo(DispHTMLTableRow* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLTableCell_QueryInterface(DispHTMLTableCell* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLTableCell_AddRef(DispHTMLTableCell* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLTableCell_Release(DispHTMLTableCell* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLTableCell_GetTypeInfoCount(DispHTMLTableCell* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLTableCell_GetTypeInfo(DispHTMLTableCell* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLScriptEvents2_QueryInterface(HTMLScriptEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLScriptEvents2_AddRef(HTMLScriptEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLScriptEvents2_Release(HTMLScriptEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLScriptEvents2_GetTypeInfoCount(HTMLScriptEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLScriptEvents2_GetTypeInfo(HTMLScriptEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLScriptEvents_QueryInterface(HTMLScriptEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLScriptEvents_AddRef(HTMLScriptEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLScriptEvents_Release(HTMLScriptEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLScriptEvents_GetTypeInfoCount(HTMLScriptEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLScriptEvents_GetTypeInfo(HTMLScriptEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLScriptElement_QueryInterface(IHTMLScriptElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLScriptElement_AddRef(IHTMLScriptElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLScriptElement_Release(IHTMLScriptElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLScriptElement_GetTypeInfoCount(IHTMLScriptElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement_GetTypeInfo(IHTMLScriptElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLScriptElement_put_src(IHTMLScriptElement* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement_get_src(IHTMLScriptElement* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement_put_htmlFor(IHTMLScriptElement* This,BSTR v) {
    return This->lpVtbl->put_htmlFor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement_get_htmlFor(IHTMLScriptElement* This,BSTR *p) {
    return This->lpVtbl->get_htmlFor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement_put_event(IHTMLScriptElement* This,BSTR v) {
    return This->lpVtbl->put_event(This,v);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement_get_event(IHTMLScriptElement* This,BSTR *p) {
    return This->lpVtbl->get_event(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement_put_text(IHTMLScriptElement* This,BSTR v) {
    return This->lpVtbl->put_text(This,v);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement_get_text(IHTMLScriptElement* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement_put_defer(IHTMLScriptElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_defer(This,v);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement_get_defer(IHTMLScriptElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_defer(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement_get_readyState(IHTMLScriptElement* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement_put_onerror(IHTMLScriptElement* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement_get_onerror(IHTMLScriptElement* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement_put_type(IHTMLScriptElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLScriptElement2_QueryInterface(IHTMLScriptElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLScriptElement2_AddRef(IHTMLScriptElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLScriptElement2_Release(IHTMLScriptElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLScriptElement2_GetTypeInfoCount(IHTMLScriptElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement2_GetTypeInfo(IHTMLScriptElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLScriptElement2_put_charset(IHTMLScriptElement2* This,BSTR v) {
    return This->lpVtbl->put_charset(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLScriptElement3_QueryInterface(IHTMLScriptElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLScriptElement3_AddRef(IHTMLScriptElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLScriptElement3_Release(IHTMLScriptElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLScriptElement3_GetTypeInfoCount(IHTMLScriptElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement3_GetTypeInfo(IHTMLScriptElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLScriptElement3_put_src(IHTMLScriptElement3* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLScriptElement4_QueryInterface(IHTMLScriptElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLScriptElement4_AddRef(IHTMLScriptElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLScriptElement4_Release(IHTMLScriptElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLScriptElement4_GetTypeInfoCount(IHTMLScriptElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLScriptElement4_GetTypeInfo(IHTMLScriptElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLScriptElement_QueryInterface(DispHTMLScriptElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLScriptElement_AddRef(DispHTMLScriptElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLScriptElement_Release(DispHTMLScriptElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLScriptElement_GetTypeInfoCount(DispHTMLScriptElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLScriptElement_GetTypeInfo(DispHTMLScriptElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLNoShowElement_QueryInterface(IHTMLNoShowElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLNoShowElement_AddRef(IHTMLNoShowElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLNoShowElement_Release(IHTMLNoShowElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLNoShowElement_GetTypeInfoCount(IHTMLNoShowElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLNoShowElement_GetTypeInfo(IHTMLNoShowElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLNoShowElement_QueryInterface(DispHTMLNoShowElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLNoShowElement_AddRef(DispHTMLNoShowElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLNoShowElement_Release(DispHTMLNoShowElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLNoShowElement_GetTypeInfoCount(DispHTMLNoShowElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLNoShowElement_GetTypeInfo(DispHTMLNoShowElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLObjectElementEvents2_QueryInterface(HTMLObjectElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLObjectElementEvents2_AddRef(HTMLObjectElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLObjectElementEvents2_Release(HTMLObjectElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLObjectElementEvents2_GetTypeInfoCount(HTMLObjectElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLObjectElementEvents2_GetTypeInfo(HTMLObjectElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLObjectElementEvents_QueryInterface(HTMLObjectElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLObjectElementEvents_AddRef(HTMLObjectElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLObjectElementEvents_Release(HTMLObjectElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLObjectElementEvents_GetTypeInfoCount(HTMLObjectElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLObjectElementEvents_GetTypeInfo(HTMLObjectElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLObjectElement_QueryInterface(IHTMLObjectElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLObjectElement_AddRef(IHTMLObjectElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLObjectElement_Release(IHTMLObjectElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLObjectElement_GetTypeInfoCount(IHTMLObjectElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_GetTypeInfo(IHTMLObjectElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLObjectElement_get_object(IHTMLObjectElement* This,IDispatch **p) {
    return This->lpVtbl->get_object(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_classid(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_classid(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_data(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_putref_recordset(IHTMLObjectElement* This,IDispatch *v) {
    return This->lpVtbl->putref_recordset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_recordset(IHTMLObjectElement* This,IDispatch **p) {
    return This->lpVtbl->get_recordset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_put_align(IHTMLObjectElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_align(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_align(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_put_name(IHTMLObjectElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_name(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_put_codeBase(IHTMLObjectElement* This,BSTR v) {
    return This->lpVtbl->put_codeBase(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_codeBase(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_codeBase(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_put_codeType(IHTMLObjectElement* This,BSTR v) {
    return This->lpVtbl->put_codeType(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_codeType(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_codeType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_put_code(IHTMLObjectElement* This,BSTR v) {
    return This->lpVtbl->put_code(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_code(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_code(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_BaseHref(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_BaseHref(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_put_type(IHTMLObjectElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_type(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_form(IHTMLObjectElement* This,IHTMLFormElement **p) {
    return This->lpVtbl->get_form(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_put_width(IHTMLObjectElement* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_width(IHTMLObjectElement* This,VARIANT *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_put_height(IHTMLObjectElement* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_height(IHTMLObjectElement* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_readyState(IHTMLObjectElement* This,LONG *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_put_onreadystatechange(IHTMLObjectElement* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_onreadystatechange(IHTMLObjectElement* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_put_onerror(IHTMLObjectElement* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_onerror(IHTMLObjectElement* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_put_altHtml(IHTMLObjectElement* This,BSTR v) {
    return This->lpVtbl->put_altHtml(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_altHtml(IHTMLObjectElement* This,BSTR *p) {
    return This->lpVtbl->get_altHtml(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_put_vspace(IHTMLObjectElement* This,LONG v) {
    return This->lpVtbl->put_vspace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_get_vspace(IHTMLObjectElement* This,LONG *p) {
    return This->lpVtbl->get_vspace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement_put_hspace(IHTMLObjectElement* This,LONG v) {
    return This->lpVtbl->put_hspace(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLObjectElement2_QueryInterface(IHTMLObjectElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLObjectElement2_AddRef(IHTMLObjectElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLObjectElement2_Release(IHTMLObjectElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLObjectElement2_GetTypeInfoCount(IHTMLObjectElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement2_GetTypeInfo(IHTMLObjectElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLObjectElement2_namedRecordset(IHTMLObjectElement2* This,BSTR dataMember,VARIANT *hierarchy,IDispatch **ppRecordset) {
    return This->lpVtbl->namedRecordset(This,dataMember,hierarchy,ppRecordset);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement2_put_classid(IHTMLObjectElement2* This,BSTR v) {
    return This->lpVtbl->put_classid(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement2_get_classid(IHTMLObjectElement2* This,BSTR *p) {
    return This->lpVtbl->get_classid(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement2_put_data(IHTMLObjectElement2* This,BSTR v) {
    return This->lpVtbl->put_data(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLObjectElement3_QueryInterface(IHTMLObjectElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLObjectElement3_AddRef(IHTMLObjectElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLObjectElement3_Release(IHTMLObjectElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLObjectElement3_GetTypeInfoCount(IHTMLObjectElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement3_GetTypeInfo(IHTMLObjectElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLObjectElement3_put_archive(IHTMLObjectElement3* This,BSTR v) {
    return This->lpVtbl->put_archive(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement3_get_archive(IHTMLObjectElement3* This,BSTR *p) {
    return This->lpVtbl->get_archive(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement3_put_alt(IHTMLObjectElement3* This,BSTR v) {
    return This->lpVtbl->put_alt(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement3_get_alt(IHTMLObjectElement3* This,BSTR *p) {
    return This->lpVtbl->get_alt(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement3_put_declare(IHTMLObjectElement3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_declare(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement3_get_declare(IHTMLObjectElement3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_declare(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement3_put_standby(IHTMLObjectElement3* This,BSTR v) {
    return This->lpVtbl->put_standby(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement3_get_standby(IHTMLObjectElement3* This,BSTR *p) {
    return This->lpVtbl->get_standby(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement3_put_border(IHTMLObjectElement3* This,VARIANT v) {
    return This->lpVtbl->put_border(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement3_get_border(IHTMLObjectElement3* This,VARIANT *p) {
    return This->lpVtbl->get_border(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement3_put_useMap(IHTMLObjectElement3* This,BSTR v) {
    return This->lpVtbl->put_useMap(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLObjectElement4_QueryInterface(IHTMLObjectElement4* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLObjectElement4_AddRef(IHTMLObjectElement4* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLObjectElement4_Release(IHTMLObjectElement4* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLObjectElement4_GetTypeInfoCount(IHTMLObjectElement4* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement4_GetTypeInfo(IHTMLObjectElement4* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLObjectElement4_get_contentDocument(IHTMLObjectElement4* This,IDispatch **p) {
    return This->lpVtbl->get_contentDocument(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement4_put_codeBase(IHTMLObjectElement4* This,BSTR v) {
    return This->lpVtbl->put_codeBase(This,v);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement4_get_codeBase(IHTMLObjectElement4* This,BSTR *p) {
    return This->lpVtbl->get_codeBase(This,p);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement4_put_data(IHTMLObjectElement4* This,BSTR v) {
    return This->lpVtbl->put_data(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLObjectElement5_QueryInterface(IHTMLObjectElement5* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLObjectElement5_AddRef(IHTMLObjectElement5* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLObjectElement5_Release(IHTMLObjectElement5* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLObjectElement5_GetTypeInfoCount(IHTMLObjectElement5* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLObjectElement5_GetTypeInfo(IHTMLObjectElement5* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLObjectElement5_put_object(IHTMLObjectElement5* This,BSTR v) {
    return This->lpVtbl->put_object(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLParamElement_QueryInterface(IHTMLParamElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLParamElement_AddRef(IHTMLParamElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLParamElement_Release(IHTMLParamElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLParamElement_GetTypeInfoCount(IHTMLParamElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLParamElement_GetTypeInfo(IHTMLParamElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLParamElement_put_name(IHTMLParamElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLParamElement_get_name(IHTMLParamElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLParamElement_put_value(IHTMLParamElement* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLParamElement_get_value(IHTMLParamElement* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLParamElement_put_type(IHTMLParamElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE HRESULT IHTMLParamElement_get_type(IHTMLParamElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLParamElement_put_valueType(IHTMLParamElement* This,BSTR v) {
    return This->lpVtbl->put_valueType(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLParamElement2_QueryInterface(IHTMLParamElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLParamElement2_AddRef(IHTMLParamElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLParamElement2_Release(IHTMLParamElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLParamElement2_GetTypeInfoCount(IHTMLParamElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLParamElement2_GetTypeInfo(IHTMLParamElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLParamElement2_put_name(IHTMLParamElement2* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLParamElement2_get_name(IHTMLParamElement2* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLParamElement2_put_type(IHTMLParamElement2* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE HRESULT IHTMLParamElement2_get_type(IHTMLParamElement2* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLParamElement2_put_value(IHTMLParamElement2* This,BSTR v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLParamElement2_get_value(IHTMLParamElement2* This,BSTR *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLParamElement2_put_valueType(IHTMLParamElement2* This,BSTR v) {
    return This->lpVtbl->put_valueType(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLObjectElement_QueryInterface(DispHTMLObjectElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLObjectElement_AddRef(DispHTMLObjectElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLObjectElement_Release(DispHTMLObjectElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLObjectElement_GetTypeInfoCount(DispHTMLObjectElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLObjectElement_GetTypeInfo(DispHTMLObjectElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLParamElement_QueryInterface(DispHTMLParamElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLParamElement_AddRef(DispHTMLParamElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLParamElement_Release(DispHTMLParamElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLParamElement_GetTypeInfoCount(DispHTMLParamElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLParamElement_GetTypeInfo(DispHTMLParamElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLFrameSiteEvents2_QueryInterface(HTMLFrameSiteEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLFrameSiteEvents2_AddRef(HTMLFrameSiteEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLFrameSiteEvents2_Release(HTMLFrameSiteEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLFrameSiteEvents2_GetTypeInfoCount(HTMLFrameSiteEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLFrameSiteEvents2_GetTypeInfo(HTMLFrameSiteEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLFrameSiteEvents_QueryInterface(HTMLFrameSiteEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLFrameSiteEvents_AddRef(HTMLFrameSiteEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLFrameSiteEvents_Release(HTMLFrameSiteEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLFrameSiteEvents_GetTypeInfoCount(HTMLFrameSiteEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLFrameSiteEvents_GetTypeInfo(HTMLFrameSiteEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameBase_QueryInterface(IHTMLFrameBase* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFrameBase_AddRef(IHTMLFrameBase* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFrameBase_Release(IHTMLFrameBase* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFrameBase_GetTypeInfoCount(IHTMLFrameBase* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_GetTypeInfo(IHTMLFrameBase* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameBase_put_src(IHTMLFrameBase* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_get_src(IHTMLFrameBase* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_put_name(IHTMLFrameBase* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_get_name(IHTMLFrameBase* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_put_border(IHTMLFrameBase* This,VARIANT v) {
    return This->lpVtbl->put_border(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_get_border(IHTMLFrameBase* This,VARIANT *p) {
    return This->lpVtbl->get_border(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_put_frameBorder(IHTMLFrameBase* This,BSTR v) {
    return This->lpVtbl->put_frameBorder(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_get_frameBorder(IHTMLFrameBase* This,BSTR *p) {
    return This->lpVtbl->get_frameBorder(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_put_frameSpacing(IHTMLFrameBase* This,VARIANT v) {
    return This->lpVtbl->put_frameSpacing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_get_frameSpacing(IHTMLFrameBase* This,VARIANT *p) {
    return This->lpVtbl->get_frameSpacing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_put_marginWidth(IHTMLFrameBase* This,VARIANT v) {
    return This->lpVtbl->put_marginWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_get_marginWidth(IHTMLFrameBase* This,VARIANT *p) {
    return This->lpVtbl->get_marginWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_put_marginHeight(IHTMLFrameBase* This,VARIANT v) {
    return This->lpVtbl->put_marginHeight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_get_marginHeight(IHTMLFrameBase* This,VARIANT *p) {
    return This->lpVtbl->get_marginHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_put_noResize(IHTMLFrameBase* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_noResize(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_get_noResize(IHTMLFrameBase* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_noResize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase_put_scrolling(IHTMLFrameBase* This,BSTR v) {
    return This->lpVtbl->put_scrolling(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameBase2_QueryInterface(IHTMLFrameBase2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFrameBase2_AddRef(IHTMLFrameBase2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFrameBase2_Release(IHTMLFrameBase2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFrameBase2_GetTypeInfoCount(IHTMLFrameBase2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase2_GetTypeInfo(IHTMLFrameBase2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameBase2_get_contentWindow(IHTMLFrameBase2* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_contentWindow(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase2_put_onload(IHTMLFrameBase2* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase2_get_onload(IHTMLFrameBase2* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase2_put_onreadystatechange(IHTMLFrameBase2* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase2_get_onreadystatechange(IHTMLFrameBase2* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase2_get_readyState(IHTMLFrameBase2* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase2_put_allowTransparency(IHTMLFrameBase2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_allowTransparency(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameBase3_QueryInterface(IHTMLFrameBase3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFrameBase3_AddRef(IHTMLFrameBase3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFrameBase3_Release(IHTMLFrameBase3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFrameBase3_GetTypeInfoCount(IHTMLFrameBase3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFrameBase3_GetTypeInfo(IHTMLFrameBase3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameBase3_put_longDesc(IHTMLFrameBase3* This,BSTR v) {
    return This->lpVtbl->put_longDesc(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLFrameBase_QueryInterface(DispHTMLFrameBase* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLFrameBase_AddRef(DispHTMLFrameBase* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLFrameBase_Release(DispHTMLFrameBase* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLFrameBase_GetTypeInfoCount(DispHTMLFrameBase* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLFrameBase_GetTypeInfo(DispHTMLFrameBase* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameElement_QueryInterface(IHTMLFrameElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFrameElement_AddRef(IHTMLFrameElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFrameElement_Release(IHTMLFrameElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFrameElement_GetTypeInfoCount(IHTMLFrameElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFrameElement_GetTypeInfo(IHTMLFrameElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameElement_put_borderColor(IHTMLFrameElement* This,VARIANT v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameElement2_QueryInterface(IHTMLFrameElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFrameElement2_AddRef(IHTMLFrameElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFrameElement2_Release(IHTMLFrameElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFrameElement2_GetTypeInfoCount(IHTMLFrameElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFrameElement2_GetTypeInfo(IHTMLFrameElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameElement2_put_height(IHTMLFrameElement2* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameElement2_get_height(IHTMLFrameElement2* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameElement2_put_width(IHTMLFrameElement2* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameElement3_QueryInterface(IHTMLFrameElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFrameElement3_AddRef(IHTMLFrameElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFrameElement3_Release(IHTMLFrameElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFrameElement3_GetTypeInfoCount(IHTMLFrameElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFrameElement3_GetTypeInfo(IHTMLFrameElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameElement3_get_contentDocument(IHTMLFrameElement3* This,IDispatch **p) {
    return This->lpVtbl->get_contentDocument(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameElement3_put_src(IHTMLFrameElement3* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameElement3_get_src(IHTMLFrameElement3* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameElement3_put_longDesc(IHTMLFrameElement3* This,BSTR v) {
    return This->lpVtbl->put_longDesc(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameElement3_get_longDesc(IHTMLFrameElement3* This,BSTR *p) {
    return This->lpVtbl->get_longDesc(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameElement3_put_frameBorder(IHTMLFrameElement3* This,BSTR v) {
    return This->lpVtbl->put_frameBorder(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLFrameElement_QueryInterface(DispHTMLFrameElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLFrameElement_AddRef(DispHTMLFrameElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLFrameElement_Release(DispHTMLFrameElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLFrameElement_GetTypeInfoCount(DispHTMLFrameElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLFrameElement_GetTypeInfo(DispHTMLFrameElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLIFrameElement_QueryInterface(IHTMLIFrameElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLIFrameElement_AddRef(IHTMLIFrameElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLIFrameElement_Release(IHTMLIFrameElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLIFrameElement_GetTypeInfoCount(IHTMLIFrameElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLIFrameElement_GetTypeInfo(IHTMLIFrameElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLIFrameElement_put_vspace(IHTMLIFrameElement* This,LONG v) {
    return This->lpVtbl->put_vspace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLIFrameElement_get_vspace(IHTMLIFrameElement* This,LONG *p) {
    return This->lpVtbl->get_vspace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLIFrameElement_put_hspace(IHTMLIFrameElement* This,LONG v) {
    return This->lpVtbl->put_hspace(This,v);
}
static __WIDL_INLINE HRESULT IHTMLIFrameElement_get_hspace(IHTMLIFrameElement* This,LONG *p) {
    return This->lpVtbl->get_hspace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLIFrameElement_put_align(IHTMLIFrameElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLIFrameElement2_QueryInterface(IHTMLIFrameElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLIFrameElement2_AddRef(IHTMLIFrameElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLIFrameElement2_Release(IHTMLIFrameElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLIFrameElement2_GetTypeInfoCount(IHTMLIFrameElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLIFrameElement2_GetTypeInfo(IHTMLIFrameElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLIFrameElement2_put_height(IHTMLIFrameElement2* This,VARIANT v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE HRESULT IHTMLIFrameElement2_get_height(IHTMLIFrameElement2* This,VARIANT *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLIFrameElement2_put_width(IHTMLIFrameElement2* This,VARIANT v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLIFrameElement3_QueryInterface(IHTMLIFrameElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLIFrameElement3_AddRef(IHTMLIFrameElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLIFrameElement3_Release(IHTMLIFrameElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLIFrameElement3_GetTypeInfoCount(IHTMLIFrameElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLIFrameElement3_GetTypeInfo(IHTMLIFrameElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLIFrameElement3_get_contentDocument(IHTMLIFrameElement3* This,IDispatch **p) {
    return This->lpVtbl->get_contentDocument(This,p);
}
static __WIDL_INLINE HRESULT IHTMLIFrameElement3_put_src(IHTMLIFrameElement3* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static __WIDL_INLINE HRESULT IHTMLIFrameElement3_get_src(IHTMLIFrameElement3* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static __WIDL_INLINE HRESULT IHTMLIFrameElement3_put_longDesc(IHTMLIFrameElement3* This,BSTR v) {
    return This->lpVtbl->put_longDesc(This,v);
}
static __WIDL_INLINE HRESULT IHTMLIFrameElement3_get_longDesc(IHTMLIFrameElement3* This,BSTR *p) {
    return This->lpVtbl->get_longDesc(This,p);
}
static __WIDL_INLINE HRESULT IHTMLIFrameElement3_put_frameBorder(IHTMLIFrameElement3* This,BSTR v) {
    return This->lpVtbl->put_frameBorder(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLIFrame_QueryInterface(DispHTMLIFrame* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLIFrame_AddRef(DispHTMLIFrame* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLIFrame_Release(DispHTMLIFrame* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLIFrame_GetTypeInfoCount(DispHTMLIFrame* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLIFrame_GetTypeInfo(DispHTMLIFrame* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDivPosition_QueryInterface(IHTMLDivPosition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDivPosition_AddRef(IHTMLDivPosition* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDivPosition_Release(IHTMLDivPosition* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDivPosition_GetTypeInfoCount(IHTMLDivPosition* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDivPosition_GetTypeInfo(IHTMLDivPosition* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDivPosition_put_align(IHTMLDivPosition* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFieldSetElement_QueryInterface(IHTMLFieldSetElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFieldSetElement_AddRef(IHTMLFieldSetElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFieldSetElement_Release(IHTMLFieldSetElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFieldSetElement_GetTypeInfoCount(IHTMLFieldSetElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFieldSetElement_GetTypeInfo(IHTMLFieldSetElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFieldSetElement_put_align(IHTMLFieldSetElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFieldSetElement2_QueryInterface(IHTMLFieldSetElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFieldSetElement2_AddRef(IHTMLFieldSetElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFieldSetElement2_Release(IHTMLFieldSetElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFieldSetElement2_GetTypeInfoCount(IHTMLFieldSetElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFieldSetElement2_GetTypeInfo(IHTMLFieldSetElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLegendElement_QueryInterface(IHTMLLegendElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLLegendElement_AddRef(IHTMLLegendElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLLegendElement_Release(IHTMLLegendElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLLegendElement_GetTypeInfoCount(IHTMLLegendElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLLegendElement_GetTypeInfo(IHTMLLegendElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLegendElement_put_align(IHTMLLegendElement* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLLegendElement2_QueryInterface(IHTMLLegendElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLLegendElement2_AddRef(IHTMLLegendElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLLegendElement2_Release(IHTMLLegendElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLLegendElement2_GetTypeInfoCount(IHTMLLegendElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLLegendElement2_GetTypeInfo(IHTMLLegendElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLDivPosition_QueryInterface(DispHTMLDivPosition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLDivPosition_AddRef(DispHTMLDivPosition* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLDivPosition_Release(DispHTMLDivPosition* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLDivPosition_GetTypeInfoCount(DispHTMLDivPosition* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLDivPosition_GetTypeInfo(DispHTMLDivPosition* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLFieldSetElement_QueryInterface(DispHTMLFieldSetElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLFieldSetElement_AddRef(DispHTMLFieldSetElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLFieldSetElement_Release(DispHTMLFieldSetElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLFieldSetElement_GetTypeInfoCount(DispHTMLFieldSetElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLFieldSetElement_GetTypeInfo(DispHTMLFieldSetElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLLegendElement_QueryInterface(DispHTMLLegendElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLLegendElement_AddRef(DispHTMLLegendElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLLegendElement_Release(DispHTMLLegendElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLLegendElement_GetTypeInfoCount(DispHTMLLegendElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLLegendElement_GetTypeInfo(DispHTMLLegendElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSpanFlow_QueryInterface(IHTMLSpanFlow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLSpanFlow_AddRef(IHTMLSpanFlow* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLSpanFlow_Release(IHTMLSpanFlow* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLSpanFlow_GetTypeInfoCount(IHTMLSpanFlow* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLSpanFlow_GetTypeInfo(IHTMLSpanFlow* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSpanFlow_put_align(IHTMLSpanFlow* This,BSTR v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLSpanFlow_QueryInterface(DispHTMLSpanFlow* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLSpanFlow_AddRef(DispHTMLSpanFlow* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLSpanFlow_Release(DispHTMLSpanFlow* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLSpanFlow_GetTypeInfoCount(DispHTMLSpanFlow* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLSpanFlow_GetTypeInfo(DispHTMLSpanFlow* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameSetElement_QueryInterface(IHTMLFrameSetElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFrameSetElement_AddRef(IHTMLFrameSetElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFrameSetElement_Release(IHTMLFrameSetElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_GetTypeInfoCount(IHTMLFrameSetElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_GetTypeInfo(IHTMLFrameSetElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameSetElement_put_rows(IHTMLFrameSetElement* This,BSTR v) {
    return This->lpVtbl->put_rows(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_get_rows(IHTMLFrameSetElement* This,BSTR *p) {
    return This->lpVtbl->get_rows(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_put_cols(IHTMLFrameSetElement* This,BSTR v) {
    return This->lpVtbl->put_cols(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_get_cols(IHTMLFrameSetElement* This,BSTR *p) {
    return This->lpVtbl->get_cols(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_put_border(IHTMLFrameSetElement* This,VARIANT v) {
    return This->lpVtbl->put_border(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_get_border(IHTMLFrameSetElement* This,VARIANT *p) {
    return This->lpVtbl->get_border(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_put_borderColor(IHTMLFrameSetElement* This,VARIANT v) {
    return This->lpVtbl->put_borderColor(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_get_borderColor(IHTMLFrameSetElement* This,VARIANT *p) {
    return This->lpVtbl->get_borderColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_put_frameBorder(IHTMLFrameSetElement* This,BSTR v) {
    return This->lpVtbl->put_frameBorder(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_get_frameBorder(IHTMLFrameSetElement* This,BSTR *p) {
    return This->lpVtbl->get_frameBorder(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_put_frameSpacing(IHTMLFrameSetElement* This,VARIANT v) {
    return This->lpVtbl->put_frameSpacing(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_get_frameSpacing(IHTMLFrameSetElement* This,VARIANT *p) {
    return This->lpVtbl->get_frameSpacing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_put_name(IHTMLFrameSetElement* This,BSTR v) {
    return This->lpVtbl->put_name(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_get_name(IHTMLFrameSetElement* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_put_onload(IHTMLFrameSetElement* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_get_onload(IHTMLFrameSetElement* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_put_onunload(IHTMLFrameSetElement* This,VARIANT v) {
    return This->lpVtbl->put_onunload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_get_onunload(IHTMLFrameSetElement* This,VARIANT *p) {
    return This->lpVtbl->get_onunload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement_put_onbeforeunload(IHTMLFrameSetElement* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeunload(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameSetElement2_QueryInterface(IHTMLFrameSetElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFrameSetElement2_AddRef(IHTMLFrameSetElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFrameSetElement2_Release(IHTMLFrameSetElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFrameSetElement2_GetTypeInfoCount(IHTMLFrameSetElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement2_GetTypeInfo(IHTMLFrameSetElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameSetElement2_put_onbeforeprint(IHTMLFrameSetElement2* This,VARIANT v) {
    return This->lpVtbl->put_onbeforeprint(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement2_get_onbeforeprint(IHTMLFrameSetElement2* This,VARIANT *p) {
    return This->lpVtbl->get_onbeforeprint(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement2_put_onafterprint(IHTMLFrameSetElement2* This,VARIANT v) {
    return This->lpVtbl->put_onafterprint(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameSetElement3_QueryInterface(IHTMLFrameSetElement3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFrameSetElement3_AddRef(IHTMLFrameSetElement3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFrameSetElement3_Release(IHTMLFrameSetElement3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFrameSetElement3_GetTypeInfoCount(IHTMLFrameSetElement3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement3_GetTypeInfo(IHTMLFrameSetElement3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFrameSetElement3_put_onhashchange(IHTMLFrameSetElement3* This,VARIANT v) {
    return This->lpVtbl->put_onhashchange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement3_get_onhashchange(IHTMLFrameSetElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onhashchange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement3_put_onmessage(IHTMLFrameSetElement3* This,VARIANT v) {
    return This->lpVtbl->put_onmessage(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement3_get_onmessage(IHTMLFrameSetElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onmessage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement3_put_onoffline(IHTMLFrameSetElement3* This,VARIANT v) {
    return This->lpVtbl->put_onoffline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement3_get_onoffline(IHTMLFrameSetElement3* This,VARIANT *p) {
    return This->lpVtbl->get_onoffline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement3_put_ononline(IHTMLFrameSetElement3* This,VARIANT v) {
    return This->lpVtbl->put_ononline(This,v);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement3_get_ononline(IHTMLFrameSetElement3* This,VARIANT *p) {
    return This->lpVtbl->get_ononline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFrameSetElement3_put_onstorage(IHTMLFrameSetElement3* This,VARIANT v) {
    return This->lpVtbl->put_onstorage(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLFrameSetSite_QueryInterface(DispHTMLFrameSetSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLFrameSetSite_AddRef(DispHTMLFrameSetSite* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLFrameSetSite_Release(DispHTMLFrameSetSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLFrameSetSite_GetTypeInfoCount(DispHTMLFrameSetSite* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLFrameSetSite_GetTypeInfo(DispHTMLFrameSetSite* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBGsound_QueryInterface(IHTMLBGsound* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLBGsound_AddRef(IHTMLBGsound* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLBGsound_Release(IHTMLBGsound* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLBGsound_GetTypeInfoCount(IHTMLBGsound* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLBGsound_GetTypeInfo(IHTMLBGsound* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLBGsound_put_src(IHTMLBGsound* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBGsound_get_src(IHTMLBGsound* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBGsound_put_loop(IHTMLBGsound* This,VARIANT v) {
    return This->lpVtbl->put_loop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBGsound_get_loop(IHTMLBGsound* This,VARIANT *p) {
    return This->lpVtbl->get_loop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBGsound_put_volume(IHTMLBGsound* This,VARIANT v) {
    return This->lpVtbl->put_volume(This,v);
}
static __WIDL_INLINE HRESULT IHTMLBGsound_get_volume(IHTMLBGsound* This,VARIANT *p) {
    return This->lpVtbl->get_volume(This,p);
}
static __WIDL_INLINE HRESULT IHTMLBGsound_put_balance(IHTMLBGsound* This,VARIANT v) {
    return This->lpVtbl->put_balance(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLBGsound_QueryInterface(DispHTMLBGsound* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLBGsound_AddRef(DispHTMLBGsound* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLBGsound_Release(DispHTMLBGsound* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLBGsound_GetTypeInfoCount(DispHTMLBGsound* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLBGsound_GetTypeInfo(DispHTMLBGsound* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFontNamesCollection_QueryInterface(IHTMLFontNamesCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFontNamesCollection_AddRef(IHTMLFontNamesCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFontNamesCollection_Release(IHTMLFontNamesCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFontNamesCollection_GetTypeInfoCount(IHTMLFontNamesCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFontNamesCollection_GetTypeInfo(IHTMLFontNamesCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFontNamesCollection_get_length(IHTMLFontNamesCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFontNamesCollection_get__newEnum(IHTMLFontNamesCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFontSizesCollection_QueryInterface(IHTMLFontSizesCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLFontSizesCollection_AddRef(IHTMLFontSizesCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLFontSizesCollection_Release(IHTMLFontSizesCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLFontSizesCollection_GetTypeInfoCount(IHTMLFontSizesCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLFontSizesCollection_GetTypeInfo(IHTMLFontSizesCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLFontSizesCollection_get_length(IHTMLFontSizesCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFontSizesCollection_get__newEnum(IHTMLFontSizesCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE HRESULT IHTMLFontSizesCollection_get_forFont(IHTMLFontSizesCollection* This,BSTR *p) {
    return This->lpVtbl->get_forFont(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOptionsHolder_QueryInterface(IHTMLOptionsHolder* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLOptionsHolder_AddRef(IHTMLOptionsHolder* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLOptionsHolder_Release(IHTMLOptionsHolder* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_GetTypeInfoCount(IHTMLOptionsHolder* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_GetTypeInfo(IHTMLOptionsHolder* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOptionsHolder_get_document(IHTMLOptionsHolder* This,IHTMLDocument2 **p) {
    return This->lpVtbl->get_document(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_get_fonts(IHTMLOptionsHolder* This,IHTMLFontNamesCollection **p) {
    return This->lpVtbl->get_fonts(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_put_execArg(IHTMLOptionsHolder* This,VARIANT v) {
    return This->lpVtbl->put_execArg(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_get_execArg(IHTMLOptionsHolder* This,VARIANT *p) {
    return This->lpVtbl->get_execArg(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_put_errorLine(IHTMLOptionsHolder* This,LONG v) {
    return This->lpVtbl->put_errorLine(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_get_errorLine(IHTMLOptionsHolder* This,LONG *p) {
    return This->lpVtbl->get_errorLine(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_put_errorCharacter(IHTMLOptionsHolder* This,LONG v) {
    return This->lpVtbl->put_errorCharacter(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_get_errorCharacter(IHTMLOptionsHolder* This,LONG *p) {
    return This->lpVtbl->get_errorCharacter(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_put_errorCode(IHTMLOptionsHolder* This,LONG v) {
    return This->lpVtbl->put_errorCode(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_get_errorCode(IHTMLOptionsHolder* This,LONG *p) {
    return This->lpVtbl->get_errorCode(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_put_errorMessage(IHTMLOptionsHolder* This,BSTR v) {
    return This->lpVtbl->put_errorMessage(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_get_errorMessage(IHTMLOptionsHolder* This,BSTR *p) {
    return This->lpVtbl->get_errorMessage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_put_errorDebug(IHTMLOptionsHolder* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_errorDebug(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_get_errorDebug(IHTMLOptionsHolder* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_errorDebug(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_get_unsecuredWindowOfDocument(IHTMLOptionsHolder* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_unsecuredWindowOfDocument(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_put_findText(IHTMLOptionsHolder* This,BSTR v) {
    return This->lpVtbl->put_findText(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_get_findText(IHTMLOptionsHolder* This,BSTR *p) {
    return This->lpVtbl->get_findText(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_put_anythingAfterFrameset(IHTMLOptionsHolder* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_anythingAfterFrameset(This,v);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_get_anythingAfterFrameset(IHTMLOptionsHolder* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_anythingAfterFrameset(This,p);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_sizes(IHTMLOptionsHolder* This,BSTR fontName,IHTMLFontSizesCollection **pSizesCollection) {
    return This->lpVtbl->sizes(This,fontName,pSizesCollection);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLOptionsHolder_choosecolordlg(IHTMLOptionsHolder* This,VARIANT initColor,LONG *rgbColor) {
    return This->lpVtbl->choosecolordlg(This,initColor,rgbColor);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_showSecurityInfo(IHTMLOptionsHolder* This) {
    return This->lpVtbl->showSecurityInfo(This);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_isApartmentModel(IHTMLOptionsHolder* This,IHTMLObjectElement *object,VARIANT_BOOL *fApartment) {
    return This->lpVtbl->isApartmentModel(This,object,fApartment);
}
static __WIDL_INLINE HRESULT IHTMLOptionsHolder_getCharset(IHTMLOptionsHolder* This,BSTR fontName,LONG *charset) {
    return This->lpVtbl->getCharset(This,fontName,charset);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLStyleElementEvents2_QueryInterface(HTMLStyleElementEvents2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLStyleElementEvents2_AddRef(HTMLStyleElementEvents2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLStyleElementEvents2_Release(HTMLStyleElementEvents2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLStyleElementEvents2_GetTypeInfoCount(HTMLStyleElementEvents2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLStyleElementEvents2_GetTypeInfo(HTMLStyleElementEvents2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLStyleElementEvents_QueryInterface(HTMLStyleElementEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLStyleElementEvents_AddRef(HTMLStyleElementEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLStyleElementEvents_Release(HTMLStyleElementEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLStyleElementEvents_GetTypeInfoCount(HTMLStyleElementEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLStyleElementEvents_GetTypeInfo(HTMLStyleElementEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleElement_QueryInterface(IHTMLStyleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleElement_AddRef(IHTMLStyleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleElement_Release(IHTMLStyleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleElement_GetTypeInfoCount(IHTMLStyleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleElement_GetTypeInfo(IHTMLStyleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleElement_put_type(IHTMLStyleElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyleElement_get_type(IHTMLStyleElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleElement_get_readyState(IHTMLStyleElement* This,BSTR *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleElement_put_onreadystatechange(IHTMLStyleElement* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyleElement_get_onreadystatechange(IHTMLStyleElement* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleElement_put_onload(IHTMLStyleElement* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyleElement_get_onload(IHTMLStyleElement* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleElement_put_onerror(IHTMLStyleElement* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyleElement_get_onerror(IHTMLStyleElement* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleElement_get_styleSheet(IHTMLStyleElement* This,IHTMLStyleSheet **p) {
    return This->lpVtbl->get_styleSheet(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleElement_put_disabled(IHTMLStyleElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_disabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLStyleElement_get_disabled(IHTMLStyleElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_disabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleElement_put_media(IHTMLStyleElement* This,BSTR v) {
    return This->lpVtbl->put_media(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleElement2_QueryInterface(IHTMLStyleElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleElement2_AddRef(IHTMLStyleElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleElement2_Release(IHTMLStyleElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleElement2_GetTypeInfoCount(IHTMLStyleElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleElement2_GetTypeInfo(IHTMLStyleElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLStyleElement_QueryInterface(DispHTMLStyleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLStyleElement_AddRef(DispHTMLStyleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLStyleElement_Release(DispHTMLStyleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLStyleElement_GetTypeInfoCount(DispHTMLStyleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLStyleElement_GetTypeInfo(DispHTMLStyleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleFontFace_QueryInterface(IHTMLStyleFontFace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleFontFace_AddRef(IHTMLStyleFontFace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleFontFace_Release(IHTMLStyleFontFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleFontFace_GetTypeInfoCount(IHTMLStyleFontFace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleFontFace_GetTypeInfo(IHTMLStyleFontFace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleFontFace_put_fontsrc(IHTMLStyleFontFace* This,BSTR v) {
    return This->lpVtbl->put_fontsrc(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleFontFace2_QueryInterface(IHTMLStyleFontFace2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleFontFace2_AddRef(IHTMLStyleFontFace2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleFontFace2_Release(IHTMLStyleFontFace2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleFontFace2_GetTypeInfoCount(IHTMLStyleFontFace2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleFontFace2_GetTypeInfo(IHTMLStyleFontFace2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLStyleFontFace_QueryInterface(DispHTMLStyleFontFace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLStyleFontFace_AddRef(DispHTMLStyleFontFace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLStyleFontFace_Release(DispHTMLStyleFontFace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLStyleFontFace_GetTypeInfoCount(DispHTMLStyleFontFace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLStyleFontFace_GetTypeInfo(DispHTMLStyleFontFace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLXDomainRequest_QueryInterface(IHTMLXDomainRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLXDomainRequest_AddRef(IHTMLXDomainRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLXDomainRequest_Release(IHTMLXDomainRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_GetTypeInfoCount(IHTMLXDomainRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_GetTypeInfo(IHTMLXDomainRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLXDomainRequest_get_responseText(IHTMLXDomainRequest* This,BSTR *p) {
    return This->lpVtbl->get_responseText(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_put_timeout(IHTMLXDomainRequest* This,LONG v) {
    return This->lpVtbl->put_timeout(This,v);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_get_timeout(IHTMLXDomainRequest* This,LONG *p) {
    return This->lpVtbl->get_timeout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_get_contentType(IHTMLXDomainRequest* This,BSTR *p) {
    return This->lpVtbl->get_contentType(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_put_onprogress(IHTMLXDomainRequest* This,VARIANT v) {
    return This->lpVtbl->put_onprogress(This,v);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_get_onprogress(IHTMLXDomainRequest* This,VARIANT *p) {
    return This->lpVtbl->get_onprogress(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_put_onerror(IHTMLXDomainRequest* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_get_onerror(IHTMLXDomainRequest* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_put_ontimeout(IHTMLXDomainRequest* This,VARIANT v) {
    return This->lpVtbl->put_ontimeout(This,v);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_get_ontimeout(IHTMLXDomainRequest* This,VARIANT *p) {
    return This->lpVtbl->get_ontimeout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_put_onload(IHTMLXDomainRequest* This,VARIANT v) {
    return This->lpVtbl->put_onload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_get_onload(IHTMLXDomainRequest* This,VARIANT *p) {
    return This->lpVtbl->get_onload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_abort(IHTMLXDomainRequest* This) {
    return This->lpVtbl->abort(This);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequest_open(IHTMLXDomainRequest* This,BSTR bstrMethod,BSTR bstrUrl) {
    return This->lpVtbl->open(This,bstrMethod,bstrUrl);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLXDomainRequestFactory_QueryInterface(IHTMLXDomainRequestFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLXDomainRequestFactory_AddRef(IHTMLXDomainRequestFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLXDomainRequestFactory_Release(IHTMLXDomainRequestFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLXDomainRequestFactory_GetTypeInfoCount(IHTMLXDomainRequestFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLXDomainRequestFactory_GetTypeInfo(IHTMLXDomainRequestFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispXDomainRequest_QueryInterface(DispXDomainRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispXDomainRequest_AddRef(DispXDomainRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispXDomainRequest_Release(DispXDomainRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispXDomainRequest_GetTypeInfoCount(DispXDomainRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispXDomainRequest_GetTypeInfo(DispXDomainRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStorage_QueryInterface(IHTMLStorage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStorage_AddRef(IHTMLStorage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStorage_Release(IHTMLStorage* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStorage_GetTypeInfoCount(IHTMLStorage* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStorage_GetTypeInfo(IHTMLStorage* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStorage_get_length(IHTMLStorage* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStorage_get_remainingSpace(IHTMLStorage* This,LONG *p) {
    return This->lpVtbl->get_remainingSpace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStorage_key(IHTMLStorage* This,LONG lIndex,BSTR *a) {
    return This->lpVtbl->key(This,lIndex,a);
}
static __WIDL_INLINE HRESULT IHTMLStorage_getItem(IHTMLStorage* This,BSTR bstrKey,VARIANT *a) {
    return This->lpVtbl->getItem(This,bstrKey,a);
}
static __WIDL_INLINE HRESULT IHTMLStorage_setItem(IHTMLStorage* This,BSTR bstrKey,BSTR bstrValue) {
    return This->lpVtbl->setItem(This,bstrKey,bstrValue);
}
static __WIDL_INLINE HRESULT IHTMLStorage_removeItem(IHTMLStorage* This,BSTR bstrKey) {
    return This->lpVtbl->removeItem(This,bstrKey);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStorage2_QueryInterface(IHTMLStorage2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStorage2_AddRef(IHTMLStorage2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStorage2_Release(IHTMLStorage2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStorage2_GetTypeInfoCount(IHTMLStorage2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStorage2_GetTypeInfo(IHTMLStorage2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLStorage_QueryInterface(DispHTMLStorage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLStorage_AddRef(DispHTMLStorage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLStorage_Release(DispHTMLStorage* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLStorage_GetTypeInfoCount(DispHTMLStorage* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLStorage_GetTypeInfo(DispHTMLStorage* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IEventTarget_QueryInterface(IEventTarget* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEventTarget_AddRef(IEventTarget* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEventTarget_Release(IEventTarget* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IEventTarget_GetTypeInfoCount(IEventTarget* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IEventTarget_GetTypeInfo(IEventTarget* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IEventTarget_addEventListener(IEventTarget* This,BSTR type,IDispatch *listener,VARIANT_BOOL useCapture) {
    return This->lpVtbl->addEventListener(This,type,listener,useCapture);
}
static __WIDL_INLINE HRESULT IEventTarget_removeEventListener(IEventTarget* This,BSTR type,IDispatch *listener,VARIANT_BOOL useCapture) {
    return This->lpVtbl->removeEventListener(This,type,listener,useCapture);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMEvent_QueryInterface(IDOMEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMEvent_AddRef(IDOMEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMEvent_Release(IDOMEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMEvent_GetTypeInfoCount(IDOMEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMEvent_GetTypeInfo(IDOMEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMEvent_get_bubbles(IDOMEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_bubbles(This,p);
}
static __WIDL_INLINE HRESULT IDOMEvent_get_cancelable(IDOMEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_cancelable(This,p);
}
static __WIDL_INLINE HRESULT IDOMEvent_get_currentTarget(IDOMEvent* This,IEventTarget **p) {
    return This->lpVtbl->get_currentTarget(This,p);
}
static __WIDL_INLINE HRESULT IDOMEvent_get_defaultPrevented(IDOMEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_defaultPrevented(This,p);
}
static __WIDL_INLINE HRESULT IDOMEvent_get_eventPhase(IDOMEvent* This,USHORT *p) {
    return This->lpVtbl->get_eventPhase(This,p);
}
static __WIDL_INLINE HRESULT IDOMEvent_get_target(IDOMEvent* This,IEventTarget **p) {
    return This->lpVtbl->get_target(This,p);
}
static __WIDL_INLINE HRESULT IDOMEvent_get_timeStamp(IDOMEvent* This,ULONGLONG *p) {
    return This->lpVtbl->get_timeStamp(This,p);
}
static __WIDL_INLINE HRESULT IDOMEvent_get_type(IDOMEvent* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IDOMEvent_initEvent(IDOMEvent* This,BSTR eventType,VARIANT_BOOL canBubble,VARIANT_BOOL cancelable) {
    return This->lpVtbl->initEvent(This,eventType,canBubble,cancelable);
}
static __WIDL_INLINE HRESULT IDOMEvent_preventDefault(IDOMEvent* This) {
    return This->lpVtbl->preventDefault(This);
}
static __WIDL_INLINE HRESULT IDOMEvent_stopPropagation(IDOMEvent* This) {
    return This->lpVtbl->stopPropagation(This);
}
static __WIDL_INLINE HRESULT IDOMEvent_stopImmediatePropagation(IDOMEvent* This) {
    return This->lpVtbl->stopImmediatePropagation(This);
}
static __WIDL_INLINE HRESULT IDOMEvent_get_isTrusted(IDOMEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_isTrusted(This,p);
}
static __WIDL_INLINE HRESULT IDOMEvent_put_cancelBubble(IDOMEvent* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_cancelBubble(This,v);
}
static __WIDL_INLINE HRESULT IDOMEvent_get_cancelBubble(IDOMEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_cancelBubble(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMEvent_QueryInterface(DispDOMEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMEvent_AddRef(DispDOMEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMEvent_Release(DispDOMEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMEvent_GetTypeInfoCount(DispDOMEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMEvent_GetTypeInfo(DispDOMEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMUIEvent_QueryInterface(IDOMUIEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMUIEvent_AddRef(IDOMUIEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMUIEvent_Release(IDOMUIEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMUIEvent_GetTypeInfoCount(IDOMUIEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMUIEvent_GetTypeInfo(IDOMUIEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMUIEvent_get_view(IDOMUIEvent* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_view(This,p);
}
static __WIDL_INLINE HRESULT IDOMUIEvent_get_detail(IDOMUIEvent* This,LONG *p) {
    return This->lpVtbl->get_detail(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMUIEvent_QueryInterface(DispDOMUIEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMUIEvent_AddRef(DispDOMUIEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMUIEvent_Release(DispDOMUIEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMUIEvent_GetTypeInfoCount(DispDOMUIEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMUIEvent_GetTypeInfo(DispDOMUIEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMouseEvent_QueryInterface(IDOMMouseEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMMouseEvent_AddRef(IDOMMouseEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMMouseEvent_Release(IDOMMouseEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMMouseEvent_GetTypeInfoCount(IDOMMouseEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_GetTypeInfo(IDOMMouseEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMouseEvent_get_screenX(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_screenX(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_screenY(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_screenY(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_clientX(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_clientX(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_clientY(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_clientY(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_ctrlKey(IDOMMouseEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_ctrlKey(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_shiftKey(IDOMMouseEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_shiftKey(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_altKey(IDOMMouseEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_altKey(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_metaKey(IDOMMouseEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_metaKey(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_button(IDOMMouseEvent* This,USHORT *p) {
    return This->lpVtbl->get_button(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_relatedTarget(IDOMMouseEvent* This,IEventTarget **p) {
    return This->lpVtbl->get_relatedTarget(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMouseEvent_getModifierState(IDOMMouseEvent* This,BSTR keyArg,VARIANT_BOOL *activated) {
    return This->lpVtbl->getModifierState(This,keyArg,activated);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_buttons(IDOMMouseEvent* This,USHORT *p) {
    return This->lpVtbl->get_buttons(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_fromElement(IDOMMouseEvent* This,IHTMLElement **p) {
    return This->lpVtbl->get_fromElement(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_toElement(IDOMMouseEvent* This,IHTMLElement **p) {
    return This->lpVtbl->get_toElement(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_x(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_y(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_offsetX(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_offsetX(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_offsetY(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_offsetY(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_pageX(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_pageX(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_pageY(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_pageY(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_layerX(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_layerX(This,p);
}
static __WIDL_INLINE HRESULT IDOMMouseEvent_get_layerY(IDOMMouseEvent* This,LONG *p) {
    return This->lpVtbl->get_layerY(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMMouseEvent_QueryInterface(DispDOMMouseEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMMouseEvent_AddRef(DispDOMMouseEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMMouseEvent_Release(DispDOMMouseEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMMouseEvent_GetTypeInfoCount(DispDOMMouseEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMMouseEvent_GetTypeInfo(DispDOMMouseEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMDragEvent_QueryInterface(IDOMDragEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMDragEvent_AddRef(IDOMDragEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMDragEvent_Release(IDOMDragEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMDragEvent_GetTypeInfoCount(IDOMDragEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMDragEvent_GetTypeInfo(IDOMDragEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMDragEvent_get_dataTransfer(IDOMDragEvent* This,IHTMLDataTransfer **p) {
    return This->lpVtbl->get_dataTransfer(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMDragEvent_QueryInterface(DispDOMDragEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMDragEvent_AddRef(DispDOMDragEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMDragEvent_Release(DispDOMDragEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMDragEvent_GetTypeInfoCount(DispDOMDragEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMDragEvent_GetTypeInfo(DispDOMDragEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMouseWheelEvent_QueryInterface(IDOMMouseWheelEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMMouseWheelEvent_AddRef(IDOMMouseWheelEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMMouseWheelEvent_Release(IDOMMouseWheelEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMMouseWheelEvent_GetTypeInfoCount(IDOMMouseWheelEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMMouseWheelEvent_GetTypeInfo(IDOMMouseWheelEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMouseWheelEvent_get_wheelDelta(IDOMMouseWheelEvent* This,LONG *p) {
    return This->lpVtbl->get_wheelDelta(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMMouseWheelEvent_QueryInterface(DispDOMMouseWheelEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMMouseWheelEvent_AddRef(DispDOMMouseWheelEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMMouseWheelEvent_Release(DispDOMMouseWheelEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMMouseWheelEvent_GetTypeInfoCount(DispDOMMouseWheelEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMMouseWheelEvent_GetTypeInfo(DispDOMMouseWheelEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMWheelEvent_QueryInterface(IDOMWheelEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMWheelEvent_AddRef(IDOMWheelEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMWheelEvent_Release(IDOMWheelEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMWheelEvent_GetTypeInfoCount(IDOMWheelEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMWheelEvent_GetTypeInfo(IDOMWheelEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMWheelEvent_get_deltaX(IDOMWheelEvent* This,LONG *p) {
    return This->lpVtbl->get_deltaX(This,p);
}
static __WIDL_INLINE HRESULT IDOMWheelEvent_get_deltaY(IDOMWheelEvent* This,LONG *p) {
    return This->lpVtbl->get_deltaY(This,p);
}
static __WIDL_INLINE HRESULT IDOMWheelEvent_get_deltaZ(IDOMWheelEvent* This,LONG *p) {
    return This->lpVtbl->get_deltaZ(This,p);
}
static __WIDL_INLINE HRESULT IDOMWheelEvent_get_deltaMode(IDOMWheelEvent* This,ULONG *p) {
    return This->lpVtbl->get_deltaMode(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMWheelEvent_QueryInterface(DispDOMWheelEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMWheelEvent_AddRef(DispDOMWheelEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMWheelEvent_Release(DispDOMWheelEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMWheelEvent_GetTypeInfoCount(DispDOMWheelEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMWheelEvent_GetTypeInfo(DispDOMWheelEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMTextEvent_QueryInterface(IDOMTextEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMTextEvent_AddRef(IDOMTextEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMTextEvent_Release(IDOMTextEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMTextEvent_GetTypeInfoCount(IDOMTextEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMTextEvent_GetTypeInfo(IDOMTextEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMTextEvent_get_data(IDOMTextEvent* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static __WIDL_INLINE HRESULT IDOMTextEvent_get_inputMethod(IDOMTextEvent* This,ULONG *p) {
    return This->lpVtbl->get_inputMethod(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMTextEvent_QueryInterface(DispDOMTextEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMTextEvent_AddRef(DispDOMTextEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMTextEvent_Release(DispDOMTextEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMTextEvent_GetTypeInfoCount(DispDOMTextEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMTextEvent_GetTypeInfo(DispDOMTextEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMKeyboardEvent_QueryInterface(IDOMKeyboardEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMKeyboardEvent_AddRef(IDOMKeyboardEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMKeyboardEvent_Release(IDOMKeyboardEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMKeyboardEvent_GetTypeInfoCount(IDOMKeyboardEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMKeyboardEvent_GetTypeInfo(IDOMKeyboardEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMKeyboardEvent_get_key(IDOMKeyboardEvent* This,BSTR *p) {
    return This->lpVtbl->get_key(This,p);
}
static __WIDL_INLINE HRESULT IDOMKeyboardEvent_get_location(IDOMKeyboardEvent* This,ULONG *p) {
    return This->lpVtbl->get_location(This,p);
}
static __WIDL_INLINE HRESULT IDOMKeyboardEvent_get_ctrlKey(IDOMKeyboardEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_ctrlKey(This,p);
}
static __WIDL_INLINE HRESULT IDOMKeyboardEvent_get_shiftKey(IDOMKeyboardEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_shiftKey(This,p);
}
static __WIDL_INLINE HRESULT IDOMKeyboardEvent_get_altKey(IDOMKeyboardEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_altKey(This,p);
}
static __WIDL_INLINE HRESULT IDOMKeyboardEvent_get_metaKey(IDOMKeyboardEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_metaKey(This,p);
}
static __WIDL_INLINE HRESULT IDOMKeyboardEvent_get_repeat(IDOMKeyboardEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_repeat(This,p);
}
static __WIDL_INLINE HRESULT IDOMKeyboardEvent_getModifierState(IDOMKeyboardEvent* This,BSTR keyArg,VARIANT_BOOL *state) {
    return This->lpVtbl->getModifierState(This,keyArg,state);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMKeyboardEvent_get_keyCode(IDOMKeyboardEvent* This,LONG *p) {
    return This->lpVtbl->get_keyCode(This,p);
}
static __WIDL_INLINE HRESULT IDOMKeyboardEvent_get_charCode(IDOMKeyboardEvent* This,LONG *p) {
    return This->lpVtbl->get_charCode(This,p);
}
static __WIDL_INLINE HRESULT IDOMKeyboardEvent_get_which(IDOMKeyboardEvent* This,LONG *p) {
    return This->lpVtbl->get_which(This,p);
}
static __WIDL_INLINE HRESULT IDOMKeyboardEvent_get_ie9_char(IDOMKeyboardEvent* This,VARIANT *p) {
    return This->lpVtbl->get_ie9_char(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMKeyboardEvent_QueryInterface(DispDOMKeyboardEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMKeyboardEvent_AddRef(DispDOMKeyboardEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMKeyboardEvent_Release(DispDOMKeyboardEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMKeyboardEvent_GetTypeInfoCount(DispDOMKeyboardEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMKeyboardEvent_GetTypeInfo(DispDOMKeyboardEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMCompositionEvent_QueryInterface(IDOMCompositionEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMCompositionEvent_AddRef(IDOMCompositionEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMCompositionEvent_Release(IDOMCompositionEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMCompositionEvent_GetTypeInfoCount(IDOMCompositionEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMCompositionEvent_GetTypeInfo(IDOMCompositionEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMCompositionEvent_get_data(IDOMCompositionEvent* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMCompositionEvent_QueryInterface(DispDOMCompositionEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMCompositionEvent_AddRef(DispDOMCompositionEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMCompositionEvent_Release(DispDOMCompositionEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMCompositionEvent_GetTypeInfoCount(DispDOMCompositionEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMCompositionEvent_GetTypeInfo(DispDOMCompositionEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMutationEvent_QueryInterface(IDOMMutationEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMMutationEvent_AddRef(IDOMMutationEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMMutationEvent_Release(IDOMMutationEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMMutationEvent_GetTypeInfoCount(IDOMMutationEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMMutationEvent_GetTypeInfo(IDOMMutationEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMutationEvent_get_relatedNode(IDOMMutationEvent* This,IDispatch **p) {
    return This->lpVtbl->get_relatedNode(This,p);
}
static __WIDL_INLINE HRESULT IDOMMutationEvent_get_prevValue(IDOMMutationEvent* This,BSTR *p) {
    return This->lpVtbl->get_prevValue(This,p);
}
static __WIDL_INLINE HRESULT IDOMMutationEvent_get_newValue(IDOMMutationEvent* This,BSTR *p) {
    return This->lpVtbl->get_newValue(This,p);
}
static __WIDL_INLINE HRESULT IDOMMutationEvent_get_attrName(IDOMMutationEvent* This,BSTR *p) {
    return This->lpVtbl->get_attrName(This,p);
}
static __WIDL_INLINE HRESULT IDOMMutationEvent_get_attrChange(IDOMMutationEvent* This,USHORT *p) {
    return This->lpVtbl->get_attrChange(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMMutationEvent_QueryInterface(DispDOMMutationEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMMutationEvent_AddRef(DispDOMMutationEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMMutationEvent_Release(DispDOMMutationEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMMutationEvent_GetTypeInfoCount(DispDOMMutationEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMMutationEvent_GetTypeInfo(DispDOMMutationEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMBeforeUnloadEvent_QueryInterface(IDOMBeforeUnloadEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMBeforeUnloadEvent_AddRef(IDOMBeforeUnloadEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMBeforeUnloadEvent_Release(IDOMBeforeUnloadEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMBeforeUnloadEvent_GetTypeInfoCount(IDOMBeforeUnloadEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMBeforeUnloadEvent_GetTypeInfo(IDOMBeforeUnloadEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMBeforeUnloadEvent_put_returnValue(IDOMBeforeUnloadEvent* This,VARIANT v) {
    return This->lpVtbl->put_returnValue(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMBeforeUnloadEvent_QueryInterface(DispDOMBeforeUnloadEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMBeforeUnloadEvent_AddRef(DispDOMBeforeUnloadEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMBeforeUnloadEvent_Release(DispDOMBeforeUnloadEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMBeforeUnloadEvent_GetTypeInfoCount(DispDOMBeforeUnloadEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMBeforeUnloadEvent_GetTypeInfo(DispDOMBeforeUnloadEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMFocusEvent_QueryInterface(IDOMFocusEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMFocusEvent_AddRef(IDOMFocusEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMFocusEvent_Release(IDOMFocusEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMFocusEvent_GetTypeInfoCount(IDOMFocusEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMFocusEvent_GetTypeInfo(IDOMFocusEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMFocusEvent_get_relatedTarget(IDOMFocusEvent* This,IEventTarget **p) {
    return This->lpVtbl->get_relatedTarget(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMFocusEvent_QueryInterface(DispDOMFocusEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMFocusEvent_AddRef(DispDOMFocusEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMFocusEvent_Release(DispDOMFocusEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMFocusEvent_GetTypeInfoCount(DispDOMFocusEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMFocusEvent_GetTypeInfo(DispDOMFocusEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMCustomEvent_QueryInterface(IDOMCustomEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMCustomEvent_AddRef(IDOMCustomEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMCustomEvent_Release(IDOMCustomEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMCustomEvent_GetTypeInfoCount(IDOMCustomEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMCustomEvent_GetTypeInfo(IDOMCustomEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMCustomEvent_get_detail(IDOMCustomEvent* This,VARIANT *p) {
    return This->lpVtbl->get_detail(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMCustomEvent_QueryInterface(DispDOMCustomEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMCustomEvent_AddRef(DispDOMCustomEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMCustomEvent_Release(DispDOMCustomEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMCustomEvent_GetTypeInfoCount(DispDOMCustomEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMCustomEvent_GetTypeInfo(DispDOMCustomEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICanvasGradient_QueryInterface(ICanvasGradient* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICanvasGradient_AddRef(ICanvasGradient* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICanvasGradient_Release(ICanvasGradient* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ICanvasGradient_GetTypeInfoCount(ICanvasGradient* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ICanvasGradient_GetTypeInfo(ICanvasGradient* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICanvasPattern_QueryInterface(ICanvasPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICanvasPattern_AddRef(ICanvasPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICanvasPattern_Release(ICanvasPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ICanvasPattern_GetTypeInfoCount(ICanvasPattern* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ICanvasPattern_GetTypeInfo(ICanvasPattern* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICanvasTextMetrics_QueryInterface(ICanvasTextMetrics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICanvasTextMetrics_AddRef(ICanvasTextMetrics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICanvasTextMetrics_Release(ICanvasTextMetrics* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ICanvasTextMetrics_GetTypeInfoCount(ICanvasTextMetrics* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ICanvasTextMetrics_GetTypeInfo(ICanvasTextMetrics* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICanvasImageData_QueryInterface(ICanvasImageData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICanvasImageData_AddRef(ICanvasImageData* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICanvasImageData_Release(ICanvasImageData* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ICanvasImageData_GetTypeInfoCount(ICanvasImageData* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ICanvasImageData_GetTypeInfo(ICanvasImageData* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICanvasImageData_get_width(ICanvasImageData* This,ULONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT ICanvasImageData_get_height(ICanvasImageData* This,ULONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICanvasPixelArray_QueryInterface(ICanvasPixelArray* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICanvasPixelArray_AddRef(ICanvasPixelArray* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICanvasPixelArray_Release(ICanvasPixelArray* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ICanvasPixelArray_GetTypeInfoCount(ICanvasPixelArray* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ICanvasPixelArray_GetTypeInfo(ICanvasPixelArray* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICanvasRenderingContext2D_QueryInterface(ICanvasRenderingContext2D* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICanvasRenderingContext2D_AddRef(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICanvasRenderingContext2D_Release(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_GetTypeInfoCount(ICanvasRenderingContext2D* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_GetTypeInfo(ICanvasRenderingContext2D* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_canvas(ICanvasRenderingContext2D* This,IHTMLCanvasElement **p) {
    return This->lpVtbl->get_canvas(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_restore(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->restore(This);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_save(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->save(This);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_rotate(ICanvasRenderingContext2D* This,float angle) {
    return This->lpVtbl->rotate(This,angle);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_scale(ICanvasRenderingContext2D* This,float x,float y) {
    return This->lpVtbl->scale(This,x,y);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICanvasRenderingContext2D_translate(ICanvasRenderingContext2D* This,float x,float y) {
    return This->lpVtbl->translate(This,x,y);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_globalAlpha(ICanvasRenderingContext2D* This,float v) {
    return This->lpVtbl->put_globalAlpha(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_globalAlpha(ICanvasRenderingContext2D* This,float *p) {
    return This->lpVtbl->get_globalAlpha(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_globalCompositeOperation(ICanvasRenderingContext2D* This,BSTR v) {
    return This->lpVtbl->put_globalCompositeOperation(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_globalCompositeOperation(ICanvasRenderingContext2D* This,BSTR *p) {
    return This->lpVtbl->get_globalCompositeOperation(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_fillStyle(ICanvasRenderingContext2D* This,VARIANT v) {
    return This->lpVtbl->put_fillStyle(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_fillStyle(ICanvasRenderingContext2D* This,VARIANT *p) {
    return This->lpVtbl->get_fillStyle(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_strokeStyle(ICanvasRenderingContext2D* This,VARIANT v) {
    return This->lpVtbl->put_strokeStyle(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_strokeStyle(ICanvasRenderingContext2D* This,VARIANT *p) {
    return This->lpVtbl->get_strokeStyle(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICanvasRenderingContext2D_createPattern(ICanvasRenderingContext2D* This,IDispatch *image,VARIANT repetition,ICanvasPattern **ppCanvasPattern) {
    return This->lpVtbl->createPattern(This,image,repetition,ppCanvasPattern);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_lineCap(ICanvasRenderingContext2D* This,BSTR v) {
    return This->lpVtbl->put_lineCap(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_lineCap(ICanvasRenderingContext2D* This,BSTR *p) {
    return This->lpVtbl->get_lineCap(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_lineJoin(ICanvasRenderingContext2D* This,BSTR v) {
    return This->lpVtbl->put_lineJoin(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_lineJoin(ICanvasRenderingContext2D* This,BSTR *p) {
    return This->lpVtbl->get_lineJoin(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_lineWidth(ICanvasRenderingContext2D* This,float v) {
    return This->lpVtbl->put_lineWidth(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_lineWidth(ICanvasRenderingContext2D* This,float *p) {
    return This->lpVtbl->get_lineWidth(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_miterLimit(ICanvasRenderingContext2D* This,float v) {
    return This->lpVtbl->put_miterLimit(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_miterLimit(ICanvasRenderingContext2D* This,float *p) {
    return This->lpVtbl->get_miterLimit(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_shadowBlur(ICanvasRenderingContext2D* This,float v) {
    return This->lpVtbl->put_shadowBlur(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_shadowBlur(ICanvasRenderingContext2D* This,float *p) {
    return This->lpVtbl->get_shadowBlur(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_shadowColor(ICanvasRenderingContext2D* This,BSTR v) {
    return This->lpVtbl->put_shadowColor(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_shadowColor(ICanvasRenderingContext2D* This,BSTR *p) {
    return This->lpVtbl->get_shadowColor(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_shadowOffsetX(ICanvasRenderingContext2D* This,float v) {
    return This->lpVtbl->put_shadowOffsetX(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_shadowOffsetX(ICanvasRenderingContext2D* This,float *p) {
    return This->lpVtbl->get_shadowOffsetX(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_shadowOffsetY(ICanvasRenderingContext2D* This,float v) {
    return This->lpVtbl->put_shadowOffsetY(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_shadowOffsetY(ICanvasRenderingContext2D* This,float *p) {
    return This->lpVtbl->get_shadowOffsetY(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_clearRect(ICanvasRenderingContext2D* This,float x,float y,float w,float h) {
    return This->lpVtbl->clearRect(This,x,y,w,h);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_fillRect(ICanvasRenderingContext2D* This,float x,float y,float w,float h) {
    return This->lpVtbl->fillRect(This,x,y,w,h);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_strokeRect(ICanvasRenderingContext2D* This,float x,float y,float w,float h) {
    return This->lpVtbl->strokeRect(This,x,y,w,h);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICanvasRenderingContext2D_beginPath(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->beginPath(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICanvasRenderingContext2D_clip(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->clip(This);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_closePath(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->closePath(This);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_fill(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->fill(This);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_lineTo(ICanvasRenderingContext2D* This,float x,float y) {
    return This->lpVtbl->lineTo(This,x,y);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_moveTo(ICanvasRenderingContext2D* This,float x,float y) {
    return This->lpVtbl->moveTo(This,x,y);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_quadraticCurveTo(ICanvasRenderingContext2D* This,float cpx,float cpy,float x,float y) {
    return This->lpVtbl->quadraticCurveTo(This,cpx,cpy,x,y);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_rect(ICanvasRenderingContext2D* This,float x,float y,float w,float h) {
    return This->lpVtbl->rect(This,x,y,w,h);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_stroke(ICanvasRenderingContext2D* This) {
    return This->lpVtbl->stroke(This);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_isPointInPath(ICanvasRenderingContext2D* This,float x,float y,VARIANT_BOOL *pResult) {
    return This->lpVtbl->isPointInPath(This,x,y,pResult);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_font(ICanvasRenderingContext2D* This,BSTR v) {
    return This->lpVtbl->put_font(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_font(ICanvasRenderingContext2D* This,BSTR *p) {
    return This->lpVtbl->get_font(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_textAlign(ICanvasRenderingContext2D* This,BSTR v) {
    return This->lpVtbl->put_textAlign(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_textAlign(ICanvasRenderingContext2D* This,BSTR *p) {
    return This->lpVtbl->get_textAlign(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_put_textBaseline(ICanvasRenderingContext2D* This,BSTR v) {
    return This->lpVtbl->put_textBaseline(This,v);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_get_textBaseline(ICanvasRenderingContext2D* This,BSTR *p) {
    return This->lpVtbl->get_textBaseline(This,p);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_fillText(ICanvasRenderingContext2D* This,BSTR text,float x,float y,VARIANT maxWidth) {
    return This->lpVtbl->fillText(This,text,x,y,maxWidth);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_measureText(ICanvasRenderingContext2D* This,BSTR text,ICanvasTextMetrics **ppCanvasTextMetrics) {
    return This->lpVtbl->measureText(This,text,ppCanvasTextMetrics);
}
static __WIDL_INLINE HRESULT ICanvasRenderingContext2D_strokeText(ICanvasRenderingContext2D* This,BSTR text,float x,float y,VARIANT maxWidth) {
    return This->lpVtbl->strokeText(This,text,x,y,maxWidth);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICanvasRenderingContext2D_createImageData(ICanvasRenderingContext2D* This,VARIANT a1,VARIANT a2,ICanvasImageData **ppCanvasImageData) {
    return This->lpVtbl->createImageData(This,a1,a2,ppCanvasImageData);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCanvasElement_QueryInterface(IHTMLCanvasElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCanvasElement_AddRef(IHTMLCanvasElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCanvasElement_Release(IHTMLCanvasElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLCanvasElement_GetTypeInfoCount(IHTMLCanvasElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLCanvasElement_GetTypeInfo(IHTMLCanvasElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCanvasElement_put_width(IHTMLCanvasElement* This,LONG v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCanvasElement_get_width(IHTMLCanvasElement* This,LONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCanvasElement_put_height(IHTMLCanvasElement* This,LONG v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE HRESULT IHTMLCanvasElement_get_height(IHTMLCanvasElement* This,LONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLCanvasElement_getContext(IHTMLCanvasElement* This,BSTR contextId,ICanvasRenderingContext2D **ppContext) {
    return This->lpVtbl->getContext(This,contextId,ppContext);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispCanvasGradient_QueryInterface(DispCanvasGradient* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispCanvasGradient_AddRef(DispCanvasGradient* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispCanvasGradient_Release(DispCanvasGradient* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispCanvasGradient_GetTypeInfoCount(DispCanvasGradient* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispCanvasGradient_GetTypeInfo(DispCanvasGradient* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispCanvasPattern_QueryInterface(DispCanvasPattern* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispCanvasPattern_AddRef(DispCanvasPattern* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispCanvasPattern_Release(DispCanvasPattern* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispCanvasPattern_GetTypeInfoCount(DispCanvasPattern* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispCanvasPattern_GetTypeInfo(DispCanvasPattern* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispCanvasTextMetrics_QueryInterface(DispCanvasTextMetrics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispCanvasTextMetrics_AddRef(DispCanvasTextMetrics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispCanvasTextMetrics_Release(DispCanvasTextMetrics* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispCanvasTextMetrics_GetTypeInfoCount(DispCanvasTextMetrics* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispCanvasTextMetrics_GetTypeInfo(DispCanvasTextMetrics* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispCanvasImageData_QueryInterface(DispCanvasImageData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispCanvasImageData_AddRef(DispCanvasImageData* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispCanvasImageData_Release(DispCanvasImageData* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispCanvasImageData_GetTypeInfoCount(DispCanvasImageData* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispCanvasImageData_GetTypeInfo(DispCanvasImageData* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispCanvasRenderingContext2D_QueryInterface(DispCanvasRenderingContext2D* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispCanvasRenderingContext2D_AddRef(DispCanvasRenderingContext2D* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispCanvasRenderingContext2D_Release(DispCanvasRenderingContext2D* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispCanvasRenderingContext2D_GetTypeInfoCount(DispCanvasRenderingContext2D* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispCanvasRenderingContext2D_GetTypeInfo(DispCanvasRenderingContext2D* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLCanvasElement_QueryInterface(DispHTMLCanvasElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLCanvasElement_AddRef(DispHTMLCanvasElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLCanvasElement_Release(DispHTMLCanvasElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLCanvasElement_GetTypeInfoCount(DispHTMLCanvasElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLCanvasElement_GetTypeInfo(DispHTMLCanvasElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMProgressEvent_QueryInterface(IDOMProgressEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMProgressEvent_AddRef(IDOMProgressEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMProgressEvent_Release(IDOMProgressEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMProgressEvent_GetTypeInfoCount(IDOMProgressEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMProgressEvent_GetTypeInfo(IDOMProgressEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMProgressEvent_get_lengthComputable(IDOMProgressEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_lengthComputable(This,p);
}
static __WIDL_INLINE HRESULT IDOMProgressEvent_get_loaded(IDOMProgressEvent* This,ULONGLONG *p) {
    return This->lpVtbl->get_loaded(This,p);
}
static __WIDL_INLINE HRESULT IDOMProgressEvent_get_total(IDOMProgressEvent* This,ULONGLONG *p) {
    return This->lpVtbl->get_total(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMProgressEvent_QueryInterface(DispDOMProgressEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMProgressEvent_AddRef(DispDOMProgressEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMProgressEvent_Release(DispDOMProgressEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMProgressEvent_GetTypeInfoCount(DispDOMProgressEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMProgressEvent_GetTypeInfo(DispDOMProgressEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMessageEvent_QueryInterface(IDOMMessageEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMMessageEvent_AddRef(IDOMMessageEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMMessageEvent_Release(IDOMMessageEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMMessageEvent_GetTypeInfoCount(IDOMMessageEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMMessageEvent_GetTypeInfo(IDOMMessageEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMessageEvent_get_data(IDOMMessageEvent* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static __WIDL_INLINE HRESULT IDOMMessageEvent_get_origin(IDOMMessageEvent* This,BSTR *p) {
    return This->lpVtbl->get_origin(This,p);
}
static __WIDL_INLINE HRESULT IDOMMessageEvent_get_source(IDOMMessageEvent* This,IHTMLWindow2 **p) {
    return This->lpVtbl->get_source(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMMessageEvent_QueryInterface(DispDOMMessageEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMMessageEvent_AddRef(DispDOMMessageEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMMessageEvent_Release(DispDOMMessageEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMMessageEvent_GetTypeInfoCount(DispDOMMessageEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMMessageEvent_GetTypeInfo(DispDOMMessageEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMSiteModeEvent_QueryInterface(IDOMSiteModeEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMSiteModeEvent_AddRef(IDOMSiteModeEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMSiteModeEvent_Release(IDOMSiteModeEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMSiteModeEvent_GetTypeInfoCount(IDOMSiteModeEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMSiteModeEvent_GetTypeInfo(IDOMSiteModeEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMSiteModeEvent_get_buttonID(IDOMSiteModeEvent* This,LONG *p) {
    return This->lpVtbl->get_buttonID(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMSiteModeEvent_QueryInterface(DispDOMSiteModeEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMSiteModeEvent_AddRef(DispDOMSiteModeEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMSiteModeEvent_Release(DispDOMSiteModeEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMSiteModeEvent_GetTypeInfoCount(DispDOMSiteModeEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMSiteModeEvent_GetTypeInfo(DispDOMSiteModeEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMStorageEvent_QueryInterface(IDOMStorageEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMStorageEvent_AddRef(IDOMStorageEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMStorageEvent_Release(IDOMStorageEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMStorageEvent_GetTypeInfoCount(IDOMStorageEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMStorageEvent_GetTypeInfo(IDOMStorageEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMStorageEvent_get_key(IDOMStorageEvent* This,BSTR *p) {
    return This->lpVtbl->get_key(This,p);
}
static __WIDL_INLINE HRESULT IDOMStorageEvent_get_oldValue(IDOMStorageEvent* This,BSTR *p) {
    return This->lpVtbl->get_oldValue(This,p);
}
static __WIDL_INLINE HRESULT IDOMStorageEvent_get_newValue(IDOMStorageEvent* This,BSTR *p) {
    return This->lpVtbl->get_newValue(This,p);
}
static __WIDL_INLINE HRESULT IDOMStorageEvent_get_url(IDOMStorageEvent* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static __WIDL_INLINE HRESULT IDOMStorageEvent_get_storageArea(IDOMStorageEvent* This,IHTMLStorage **p) {
    return This->lpVtbl->get_storageArea(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMStorageEvent_QueryInterface(DispDOMStorageEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMStorageEvent_AddRef(DispDOMStorageEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMStorageEvent_Release(DispDOMStorageEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMStorageEvent_GetTypeInfoCount(DispDOMStorageEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMStorageEvent_GetTypeInfo(DispDOMStorageEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IXMLHttpRequestEventTarget_QueryInterface(IXMLHttpRequestEventTarget* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLHttpRequestEventTarget_AddRef(IXMLHttpRequestEventTarget* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLHttpRequestEventTarget_Release(IXMLHttpRequestEventTarget* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLHttpRequestEventTarget_GetTypeInfoCount(IXMLHttpRequestEventTarget* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLHttpRequestEventTarget_GetTypeInfo(IXMLHttpRequestEventTarget* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispXMLHttpRequestEventTarget_QueryInterface(DispXMLHttpRequestEventTarget* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispXMLHttpRequestEventTarget_AddRef(DispXMLHttpRequestEventTarget* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispXMLHttpRequestEventTarget_Release(DispXMLHttpRequestEventTarget* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispXMLHttpRequestEventTarget_GetTypeInfoCount(DispXMLHttpRequestEventTarget* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispXMLHttpRequestEventTarget_GetTypeInfo(DispXMLHttpRequestEventTarget* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLXMLHttpRequestEvents_QueryInterface(HTMLXMLHttpRequestEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLXMLHttpRequestEvents_AddRef(HTMLXMLHttpRequestEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLXMLHttpRequestEvents_Release(HTMLXMLHttpRequestEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLXMLHttpRequestEvents_GetTypeInfoCount(HTMLXMLHttpRequestEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLXMLHttpRequestEvents_GetTypeInfo(HTMLXMLHttpRequestEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_QueryInterface(IHTMLXMLHttpRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLXMLHttpRequest_AddRef(IHTMLXMLHttpRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLXMLHttpRequest_Release(IHTMLXMLHttpRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_GetTypeInfoCount(IHTMLXMLHttpRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_GetTypeInfo(IHTMLXMLHttpRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_get_readyState(IHTMLXMLHttpRequest* This,LONG *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_get_responseBody(IHTMLXMLHttpRequest* This,VARIANT *p) {
    return This->lpVtbl->get_responseBody(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_get_responseText(IHTMLXMLHttpRequest* This,BSTR *p) {
    return This->lpVtbl->get_responseText(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_get_responseXML(IHTMLXMLHttpRequest* This,IDispatch **p) {
    return This->lpVtbl->get_responseXML(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_get_status(IHTMLXMLHttpRequest* This,LONG *p) {
    return This->lpVtbl->get_status(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_get_statusText(IHTMLXMLHttpRequest* This,BSTR *p) {
    return This->lpVtbl->get_statusText(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_put_onreadystatechange(IHTMLXMLHttpRequest* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_get_onreadystatechange(IHTMLXMLHttpRequest* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_abort(IHTMLXMLHttpRequest* This) {
    return This->lpVtbl->abort(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_send(IHTMLXMLHttpRequest* This,VARIANT varBody) {
    return This->lpVtbl->send(This,varBody);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_getAllResponseHeaders(IHTMLXMLHttpRequest* This,BSTR *a) {
    return This->lpVtbl->getAllResponseHeaders(This,a);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest_getResponseHeader(IHTMLXMLHttpRequest* This,BSTR bstrHeader,BSTR *a) {
    return This->lpVtbl->getResponseHeader(This,bstrHeader,a);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLXMLHttpRequest2_QueryInterface(IHTMLXMLHttpRequest2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLXMLHttpRequest2_AddRef(IHTMLXMLHttpRequest2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLXMLHttpRequest2_Release(IHTMLXMLHttpRequest2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest2_GetTypeInfoCount(IHTMLXMLHttpRequest2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest2_GetTypeInfo(IHTMLXMLHttpRequest2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLXMLHttpRequest2_put_timeout(IHTMLXMLHttpRequest2* This,LONG v) {
    return This->lpVtbl->put_timeout(This,v);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest2_get_timeout(IHTMLXMLHttpRequest2* This,LONG *p) {
    return This->lpVtbl->get_timeout(This,p);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequest2_put_ontimeout(IHTMLXMLHttpRequest2* This,VARIANT v) {
    return This->lpVtbl->put_ontimeout(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLXMLHttpRequestFactory_QueryInterface(IHTMLXMLHttpRequestFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLXMLHttpRequestFactory_AddRef(IHTMLXMLHttpRequestFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLXMLHttpRequestFactory_Release(IHTMLXMLHttpRequestFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequestFactory_GetTypeInfoCount(IHTMLXMLHttpRequestFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLXMLHttpRequestFactory_GetTypeInfo(IHTMLXMLHttpRequestFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLXMLHttpRequest_QueryInterface(DispHTMLXMLHttpRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLXMLHttpRequest_AddRef(DispHTMLXMLHttpRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLXMLHttpRequest_Release(DispHTMLXMLHttpRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLXMLHttpRequest_GetTypeInfoCount(DispHTMLXMLHttpRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLXMLHttpRequest_GetTypeInfo(DispHTMLXMLHttpRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAngle_QueryInterface(ISVGAngle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAngle_AddRef(ISVGAngle* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAngle_Release(ISVGAngle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAngle_GetTypeInfoCount(ISVGAngle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAngle_GetTypeInfo(ISVGAngle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAngle_put_unitType(ISVGAngle* This,short v) {
    return This->lpVtbl->put_unitType(This,v);
}
static __WIDL_INLINE HRESULT ISVGAngle_get_unitType(ISVGAngle* This,short *p) {
    return This->lpVtbl->get_unitType(This,p);
}
static __WIDL_INLINE HRESULT ISVGAngle_put_value(ISVGAngle* This,float v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT ISVGAngle_get_value(ISVGAngle* This,float *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT ISVGAngle_put_valueInSpecifiedUnits(ISVGAngle* This,float v) {
    return This->lpVtbl->put_valueInSpecifiedUnits(This,v);
}
static __WIDL_INLINE HRESULT ISVGAngle_get_valueInSpecifiedUnits(ISVGAngle* This,float *p) {
    return This->lpVtbl->get_valueInSpecifiedUnits(This,p);
}
static __WIDL_INLINE HRESULT ISVGAngle_put_valueAsString(ISVGAngle* This,BSTR v) {
    return This->lpVtbl->put_valueAsString(This,v);
}
static __WIDL_INLINE HRESULT ISVGAngle_get_valueAsString(ISVGAngle* This,BSTR *p) {
    return This->lpVtbl->get_valueAsString(This,p);
}
static __WIDL_INLINE HRESULT ISVGAngle_newValueSpecifiedUnits(ISVGAngle* This,short unitType,float valueInSpecifiedUnits) {
    return This->lpVtbl->newValueSpecifiedUnits(This,unitType,valueInSpecifiedUnits);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGStylable_QueryInterface(ISVGStylable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGStylable_AddRef(ISVGStylable* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGStylable_Release(ISVGStylable* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGStylable_GetTypeInfoCount(ISVGStylable* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGStylable_GetTypeInfo(ISVGStylable* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGLocatable_QueryInterface(ISVGLocatable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGLocatable_AddRef(ISVGLocatable* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGLocatable_Release(ISVGLocatable* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGLocatable_GetTypeInfoCount(ISVGLocatable* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGLocatable_GetTypeInfo(ISVGLocatable* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGLocatable_get_nearestViewportElement(ISVGLocatable* This,ISVGElement **p) {
    return This->lpVtbl->get_nearestViewportElement(This,p);
}
static __WIDL_INLINE HRESULT ISVGLocatable_get_farthestViewportElement(ISVGLocatable* This,ISVGElement **p) {
    return This->lpVtbl->get_farthestViewportElement(This,p);
}
static __WIDL_INLINE HRESULT ISVGLocatable_getBBox(ISVGLocatable* This,ISVGRect **ppResult) {
    return This->lpVtbl->getBBox(This,ppResult);
}
static __WIDL_INLINE HRESULT ISVGLocatable_getCTM(ISVGLocatable* This,ISVGMatrix **ppResult) {
    return This->lpVtbl->getCTM(This,ppResult);
}
static __WIDL_INLINE HRESULT ISVGLocatable_getScreenCTM(ISVGLocatable* This,ISVGMatrix **ppResult) {
    return This->lpVtbl->getScreenCTM(This,ppResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTransformable_QueryInterface(ISVGTransformable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGTransformable_AddRef(ISVGTransformable* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGTransformable_Release(ISVGTransformable* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGTransformable_GetTypeInfoCount(ISVGTransformable* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGTransformable_GetTypeInfo(ISVGTransformable* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTests_QueryInterface(ISVGTests* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGTests_AddRef(ISVGTests* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGTests_Release(ISVGTests* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGTests_GetTypeInfoCount(ISVGTests* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGTests_GetTypeInfo(ISVGTests* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTests_get_requiredFeatures(ISVGTests* This,ISVGStringList **p) {
    return This->lpVtbl->get_requiredFeatures(This,p);
}
static __WIDL_INLINE HRESULT ISVGTests_get_requiredExtensions(ISVGTests* This,ISVGStringList **p) {
    return This->lpVtbl->get_requiredExtensions(This,p);
}
static __WIDL_INLINE HRESULT ISVGTests_get_systemLanguage(ISVGTests* This,ISVGStringList **p) {
    return This->lpVtbl->get_systemLanguage(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGLangSpace_QueryInterface(ISVGLangSpace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGLangSpace_AddRef(ISVGLangSpace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGLangSpace_Release(ISVGLangSpace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGLangSpace_GetTypeInfoCount(ISVGLangSpace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGLangSpace_GetTypeInfo(ISVGLangSpace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGLangSpace_put_xmllang(ISVGLangSpace* This,BSTR v) {
    return This->lpVtbl->put_xmllang(This,v);
}
static __WIDL_INLINE HRESULT ISVGLangSpace_get_xmllang(ISVGLangSpace* This,BSTR *p) {
    return This->lpVtbl->get_xmllang(This,p);
}
static __WIDL_INLINE HRESULT ISVGLangSpace_put_xmlspace(ISVGLangSpace* This,BSTR v) {
    return This->lpVtbl->put_xmlspace(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGExternalResourcesRequired_QueryInterface(ISVGExternalResourcesRequired* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGExternalResourcesRequired_AddRef(ISVGExternalResourcesRequired* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGExternalResourcesRequired_Release(ISVGExternalResourcesRequired* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGExternalResourcesRequired_GetTypeInfoCount(ISVGExternalResourcesRequired* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGExternalResourcesRequired_GetTypeInfo(ISVGExternalResourcesRequired* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGFitToViewBox_QueryInterface(ISVGFitToViewBox* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGFitToViewBox_AddRef(ISVGFitToViewBox* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGFitToViewBox_Release(ISVGFitToViewBox* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGFitToViewBox_GetTypeInfoCount(ISVGFitToViewBox* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGFitToViewBox_GetTypeInfo(ISVGFitToViewBox* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGFitToViewBox_get_viewBox(ISVGFitToViewBox* This,ISVGAnimatedRect **p) {
    return This->lpVtbl->get_viewBox(This,p);
}
static __WIDL_INLINE HRESULT ISVGFitToViewBox_putref_preserveAspectRatio(ISVGFitToViewBox* This,ISVGAnimatedPreserveAspectRatio *v) {
    return This->lpVtbl->putref_preserveAspectRatio(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGZoomAndPan_QueryInterface(ISVGZoomAndPan* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGZoomAndPan_AddRef(ISVGZoomAndPan* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGZoomAndPan_Release(ISVGZoomAndPan* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGZoomAndPan_GetTypeInfoCount(ISVGZoomAndPan* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGZoomAndPan_GetTypeInfo(ISVGZoomAndPan* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGURIReference_QueryInterface(ISVGURIReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGURIReference_AddRef(ISVGURIReference* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGURIReference_Release(ISVGURIReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGURIReference_GetTypeInfoCount(ISVGURIReference* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGURIReference_GetTypeInfo(ISVGURIReference* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedAngle_QueryInterface(ISVGAnimatedAngle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAnimatedAngle_AddRef(ISVGAnimatedAngle* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAnimatedAngle_Release(ISVGAnimatedAngle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAnimatedAngle_GetTypeInfoCount(ISVGAnimatedAngle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAnimatedAngle_GetTypeInfo(ISVGAnimatedAngle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedAngle_putref_baseVal(ISVGAnimatedAngle* This,ISVGAngle *v) {
    return This->lpVtbl->putref_baseVal(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedAngle_get_baseVal(ISVGAnimatedAngle* This,ISVGAngle **p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedAngle_putref_animVal(ISVGAnimatedAngle* This,ISVGAngle *v) {
    return This->lpVtbl->putref_animVal(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedTransformList_QueryInterface(ISVGAnimatedTransformList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAnimatedTransformList_AddRef(ISVGAnimatedTransformList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAnimatedTransformList_Release(ISVGAnimatedTransformList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAnimatedTransformList_GetTypeInfoCount(ISVGAnimatedTransformList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAnimatedTransformList_GetTypeInfo(ISVGAnimatedTransformList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedTransformList_putref_baseVal(ISVGAnimatedTransformList* This,ISVGTransformList *v) {
    return This->lpVtbl->putref_baseVal(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedTransformList_get_baseVal(ISVGAnimatedTransformList* This,ISVGTransformList **p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedTransformList_putref_animVal(ISVGAnimatedTransformList* This,ISVGTransformList *v) {
    return This->lpVtbl->putref_animVal(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedBoolean_QueryInterface(ISVGAnimatedBoolean* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAnimatedBoolean_AddRef(ISVGAnimatedBoolean* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAnimatedBoolean_Release(ISVGAnimatedBoolean* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAnimatedBoolean_GetTypeInfoCount(ISVGAnimatedBoolean* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAnimatedBoolean_GetTypeInfo(ISVGAnimatedBoolean* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedBoolean_put_baseVal(ISVGAnimatedBoolean* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_baseVal(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedBoolean_get_baseVal(ISVGAnimatedBoolean* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedBoolean_put_animVal(ISVGAnimatedBoolean* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_animVal(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedEnumeration_QueryInterface(ISVGAnimatedEnumeration* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAnimatedEnumeration_AddRef(ISVGAnimatedEnumeration* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAnimatedEnumeration_Release(ISVGAnimatedEnumeration* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAnimatedEnumeration_GetTypeInfoCount(ISVGAnimatedEnumeration* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAnimatedEnumeration_GetTypeInfo(ISVGAnimatedEnumeration* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedEnumeration_put_baseVal(ISVGAnimatedEnumeration* This,USHORT v) {
    return This->lpVtbl->put_baseVal(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedEnumeration_get_baseVal(ISVGAnimatedEnumeration* This,USHORT *p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedEnumeration_put_animVal(ISVGAnimatedEnumeration* This,USHORT v) {
    return This->lpVtbl->put_animVal(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedInteger_QueryInterface(ISVGAnimatedInteger* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAnimatedInteger_AddRef(ISVGAnimatedInteger* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAnimatedInteger_Release(ISVGAnimatedInteger* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAnimatedInteger_GetTypeInfoCount(ISVGAnimatedInteger* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAnimatedInteger_GetTypeInfo(ISVGAnimatedInteger* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedInteger_put_baseVal(ISVGAnimatedInteger* This,LONG v) {
    return This->lpVtbl->put_baseVal(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedInteger_get_baseVal(ISVGAnimatedInteger* This,LONG *p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedInteger_put_animVal(ISVGAnimatedInteger* This,LONG v) {
    return This->lpVtbl->put_animVal(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedLength_QueryInterface(ISVGAnimatedLength* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAnimatedLength_AddRef(ISVGAnimatedLength* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAnimatedLength_Release(ISVGAnimatedLength* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAnimatedLength_GetTypeInfoCount(ISVGAnimatedLength* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAnimatedLength_GetTypeInfo(ISVGAnimatedLength* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedLength_putref_baseVal(ISVGAnimatedLength* This,ISVGLength *v) {
    return This->lpVtbl->putref_baseVal(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedLength_get_baseVal(ISVGAnimatedLength* This,ISVGLength **p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedLength_putref_animVal(ISVGAnimatedLength* This,ISVGLength *v) {
    return This->lpVtbl->putref_animVal(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedLengthList_QueryInterface(ISVGAnimatedLengthList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAnimatedLengthList_AddRef(ISVGAnimatedLengthList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAnimatedLengthList_Release(ISVGAnimatedLengthList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAnimatedLengthList_GetTypeInfoCount(ISVGAnimatedLengthList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAnimatedLengthList_GetTypeInfo(ISVGAnimatedLengthList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedLengthList_putref_baseVal(ISVGAnimatedLengthList* This,ISVGLengthList *v) {
    return This->lpVtbl->putref_baseVal(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedLengthList_get_baseVal(ISVGAnimatedLengthList* This,ISVGLengthList **p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedLengthList_putref_animVal(ISVGAnimatedLengthList* This,ISVGLengthList *v) {
    return This->lpVtbl->putref_animVal(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedNumber_QueryInterface(ISVGAnimatedNumber* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAnimatedNumber_AddRef(ISVGAnimatedNumber* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAnimatedNumber_Release(ISVGAnimatedNumber* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAnimatedNumber_GetTypeInfoCount(ISVGAnimatedNumber* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAnimatedNumber_GetTypeInfo(ISVGAnimatedNumber* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedNumber_put_baseVal(ISVGAnimatedNumber* This,float v) {
    return This->lpVtbl->put_baseVal(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedNumber_get_baseVal(ISVGAnimatedNumber* This,float *p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedNumber_put_animVal(ISVGAnimatedNumber* This,float v) {
    return This->lpVtbl->put_animVal(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedNumberList_QueryInterface(ISVGAnimatedNumberList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAnimatedNumberList_AddRef(ISVGAnimatedNumberList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAnimatedNumberList_Release(ISVGAnimatedNumberList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAnimatedNumberList_GetTypeInfoCount(ISVGAnimatedNumberList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAnimatedNumberList_GetTypeInfo(ISVGAnimatedNumberList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedNumberList_putref_baseVal(ISVGAnimatedNumberList* This,ISVGNumberList *v) {
    return This->lpVtbl->putref_baseVal(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedNumberList_get_baseVal(ISVGAnimatedNumberList* This,ISVGNumberList **p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedNumberList_putref_animVal(ISVGAnimatedNumberList* This,ISVGNumberList *v) {
    return This->lpVtbl->putref_animVal(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedRect_QueryInterface(ISVGAnimatedRect* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAnimatedRect_AddRef(ISVGAnimatedRect* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAnimatedRect_Release(ISVGAnimatedRect* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAnimatedRect_GetTypeInfoCount(ISVGAnimatedRect* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAnimatedRect_GetTypeInfo(ISVGAnimatedRect* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedRect_putref_baseVal(ISVGAnimatedRect* This,ISVGRect *v) {
    return This->lpVtbl->putref_baseVal(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedRect_get_baseVal(ISVGAnimatedRect* This,ISVGRect **p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedRect_putref_animVal(ISVGAnimatedRect* This,ISVGRect *v) {
    return This->lpVtbl->putref_animVal(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedString_QueryInterface(ISVGAnimatedString* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAnimatedString_AddRef(ISVGAnimatedString* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAnimatedString_Release(ISVGAnimatedString* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAnimatedString_GetTypeInfoCount(ISVGAnimatedString* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAnimatedString_GetTypeInfo(ISVGAnimatedString* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedString_put_baseVal(ISVGAnimatedString* This,BSTR v) {
    return This->lpVtbl->put_baseVal(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedString_get_baseVal(ISVGAnimatedString* This,BSTR *p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGClipPathElement_QueryInterface(ISVGClipPathElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGClipPathElement_AddRef(ISVGClipPathElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGClipPathElement_Release(ISVGClipPathElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGClipPathElement_GetTypeInfoCount(ISVGClipPathElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGClipPathElement_GetTypeInfo(ISVGClipPathElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGClipPathElement_putref_clipPathUnits(ISVGClipPathElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_clipPathUnits(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGClipPathElement_QueryInterface(DispSVGClipPathElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGClipPathElement_AddRef(DispSVGClipPathElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGClipPathElement_Release(DispSVGClipPathElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGClipPathElement_GetTypeInfoCount(DispSVGClipPathElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGClipPathElement_GetTypeInfo(DispSVGClipPathElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGDocument_QueryInterface(ISVGDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGDocument_AddRef(ISVGDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGDocument_Release(ISVGDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGDocument_GetTypeInfoCount(ISVGDocument* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGDocument_GetTypeInfo(ISVGDocument* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IGetSVGDocument_QueryInterface(IGetSVGDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IGetSVGDocument_AddRef(IGetSVGDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IGetSVGDocument_Release(IGetSVGDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IGetSVGDocument_GetTypeInfoCount(IGetSVGDocument* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IGetSVGDocument_GetTypeInfo(IGetSVGDocument* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGElement_QueryInterface(ISVGElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGElement_AddRef(ISVGElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGElement_Release(ISVGElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGElement_GetTypeInfoCount(ISVGElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGElement_GetTypeInfo(ISVGElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGElement_put_xmlbase(ISVGElement* This,BSTR v) {
    return This->lpVtbl->put_xmlbase(This,v);
}
static __WIDL_INLINE HRESULT ISVGElement_get_xmlbase(ISVGElement* This,BSTR *p) {
    return This->lpVtbl->get_xmlbase(This,p);
}
static __WIDL_INLINE HRESULT ISVGElement_putref_ownerSVGElement(ISVGElement* This,ISVGSVGElement *v) {
    return This->lpVtbl->putref_ownerSVGElement(This,v);
}
static __WIDL_INLINE HRESULT ISVGElement_get_ownerSVGElement(ISVGElement* This,ISVGSVGElement **p) {
    return This->lpVtbl->get_ownerSVGElement(This,p);
}
static __WIDL_INLINE HRESULT ISVGElement_putref_viewportElement(ISVGElement* This,ISVGElement *v) {
    return This->lpVtbl->putref_viewportElement(This,v);
}
static __WIDL_INLINE HRESULT ISVGElement_get_viewportElement(ISVGElement* This,ISVGElement **p) {
    return This->lpVtbl->get_viewportElement(This,p);
}
static __WIDL_INLINE HRESULT ISVGElement_putref_focusable(ISVGElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_focusable(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGElement_QueryInterface(DispSVGElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGElement_AddRef(DispSVGElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGElement_Release(DispSVGElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGElement_GetTypeInfoCount(DispSVGElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGElement_GetTypeInfo(DispSVGElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IICCSVGColor_QueryInterface(IICCSVGColor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IICCSVGColor_AddRef(IICCSVGColor* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IICCSVGColor_Release(IICCSVGColor* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IICCSVGColor_GetTypeInfoCount(IICCSVGColor* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IICCSVGColor_GetTypeInfo(IICCSVGColor* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGLength_QueryInterface(ISVGLength* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGLength_AddRef(ISVGLength* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGLength_Release(ISVGLength* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGLength_GetTypeInfoCount(ISVGLength* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGLength_GetTypeInfo(ISVGLength* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGLength_put_unitType(ISVGLength* This,short v) {
    return This->lpVtbl->put_unitType(This,v);
}
static __WIDL_INLINE HRESULT ISVGLength_get_unitType(ISVGLength* This,short *p) {
    return This->lpVtbl->get_unitType(This,p);
}
static __WIDL_INLINE HRESULT ISVGLength_put_value(ISVGLength* This,float v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT ISVGLength_get_value(ISVGLength* This,float *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT ISVGLength_put_valueInSpecifiedUnits(ISVGLength* This,float v) {
    return This->lpVtbl->put_valueInSpecifiedUnits(This,v);
}
static __WIDL_INLINE HRESULT ISVGLength_get_valueInSpecifiedUnits(ISVGLength* This,float *p) {
    return This->lpVtbl->get_valueInSpecifiedUnits(This,p);
}
static __WIDL_INLINE HRESULT ISVGLength_put_valueAsString(ISVGLength* This,BSTR v) {
    return This->lpVtbl->put_valueAsString(This,v);
}
static __WIDL_INLINE HRESULT ISVGLength_get_valueAsString(ISVGLength* This,BSTR *p) {
    return This->lpVtbl->get_valueAsString(This,p);
}
static __WIDL_INLINE HRESULT ISVGLength_newValueSpecifiedUnits(ISVGLength* This,short unitType,float valueInSpecifiedUnits) {
    return This->lpVtbl->newValueSpecifiedUnits(This,unitType,valueInSpecifiedUnits);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGLengthList_QueryInterface(ISVGLengthList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGLengthList_AddRef(ISVGLengthList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGLengthList_Release(ISVGLengthList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGLengthList_GetTypeInfoCount(ISVGLengthList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGLengthList_GetTypeInfo(ISVGLengthList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGLengthList_put_numberOfItems(ISVGLengthList* This,LONG v) {
    return This->lpVtbl->put_numberOfItems(This,v);
}
static __WIDL_INLINE HRESULT ISVGLengthList_get_numberOfItems(ISVGLengthList* This,LONG *p) {
    return This->lpVtbl->get_numberOfItems(This,p);
}
static __WIDL_INLINE HRESULT ISVGLengthList_clear(ISVGLengthList* This) {
    return This->lpVtbl->clear(This);
}
static __WIDL_INLINE HRESULT ISVGLengthList_initialize(ISVGLengthList* This,ISVGLength *newItem,ISVGLength **ppResult) {
    return This->lpVtbl->initialize(This,newItem,ppResult);
}
static __WIDL_INLINE HRESULT ISVGLengthList_getItem(ISVGLengthList* This,LONG index,ISVGLength **ppResult) {
    return This->lpVtbl->getItem(This,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGLengthList_insertItemBefore(ISVGLengthList* This,ISVGLength *newItem,LONG index,ISVGLength **ppResult) {
    return This->lpVtbl->insertItemBefore(This,newItem,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGLengthList_replaceItem(ISVGLengthList* This,ISVGLength *newItem,LONG index,ISVGLength **ppResult) {
    return This->lpVtbl->replaceItem(This,newItem,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGLengthList_removeItem(ISVGLengthList* This,LONG index,ISVGLength **ppResult) {
    return This->lpVtbl->removeItem(This,index,ppResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGMatrix_QueryInterface(ISVGMatrix* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGMatrix_AddRef(ISVGMatrix* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGMatrix_Release(ISVGMatrix* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGMatrix_GetTypeInfoCount(ISVGMatrix* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGMatrix_GetTypeInfo(ISVGMatrix* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGMatrix_put_a(ISVGMatrix* This,float v) {
    return This->lpVtbl->put_a(This,v);
}
static __WIDL_INLINE HRESULT ISVGMatrix_get_a(ISVGMatrix* This,float *p) {
    return This->lpVtbl->get_a(This,p);
}
static __WIDL_INLINE HRESULT ISVGMatrix_put_b(ISVGMatrix* This,float v) {
    return This->lpVtbl->put_b(This,v);
}
static __WIDL_INLINE HRESULT ISVGMatrix_get_b(ISVGMatrix* This,float *p) {
    return This->lpVtbl->get_b(This,p);
}
static __WIDL_INLINE HRESULT ISVGMatrix_put_c(ISVGMatrix* This,float v) {
    return This->lpVtbl->put_c(This,v);
}
static __WIDL_INLINE HRESULT ISVGMatrix_get_c(ISVGMatrix* This,float *p) {
    return This->lpVtbl->get_c(This,p);
}
static __WIDL_INLINE HRESULT ISVGMatrix_put_d(ISVGMatrix* This,float v) {
    return This->lpVtbl->put_d(This,v);
}
static __WIDL_INLINE HRESULT ISVGMatrix_get_d(ISVGMatrix* This,float *p) {
    return This->lpVtbl->get_d(This,p);
}
static __WIDL_INLINE HRESULT ISVGMatrix_put_e(ISVGMatrix* This,float v) {
    return This->lpVtbl->put_e(This,v);
}
static __WIDL_INLINE HRESULT ISVGMatrix_get_e(ISVGMatrix* This,float *p) {
    return This->lpVtbl->get_e(This,p);
}
static __WIDL_INLINE HRESULT ISVGMatrix_put_f(ISVGMatrix* This,float v) {
    return This->lpVtbl->put_f(This,v);
}
static __WIDL_INLINE HRESULT ISVGMatrix_get_f(ISVGMatrix* This,float *p) {
    return This->lpVtbl->get_f(This,p);
}
static __WIDL_INLINE HRESULT ISVGMatrix_multiply(ISVGMatrix* This,ISVGMatrix *secondMatrix,ISVGMatrix **ppResult) {
    return This->lpVtbl->multiply(This,secondMatrix,ppResult);
}
static __WIDL_INLINE HRESULT ISVGMatrix_inverse(ISVGMatrix* This,ISVGMatrix **ppResult) {
    return This->lpVtbl->inverse(This,ppResult);
}
static __WIDL_INLINE HRESULT ISVGMatrix_translate(ISVGMatrix* This,float x,float y,ISVGMatrix **ppResult) {
    return This->lpVtbl->translate(This,x,y,ppResult);
}
static __WIDL_INLINE HRESULT ISVGMatrix_scale(ISVGMatrix* This,float scaleFactor,ISVGMatrix **ppResult) {
    return This->lpVtbl->scale(This,scaleFactor,ppResult);
}
static __WIDL_INLINE HRESULT ISVGMatrix_scaleNonUniform(ISVGMatrix* This,float scaleFactorX,float scaleFactorY,ISVGMatrix **ppResult) {
    return This->lpVtbl->scaleNonUniform(This,scaleFactorX,scaleFactorY,ppResult);
}
static __WIDL_INLINE HRESULT ISVGMatrix_rotate(ISVGMatrix* This,float angle,ISVGMatrix **ppResult) {
    return This->lpVtbl->rotate(This,angle,ppResult);
}
static __WIDL_INLINE HRESULT ISVGMatrix_rotateFromVector(ISVGMatrix* This,float x,float y,ISVGMatrix **ppResult) {
    return This->lpVtbl->rotateFromVector(This,x,y,ppResult);
}
static __WIDL_INLINE HRESULT ISVGMatrix_flipX(ISVGMatrix* This,ISVGMatrix **ppResult) {
    return This->lpVtbl->flipX(This,ppResult);
}
static __WIDL_INLINE HRESULT ISVGMatrix_flipY(ISVGMatrix* This,ISVGMatrix **ppResult) {
    return This->lpVtbl->flipY(This,ppResult);
}
static __WIDL_INLINE HRESULT ISVGMatrix_skewX(ISVGMatrix* This,float angle,ISVGMatrix **ppResult) {
    return This->lpVtbl->skewX(This,angle,ppResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGNumber_QueryInterface(ISVGNumber* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGNumber_AddRef(ISVGNumber* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGNumber_Release(ISVGNumber* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGNumber_GetTypeInfoCount(ISVGNumber* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGNumber_GetTypeInfo(ISVGNumber* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGNumber_put_value(ISVGNumber* This,float v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGNumberList_QueryInterface(ISVGNumberList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGNumberList_AddRef(ISVGNumberList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGNumberList_Release(ISVGNumberList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGNumberList_GetTypeInfoCount(ISVGNumberList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGNumberList_GetTypeInfo(ISVGNumberList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGNumberList_put_numberOfItems(ISVGNumberList* This,LONG v) {
    return This->lpVtbl->put_numberOfItems(This,v);
}
static __WIDL_INLINE HRESULT ISVGNumberList_get_numberOfItems(ISVGNumberList* This,LONG *p) {
    return This->lpVtbl->get_numberOfItems(This,p);
}
static __WIDL_INLINE HRESULT ISVGNumberList_clear(ISVGNumberList* This) {
    return This->lpVtbl->clear(This);
}
static __WIDL_INLINE HRESULT ISVGNumberList_initialize(ISVGNumberList* This,ISVGNumber *newItem,ISVGNumber **ppResult) {
    return This->lpVtbl->initialize(This,newItem,ppResult);
}
static __WIDL_INLINE HRESULT ISVGNumberList_getItem(ISVGNumberList* This,LONG index,ISVGNumber **ppResult) {
    return This->lpVtbl->getItem(This,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGNumberList_insertItemBefore(ISVGNumberList* This,ISVGNumber *newItem,LONG index,ISVGNumber **ppResult) {
    return This->lpVtbl->insertItemBefore(This,newItem,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGNumberList_replaceItem(ISVGNumberList* This,ISVGNumber *newItem,LONG index,ISVGNumber **ppResult) {
    return This->lpVtbl->replaceItem(This,newItem,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGNumberList_removeItem(ISVGNumberList* This,LONG index,ISVGNumber **ppResult) {
    return This->lpVtbl->removeItem(This,index,ppResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPaint_QueryInterface(ISVGPaint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPaint_AddRef(ISVGPaint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPaint_Release(ISVGPaint* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPaint_GetTypeInfoCount(ISVGPaint* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPaint_GetTypeInfo(ISVGPaint* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPatternElement_QueryInterface(ISVGPatternElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPatternElement_AddRef(ISVGPatternElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPatternElement_Release(ISVGPatternElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPatternElement_GetTypeInfoCount(ISVGPatternElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPatternElement_GetTypeInfo(ISVGPatternElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPatternElement_putref_patternUnits(ISVGPatternElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_patternUnits(This,v);
}
static __WIDL_INLINE HRESULT ISVGPatternElement_get_patternUnits(ISVGPatternElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_patternUnits(This,p);
}
static __WIDL_INLINE HRESULT ISVGPatternElement_putref_patternContentUnits(ISVGPatternElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_patternContentUnits(This,v);
}
static __WIDL_INLINE HRESULT ISVGPatternElement_get_patternContentUnits(ISVGPatternElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_patternContentUnits(This,p);
}
static __WIDL_INLINE HRESULT ISVGPatternElement_putref_patternTransform(ISVGPatternElement* This,ISVGAnimatedTransformList *v) {
    return This->lpVtbl->putref_patternTransform(This,v);
}
static __WIDL_INLINE HRESULT ISVGPatternElement_get_patternTransform(ISVGPatternElement* This,ISVGAnimatedTransformList **p) {
    return This->lpVtbl->get_patternTransform(This,p);
}
static __WIDL_INLINE HRESULT ISVGPatternElement_putref_x(ISVGPatternElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPatternElement_get_x(ISVGPatternElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPatternElement_putref_y(ISVGPatternElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGPatternElement_get_y(ISVGPatternElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGPatternElement_putref_width(ISVGPatternElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_width(This,v);
}
static __WIDL_INLINE HRESULT ISVGPatternElement_get_width(ISVGPatternElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT ISVGPatternElement_putref_height(ISVGPatternElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_height(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPatternElement_QueryInterface(DispSVGPatternElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPatternElement_AddRef(DispSVGPatternElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPatternElement_Release(DispSVGPatternElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPatternElement_GetTypeInfoCount(DispSVGPatternElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPatternElement_GetTypeInfo(DispSVGPatternElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSeg_QueryInterface(ISVGPathSeg* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSeg_AddRef(ISVGPathSeg* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSeg_Release(ISVGPathSeg* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSeg_GetTypeInfoCount(ISVGPathSeg* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSeg_GetTypeInfo(ISVGPathSeg* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSeg_put_pathSegType(ISVGPathSeg* This,short v) {
    return This->lpVtbl->put_pathSegType(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSeg_get_pathSegType(ISVGPathSeg* This,short *p) {
    return This->lpVtbl->get_pathSegType(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegArcAbs_QueryInterface(ISVGPathSegArcAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegArcAbs_AddRef(ISVGPathSegArcAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegArcAbs_Release(ISVGPathSegArcAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegArcAbs_GetTypeInfoCount(ISVGPathSegArcAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcAbs_GetTypeInfo(ISVGPathSegArcAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegArcAbs_put_x(ISVGPathSegArcAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcAbs_get_x(ISVGPathSegArcAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcAbs_put_y(ISVGPathSegArcAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcAbs_get_y(ISVGPathSegArcAbs* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcAbs_put_r1(ISVGPathSegArcAbs* This,float v) {
    return This->lpVtbl->put_r1(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcAbs_get_r1(ISVGPathSegArcAbs* This,float *p) {
    return This->lpVtbl->get_r1(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcAbs_put_r2(ISVGPathSegArcAbs* This,float v) {
    return This->lpVtbl->put_r2(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcAbs_get_r2(ISVGPathSegArcAbs* This,float *p) {
    return This->lpVtbl->get_r2(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcAbs_put_angle(ISVGPathSegArcAbs* This,float v) {
    return This->lpVtbl->put_angle(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcAbs_get_angle(ISVGPathSegArcAbs* This,float *p) {
    return This->lpVtbl->get_angle(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcAbs_put_largeArcFlag(ISVGPathSegArcAbs* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_largeArcFlag(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcAbs_get_largeArcFlag(ISVGPathSegArcAbs* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_largeArcFlag(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcAbs_put_sweepFlag(ISVGPathSegArcAbs* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_sweepFlag(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegArcRel_QueryInterface(ISVGPathSegArcRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegArcRel_AddRef(ISVGPathSegArcRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegArcRel_Release(ISVGPathSegArcRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegArcRel_GetTypeInfoCount(ISVGPathSegArcRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcRel_GetTypeInfo(ISVGPathSegArcRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegArcRel_put_x(ISVGPathSegArcRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcRel_get_x(ISVGPathSegArcRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcRel_put_y(ISVGPathSegArcRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcRel_get_y(ISVGPathSegArcRel* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcRel_put_r1(ISVGPathSegArcRel* This,float v) {
    return This->lpVtbl->put_r1(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcRel_get_r1(ISVGPathSegArcRel* This,float *p) {
    return This->lpVtbl->get_r1(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcRel_put_r2(ISVGPathSegArcRel* This,float v) {
    return This->lpVtbl->put_r2(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcRel_get_r2(ISVGPathSegArcRel* This,float *p) {
    return This->lpVtbl->get_r2(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcRel_put_angle(ISVGPathSegArcRel* This,float v) {
    return This->lpVtbl->put_angle(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcRel_get_angle(ISVGPathSegArcRel* This,float *p) {
    return This->lpVtbl->get_angle(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcRel_put_largeArcFlag(ISVGPathSegArcRel* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_largeArcFlag(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcRel_get_largeArcFlag(ISVGPathSegArcRel* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_largeArcFlag(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegArcRel_put_sweepFlag(ISVGPathSegArcRel* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_sweepFlag(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegClosePath_QueryInterface(ISVGPathSegClosePath* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegClosePath_AddRef(ISVGPathSegClosePath* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegClosePath_Release(ISVGPathSegClosePath* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegClosePath_GetTypeInfoCount(ISVGPathSegClosePath* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegClosePath_GetTypeInfo(ISVGPathSegClosePath* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegMovetoAbs_QueryInterface(ISVGPathSegMovetoAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegMovetoAbs_AddRef(ISVGPathSegMovetoAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegMovetoAbs_Release(ISVGPathSegMovetoAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegMovetoAbs_GetTypeInfoCount(ISVGPathSegMovetoAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegMovetoAbs_GetTypeInfo(ISVGPathSegMovetoAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegMovetoAbs_put_x(ISVGPathSegMovetoAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegMovetoAbs_get_x(ISVGPathSegMovetoAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegMovetoAbs_put_y(ISVGPathSegMovetoAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegMovetoRel_QueryInterface(ISVGPathSegMovetoRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegMovetoRel_AddRef(ISVGPathSegMovetoRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegMovetoRel_Release(ISVGPathSegMovetoRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegMovetoRel_GetTypeInfoCount(ISVGPathSegMovetoRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegMovetoRel_GetTypeInfo(ISVGPathSegMovetoRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegMovetoRel_put_x(ISVGPathSegMovetoRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegMovetoRel_get_x(ISVGPathSegMovetoRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegMovetoRel_put_y(ISVGPathSegMovetoRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegLinetoAbs_QueryInterface(ISVGPathSegLinetoAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegLinetoAbs_AddRef(ISVGPathSegLinetoAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegLinetoAbs_Release(ISVGPathSegLinetoAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegLinetoAbs_GetTypeInfoCount(ISVGPathSegLinetoAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegLinetoAbs_GetTypeInfo(ISVGPathSegLinetoAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegLinetoAbs_put_x(ISVGPathSegLinetoAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegLinetoAbs_get_x(ISVGPathSegLinetoAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegLinetoAbs_put_y(ISVGPathSegLinetoAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegLinetoRel_QueryInterface(ISVGPathSegLinetoRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegLinetoRel_AddRef(ISVGPathSegLinetoRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegLinetoRel_Release(ISVGPathSegLinetoRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegLinetoRel_GetTypeInfoCount(ISVGPathSegLinetoRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegLinetoRel_GetTypeInfo(ISVGPathSegLinetoRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegLinetoRel_put_x(ISVGPathSegLinetoRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegLinetoRel_get_x(ISVGPathSegLinetoRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegLinetoRel_put_y(ISVGPathSegLinetoRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicAbs_QueryInterface(ISVGPathSegCurvetoCubicAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoCubicAbs_AddRef(ISVGPathSegCurvetoCubicAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoCubicAbs_Release(ISVGPathSegCurvetoCubicAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicAbs_GetTypeInfoCount(ISVGPathSegCurvetoCubicAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicAbs_GetTypeInfo(ISVGPathSegCurvetoCubicAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicAbs_put_x(ISVGPathSegCurvetoCubicAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicAbs_get_x(ISVGPathSegCurvetoCubicAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicAbs_put_y(ISVGPathSegCurvetoCubicAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicAbs_get_y(ISVGPathSegCurvetoCubicAbs* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicAbs_put_x1(ISVGPathSegCurvetoCubicAbs* This,float v) {
    return This->lpVtbl->put_x1(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicAbs_get_x1(ISVGPathSegCurvetoCubicAbs* This,float *p) {
    return This->lpVtbl->get_x1(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicAbs_put_y1(ISVGPathSegCurvetoCubicAbs* This,float v) {
    return This->lpVtbl->put_y1(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicAbs_get_y1(ISVGPathSegCurvetoCubicAbs* This,float *p) {
    return This->lpVtbl->get_y1(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicAbs_put_x2(ISVGPathSegCurvetoCubicAbs* This,float v) {
    return This->lpVtbl->put_x2(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicAbs_get_x2(ISVGPathSegCurvetoCubicAbs* This,float *p) {
    return This->lpVtbl->get_x2(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicAbs_put_y2(ISVGPathSegCurvetoCubicAbs* This,float v) {
    return This->lpVtbl->put_y2(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicRel_QueryInterface(ISVGPathSegCurvetoCubicRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoCubicRel_AddRef(ISVGPathSegCurvetoCubicRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoCubicRel_Release(ISVGPathSegCurvetoCubicRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicRel_GetTypeInfoCount(ISVGPathSegCurvetoCubicRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicRel_GetTypeInfo(ISVGPathSegCurvetoCubicRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicRel_put_x(ISVGPathSegCurvetoCubicRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicRel_get_x(ISVGPathSegCurvetoCubicRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicRel_put_y(ISVGPathSegCurvetoCubicRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicRel_get_y(ISVGPathSegCurvetoCubicRel* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicRel_put_x1(ISVGPathSegCurvetoCubicRel* This,float v) {
    return This->lpVtbl->put_x1(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicRel_get_x1(ISVGPathSegCurvetoCubicRel* This,float *p) {
    return This->lpVtbl->get_x1(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicRel_put_y1(ISVGPathSegCurvetoCubicRel* This,float v) {
    return This->lpVtbl->put_y1(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicRel_get_y1(ISVGPathSegCurvetoCubicRel* This,float *p) {
    return This->lpVtbl->get_y1(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicRel_put_x2(ISVGPathSegCurvetoCubicRel* This,float v) {
    return This->lpVtbl->put_x2(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicRel_get_x2(ISVGPathSegCurvetoCubicRel* This,float *p) {
    return This->lpVtbl->get_x2(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicRel_put_y2(ISVGPathSegCurvetoCubicRel* This,float v) {
    return This->lpVtbl->put_y2(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_QueryInterface(ISVGPathSegCurvetoCubicSmoothAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoCubicSmoothAbs_AddRef(ISVGPathSegCurvetoCubicSmoothAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoCubicSmoothAbs_Release(ISVGPathSegCurvetoCubicSmoothAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_GetTypeInfoCount(ISVGPathSegCurvetoCubicSmoothAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_GetTypeInfo(ISVGPathSegCurvetoCubicSmoothAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_put_x(ISVGPathSegCurvetoCubicSmoothAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_get_x(ISVGPathSegCurvetoCubicSmoothAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_put_y(ISVGPathSegCurvetoCubicSmoothAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_get_y(ISVGPathSegCurvetoCubicSmoothAbs* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_put_x2(ISVGPathSegCurvetoCubicSmoothAbs* This,float v) {
    return This->lpVtbl->put_x2(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_get_x2(ISVGPathSegCurvetoCubicSmoothAbs* This,float *p) {
    return This->lpVtbl->get_x2(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothAbs_put_y2(ISVGPathSegCurvetoCubicSmoothAbs* This,float v) {
    return This->lpVtbl->put_y2(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_QueryInterface(ISVGPathSegCurvetoCubicSmoothRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoCubicSmoothRel_AddRef(ISVGPathSegCurvetoCubicSmoothRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoCubicSmoothRel_Release(ISVGPathSegCurvetoCubicSmoothRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_GetTypeInfoCount(ISVGPathSegCurvetoCubicSmoothRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_GetTypeInfo(ISVGPathSegCurvetoCubicSmoothRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_put_x(ISVGPathSegCurvetoCubicSmoothRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_get_x(ISVGPathSegCurvetoCubicSmoothRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_put_y(ISVGPathSegCurvetoCubicSmoothRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_get_y(ISVGPathSegCurvetoCubicSmoothRel* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_put_x2(ISVGPathSegCurvetoCubicSmoothRel* This,float v) {
    return This->lpVtbl->put_x2(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_get_x2(ISVGPathSegCurvetoCubicSmoothRel* This,float *p) {
    return This->lpVtbl->get_x2(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoCubicSmoothRel_put_y2(ISVGPathSegCurvetoCubicSmoothRel* This,float v) {
    return This->lpVtbl->put_y2(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_QueryInterface(ISVGPathSegCurvetoQuadraticAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoQuadraticAbs_AddRef(ISVGPathSegCurvetoQuadraticAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoQuadraticAbs_Release(ISVGPathSegCurvetoQuadraticAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_GetTypeInfoCount(ISVGPathSegCurvetoQuadraticAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_GetTypeInfo(ISVGPathSegCurvetoQuadraticAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_put_x(ISVGPathSegCurvetoQuadraticAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_get_x(ISVGPathSegCurvetoQuadraticAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_put_y(ISVGPathSegCurvetoQuadraticAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_get_y(ISVGPathSegCurvetoQuadraticAbs* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_put_x1(ISVGPathSegCurvetoQuadraticAbs* This,float v) {
    return This->lpVtbl->put_x1(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_get_x1(ISVGPathSegCurvetoQuadraticAbs* This,float *p) {
    return This->lpVtbl->get_x1(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticAbs_put_y1(ISVGPathSegCurvetoQuadraticAbs* This,float v) {
    return This->lpVtbl->put_y1(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticRel_QueryInterface(ISVGPathSegCurvetoQuadraticRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoQuadraticRel_AddRef(ISVGPathSegCurvetoQuadraticRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoQuadraticRel_Release(ISVGPathSegCurvetoQuadraticRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticRel_GetTypeInfoCount(ISVGPathSegCurvetoQuadraticRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticRel_GetTypeInfo(ISVGPathSegCurvetoQuadraticRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticRel_put_x(ISVGPathSegCurvetoQuadraticRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticRel_get_x(ISVGPathSegCurvetoQuadraticRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticRel_put_y(ISVGPathSegCurvetoQuadraticRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticRel_get_y(ISVGPathSegCurvetoQuadraticRel* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticRel_put_x1(ISVGPathSegCurvetoQuadraticRel* This,float v) {
    return This->lpVtbl->put_x1(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticRel_get_x1(ISVGPathSegCurvetoQuadraticRel* This,float *p) {
    return This->lpVtbl->get_x1(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticRel_put_y1(ISVGPathSegCurvetoQuadraticRel* This,float v) {
    return This->lpVtbl->put_y1(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_QueryInterface(ISVGPathSegCurvetoQuadraticSmoothAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoQuadraticSmoothAbs_AddRef(ISVGPathSegCurvetoQuadraticSmoothAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoQuadraticSmoothAbs_Release(ISVGPathSegCurvetoQuadraticSmoothAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_GetTypeInfoCount(ISVGPathSegCurvetoQuadraticSmoothAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_GetTypeInfo(ISVGPathSegCurvetoQuadraticSmoothAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_put_x(ISVGPathSegCurvetoQuadraticSmoothAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_get_x(ISVGPathSegCurvetoQuadraticSmoothAbs* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothAbs_put_y(ISVGPathSegCurvetoQuadraticSmoothAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_QueryInterface(ISVGPathSegCurvetoQuadraticSmoothRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoQuadraticSmoothRel_AddRef(ISVGPathSegCurvetoQuadraticSmoothRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegCurvetoQuadraticSmoothRel_Release(ISVGPathSegCurvetoQuadraticSmoothRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_GetTypeInfoCount(ISVGPathSegCurvetoQuadraticSmoothRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_GetTypeInfo(ISVGPathSegCurvetoQuadraticSmoothRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_put_x(ISVGPathSegCurvetoQuadraticSmoothRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_get_x(ISVGPathSegCurvetoQuadraticSmoothRel* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegCurvetoQuadraticSmoothRel_put_y(ISVGPathSegCurvetoQuadraticSmoothRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegLinetoHorizontalAbs_QueryInterface(ISVGPathSegLinetoHorizontalAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegLinetoHorizontalAbs_AddRef(ISVGPathSegLinetoHorizontalAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegLinetoHorizontalAbs_Release(ISVGPathSegLinetoHorizontalAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegLinetoHorizontalAbs_GetTypeInfoCount(ISVGPathSegLinetoHorizontalAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegLinetoHorizontalAbs_GetTypeInfo(ISVGPathSegLinetoHorizontalAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegLinetoHorizontalAbs_put_x(ISVGPathSegLinetoHorizontalAbs* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegLinetoHorizontalRel_QueryInterface(ISVGPathSegLinetoHorizontalRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegLinetoHorizontalRel_AddRef(ISVGPathSegLinetoHorizontalRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegLinetoHorizontalRel_Release(ISVGPathSegLinetoHorizontalRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegLinetoHorizontalRel_GetTypeInfoCount(ISVGPathSegLinetoHorizontalRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegLinetoHorizontalRel_GetTypeInfo(ISVGPathSegLinetoHorizontalRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegLinetoHorizontalRel_put_x(ISVGPathSegLinetoHorizontalRel* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegLinetoVerticalAbs_QueryInterface(ISVGPathSegLinetoVerticalAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegLinetoVerticalAbs_AddRef(ISVGPathSegLinetoVerticalAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegLinetoVerticalAbs_Release(ISVGPathSegLinetoVerticalAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegLinetoVerticalAbs_GetTypeInfoCount(ISVGPathSegLinetoVerticalAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegLinetoVerticalAbs_GetTypeInfo(ISVGPathSegLinetoVerticalAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegLinetoVerticalAbs_put_y(ISVGPathSegLinetoVerticalAbs* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegLinetoVerticalRel_QueryInterface(ISVGPathSegLinetoVerticalRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegLinetoVerticalRel_AddRef(ISVGPathSegLinetoVerticalRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegLinetoVerticalRel_Release(ISVGPathSegLinetoVerticalRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegLinetoVerticalRel_GetTypeInfoCount(ISVGPathSegLinetoVerticalRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegLinetoVerticalRel_GetTypeInfo(ISVGPathSegLinetoVerticalRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegLinetoVerticalRel_put_y(ISVGPathSegLinetoVerticalRel* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegArcAbs_QueryInterface(DispSVGPathSegArcAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegArcAbs_AddRef(DispSVGPathSegArcAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegArcAbs_Release(DispSVGPathSegArcAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegArcAbs_GetTypeInfoCount(DispSVGPathSegArcAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegArcAbs_GetTypeInfo(DispSVGPathSegArcAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegArcRel_QueryInterface(DispSVGPathSegArcRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegArcRel_AddRef(DispSVGPathSegArcRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegArcRel_Release(DispSVGPathSegArcRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegArcRel_GetTypeInfoCount(DispSVGPathSegArcRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegArcRel_GetTypeInfo(DispSVGPathSegArcRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegClosePath_QueryInterface(DispSVGPathSegClosePath* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegClosePath_AddRef(DispSVGPathSegClosePath* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegClosePath_Release(DispSVGPathSegClosePath* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegClosePath_GetTypeInfoCount(DispSVGPathSegClosePath* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegClosePath_GetTypeInfo(DispSVGPathSegClosePath* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegMovetoAbs_QueryInterface(DispSVGPathSegMovetoAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegMovetoAbs_AddRef(DispSVGPathSegMovetoAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegMovetoAbs_Release(DispSVGPathSegMovetoAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegMovetoAbs_GetTypeInfoCount(DispSVGPathSegMovetoAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegMovetoAbs_GetTypeInfo(DispSVGPathSegMovetoAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegMovetoRel_QueryInterface(DispSVGPathSegMovetoRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegMovetoRel_AddRef(DispSVGPathSegMovetoRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegMovetoRel_Release(DispSVGPathSegMovetoRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegMovetoRel_GetTypeInfoCount(DispSVGPathSegMovetoRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegMovetoRel_GetTypeInfo(DispSVGPathSegMovetoRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegLinetoAbs_QueryInterface(DispSVGPathSegLinetoAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegLinetoAbs_AddRef(DispSVGPathSegLinetoAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegLinetoAbs_Release(DispSVGPathSegLinetoAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegLinetoAbs_GetTypeInfoCount(DispSVGPathSegLinetoAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegLinetoAbs_GetTypeInfo(DispSVGPathSegLinetoAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegLinetoRel_QueryInterface(DispSVGPathSegLinetoRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegLinetoRel_AddRef(DispSVGPathSegLinetoRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegLinetoRel_Release(DispSVGPathSegLinetoRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegLinetoRel_GetTypeInfoCount(DispSVGPathSegLinetoRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegLinetoRel_GetTypeInfo(DispSVGPathSegLinetoRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegCurvetoCubicAbs_QueryInterface(DispSVGPathSegCurvetoCubicAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoCubicAbs_AddRef(DispSVGPathSegCurvetoCubicAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoCubicAbs_Release(DispSVGPathSegCurvetoCubicAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoCubicAbs_GetTypeInfoCount(DispSVGPathSegCurvetoCubicAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoCubicAbs_GetTypeInfo(DispSVGPathSegCurvetoCubicAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegCurvetoCubicRel_QueryInterface(DispSVGPathSegCurvetoCubicRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoCubicRel_AddRef(DispSVGPathSegCurvetoCubicRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoCubicRel_Release(DispSVGPathSegCurvetoCubicRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoCubicRel_GetTypeInfoCount(DispSVGPathSegCurvetoCubicRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoCubicRel_GetTypeInfo(DispSVGPathSegCurvetoCubicRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegCurvetoCubicSmoothAbs_QueryInterface(DispSVGPathSegCurvetoCubicSmoothAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoCubicSmoothAbs_AddRef(DispSVGPathSegCurvetoCubicSmoothAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoCubicSmoothAbs_Release(DispSVGPathSegCurvetoCubicSmoothAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoCubicSmoothAbs_GetTypeInfoCount(DispSVGPathSegCurvetoCubicSmoothAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoCubicSmoothAbs_GetTypeInfo(DispSVGPathSegCurvetoCubicSmoothAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegCurvetoCubicSmoothRel_QueryInterface(DispSVGPathSegCurvetoCubicSmoothRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoCubicSmoothRel_AddRef(DispSVGPathSegCurvetoCubicSmoothRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoCubicSmoothRel_Release(DispSVGPathSegCurvetoCubicSmoothRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoCubicSmoothRel_GetTypeInfoCount(DispSVGPathSegCurvetoCubicSmoothRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoCubicSmoothRel_GetTypeInfo(DispSVGPathSegCurvetoCubicSmoothRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegCurvetoQuadraticAbs_QueryInterface(DispSVGPathSegCurvetoQuadraticAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoQuadraticAbs_AddRef(DispSVGPathSegCurvetoQuadraticAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoQuadraticAbs_Release(DispSVGPathSegCurvetoQuadraticAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoQuadraticAbs_GetTypeInfoCount(DispSVGPathSegCurvetoQuadraticAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoQuadraticAbs_GetTypeInfo(DispSVGPathSegCurvetoQuadraticAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegCurvetoQuadraticRel_QueryInterface(DispSVGPathSegCurvetoQuadraticRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoQuadraticRel_AddRef(DispSVGPathSegCurvetoQuadraticRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoQuadraticRel_Release(DispSVGPathSegCurvetoQuadraticRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoQuadraticRel_GetTypeInfoCount(DispSVGPathSegCurvetoQuadraticRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoQuadraticRel_GetTypeInfo(DispSVGPathSegCurvetoQuadraticRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegCurvetoQuadraticSmoothAbs_QueryInterface(DispSVGPathSegCurvetoQuadraticSmoothAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoQuadraticSmoothAbs_AddRef(DispSVGPathSegCurvetoQuadraticSmoothAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoQuadraticSmoothAbs_Release(DispSVGPathSegCurvetoQuadraticSmoothAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoQuadraticSmoothAbs_GetTypeInfoCount(DispSVGPathSegCurvetoQuadraticSmoothAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoQuadraticSmoothAbs_GetTypeInfo(DispSVGPathSegCurvetoQuadraticSmoothAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegCurvetoQuadraticSmoothRel_QueryInterface(DispSVGPathSegCurvetoQuadraticSmoothRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoQuadraticSmoothRel_AddRef(DispSVGPathSegCurvetoQuadraticSmoothRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegCurvetoQuadraticSmoothRel_Release(DispSVGPathSegCurvetoQuadraticSmoothRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoQuadraticSmoothRel_GetTypeInfoCount(DispSVGPathSegCurvetoQuadraticSmoothRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegCurvetoQuadraticSmoothRel_GetTypeInfo(DispSVGPathSegCurvetoQuadraticSmoothRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegLinetoHorizontalAbs_QueryInterface(DispSVGPathSegLinetoHorizontalAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegLinetoHorizontalAbs_AddRef(DispSVGPathSegLinetoHorizontalAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegLinetoHorizontalAbs_Release(DispSVGPathSegLinetoHorizontalAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegLinetoHorizontalAbs_GetTypeInfoCount(DispSVGPathSegLinetoHorizontalAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegLinetoHorizontalAbs_GetTypeInfo(DispSVGPathSegLinetoHorizontalAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegLinetoHorizontalRel_QueryInterface(DispSVGPathSegLinetoHorizontalRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegLinetoHorizontalRel_AddRef(DispSVGPathSegLinetoHorizontalRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegLinetoHorizontalRel_Release(DispSVGPathSegLinetoHorizontalRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegLinetoHorizontalRel_GetTypeInfoCount(DispSVGPathSegLinetoHorizontalRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegLinetoHorizontalRel_GetTypeInfo(DispSVGPathSegLinetoHorizontalRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegLinetoVerticalAbs_QueryInterface(DispSVGPathSegLinetoVerticalAbs* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegLinetoVerticalAbs_AddRef(DispSVGPathSegLinetoVerticalAbs* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegLinetoVerticalAbs_Release(DispSVGPathSegLinetoVerticalAbs* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegLinetoVerticalAbs_GetTypeInfoCount(DispSVGPathSegLinetoVerticalAbs* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegLinetoVerticalAbs_GetTypeInfo(DispSVGPathSegLinetoVerticalAbs* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathSegLinetoVerticalRel_QueryInterface(DispSVGPathSegLinetoVerticalRel* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathSegLinetoVerticalRel_AddRef(DispSVGPathSegLinetoVerticalRel* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathSegLinetoVerticalRel_Release(DispSVGPathSegLinetoVerticalRel* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathSegLinetoVerticalRel_GetTypeInfoCount(DispSVGPathSegLinetoVerticalRel* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathSegLinetoVerticalRel_GetTypeInfo(DispSVGPathSegLinetoVerticalRel* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegList_QueryInterface(ISVGPathSegList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathSegList_AddRef(ISVGPathSegList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathSegList_Release(ISVGPathSegList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathSegList_GetTypeInfoCount(ISVGPathSegList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathSegList_GetTypeInfo(ISVGPathSegList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathSegList_put_numberOfItems(ISVGPathSegList* This,LONG v) {
    return This->lpVtbl->put_numberOfItems(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathSegList_get_numberOfItems(ISVGPathSegList* This,LONG *p) {
    return This->lpVtbl->get_numberOfItems(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathSegList_clear(ISVGPathSegList* This) {
    return This->lpVtbl->clear(This);
}
static __WIDL_INLINE HRESULT ISVGPathSegList_initialize(ISVGPathSegList* This,ISVGPathSeg *newItem,ISVGPathSeg **ppResult) {
    return This->lpVtbl->initialize(This,newItem,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPathSegList_getItem(ISVGPathSegList* This,LONG index,ISVGPathSeg **ppResult) {
    return This->lpVtbl->getItem(This,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPathSegList_insertItemBefore(ISVGPathSegList* This,ISVGPathSeg *newItem,LONG index,ISVGPathSeg **ppResult) {
    return This->lpVtbl->insertItemBefore(This,newItem,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPathSegList_replaceItem(ISVGPathSegList* This,ISVGPathSeg *newItem,LONG index,ISVGPathSeg **ppResult) {
    return This->lpVtbl->replaceItem(This,newItem,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPathSegList_removeItem(ISVGPathSegList* This,LONG index,ISVGPathSeg **ppResult) {
    return This->lpVtbl->removeItem(This,index,ppResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPoint_QueryInterface(ISVGPoint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPoint_AddRef(ISVGPoint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPoint_Release(ISVGPoint* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPoint_GetTypeInfoCount(ISVGPoint* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPoint_GetTypeInfo(ISVGPoint* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPoint_put_x(ISVGPoint* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGPoint_get_x(ISVGPoint* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGPoint_put_y(ISVGPoint* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGPoint_get_y(ISVGPoint* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPointList_QueryInterface(ISVGPointList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPointList_AddRef(ISVGPointList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPointList_Release(ISVGPointList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPointList_GetTypeInfoCount(ISVGPointList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPointList_GetTypeInfo(ISVGPointList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPointList_put_numberOfItems(ISVGPointList* This,LONG v) {
    return This->lpVtbl->put_numberOfItems(This,v);
}
static __WIDL_INLINE HRESULT ISVGPointList_get_numberOfItems(ISVGPointList* This,LONG *p) {
    return This->lpVtbl->get_numberOfItems(This,p);
}
static __WIDL_INLINE HRESULT ISVGPointList_clear(ISVGPointList* This) {
    return This->lpVtbl->clear(This);
}
static __WIDL_INLINE HRESULT ISVGPointList_initialize(ISVGPointList* This,ISVGPoint *pNewItem,ISVGPoint **ppResult) {
    return This->lpVtbl->initialize(This,pNewItem,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPointList_getItem(ISVGPointList* This,LONG index,ISVGPoint **ppResult) {
    return This->lpVtbl->getItem(This,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPointList_insertItemBefore(ISVGPointList* This,ISVGPoint *pNewItem,LONG index,ISVGPoint **ppResult) {
    return This->lpVtbl->insertItemBefore(This,pNewItem,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPointList_replaceItem(ISVGPointList* This,ISVGPoint *pNewItem,LONG index,ISVGPoint **ppResult) {
    return This->lpVtbl->replaceItem(This,pNewItem,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPointList_removeItem(ISVGPointList* This,LONG index,ISVGPoint **ppResult) {
    return This->lpVtbl->removeItem(This,index,ppResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGRect_QueryInterface(ISVGRect* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGRect_AddRef(ISVGRect* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGRect_Release(ISVGRect* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGRect_GetTypeInfoCount(ISVGRect* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGRect_GetTypeInfo(ISVGRect* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGRect_put_x(ISVGRect* This,float v) {
    return This->lpVtbl->put_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGRect_get_x(ISVGRect* This,float *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGRect_put_y(ISVGRect* This,float v) {
    return This->lpVtbl->put_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGRect_get_y(ISVGRect* This,float *p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGRect_put_width(ISVGRect* This,float v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT ISVGRect_get_width(ISVGRect* This,float *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT ISVGRect_put_height(ISVGRect* This,float v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGStringList_QueryInterface(ISVGStringList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGStringList_AddRef(ISVGStringList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGStringList_Release(ISVGStringList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGStringList_GetTypeInfoCount(ISVGStringList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGStringList_GetTypeInfo(ISVGStringList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGStringList_put_numberOfItems(ISVGStringList* This,LONG v) {
    return This->lpVtbl->put_numberOfItems(This,v);
}
static __WIDL_INLINE HRESULT ISVGStringList_get_numberOfItems(ISVGStringList* This,LONG *p) {
    return This->lpVtbl->get_numberOfItems(This,p);
}
static __WIDL_INLINE HRESULT ISVGStringList_clear(ISVGStringList* This) {
    return This->lpVtbl->clear(This);
}
static __WIDL_INLINE HRESULT ISVGStringList_initialize(ISVGStringList* This,BSTR newItem,BSTR *ppResult) {
    return This->lpVtbl->initialize(This,newItem,ppResult);
}
static __WIDL_INLINE HRESULT ISVGStringList_getItem(ISVGStringList* This,LONG index,BSTR *ppResult) {
    return This->lpVtbl->getItem(This,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGStringList_insertItemBefore(ISVGStringList* This,BSTR newItem,LONG index,BSTR *ppResult) {
    return This->lpVtbl->insertItemBefore(This,newItem,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGStringList_replaceItem(ISVGStringList* This,BSTR newItem,LONG index,BSTR *ppResult) {
    return This->lpVtbl->replaceItem(This,newItem,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGStringList_removeItem(ISVGStringList* This,LONG index,BSTR *ppResult) {
    return This->lpVtbl->removeItem(This,index,ppResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGViewSpec_QueryInterface(ISVGViewSpec* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGViewSpec_AddRef(ISVGViewSpec* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGViewSpec_Release(ISVGViewSpec* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGViewSpec_GetTypeInfoCount(ISVGViewSpec* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGViewSpec_GetTypeInfo(ISVGViewSpec* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTransform_QueryInterface(ISVGTransform* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGTransform_AddRef(ISVGTransform* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGTransform_Release(ISVGTransform* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGTransform_GetTypeInfoCount(ISVGTransform* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGTransform_GetTypeInfo(ISVGTransform* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTransform_put_type(ISVGTransform* This,short v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE HRESULT ISVGTransform_get_type(ISVGTransform* This,short *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT ISVGTransform_putref_matrix(ISVGTransform* This,ISVGMatrix *v) {
    return This->lpVtbl->putref_matrix(This,v);
}
static __WIDL_INLINE HRESULT ISVGTransform_get_matrix(ISVGTransform* This,ISVGMatrix **p) {
    return This->lpVtbl->get_matrix(This,p);
}
static __WIDL_INLINE HRESULT ISVGTransform_put_angle(ISVGTransform* This,float v) {
    return This->lpVtbl->put_angle(This,v);
}
static __WIDL_INLINE HRESULT ISVGTransform_get_angle(ISVGTransform* This,float *p) {
    return This->lpVtbl->get_angle(This,p);
}
static __WIDL_INLINE HRESULT ISVGTransform_setMatrix(ISVGTransform* This,ISVGMatrix *matrix) {
    return This->lpVtbl->setMatrix(This,matrix);
}
static __WIDL_INLINE HRESULT ISVGTransform_setTranslate(ISVGTransform* This,float tx,float ty) {
    return This->lpVtbl->setTranslate(This,tx,ty);
}
static __WIDL_INLINE HRESULT ISVGTransform_setScale(ISVGTransform* This,float sx,float sy) {
    return This->lpVtbl->setScale(This,sx,sy);
}
static __WIDL_INLINE HRESULT ISVGTransform_setRotate(ISVGTransform* This,float angle,float cx,float cy) {
    return This->lpVtbl->setRotate(This,angle,cx,cy);
}
static __WIDL_INLINE HRESULT ISVGTransform_setSkewX(ISVGTransform* This,float angle) {
    return This->lpVtbl->setSkewX(This,angle);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGSVGElement_QueryInterface(ISVGSVGElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGSVGElement_AddRef(ISVGSVGElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGSVGElement_Release(ISVGSVGElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGSVGElement_GetTypeInfoCount(ISVGSVGElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_GetTypeInfo(ISVGSVGElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGSVGElement_putref_x(ISVGSVGElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_x(ISVGSVGElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_putref_y(ISVGSVGElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_y(ISVGSVGElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_putref_width(ISVGSVGElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_width(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_width(ISVGSVGElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_putref_height(ISVGSVGElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_height(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_height(ISVGSVGElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_put_contentScriptType(ISVGSVGElement* This,BSTR v) {
    return This->lpVtbl->put_contentScriptType(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_contentScriptType(ISVGSVGElement* This,BSTR *p) {
    return This->lpVtbl->get_contentScriptType(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_put_contentStyleType(ISVGSVGElement* This,BSTR v) {
    return This->lpVtbl->put_contentStyleType(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_contentStyleType(ISVGSVGElement* This,BSTR *p) {
    return This->lpVtbl->get_contentStyleType(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_putref_viewport(ISVGSVGElement* This,ISVGRect *v) {
    return This->lpVtbl->putref_viewport(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_viewport(ISVGSVGElement* This,ISVGRect **p) {
    return This->lpVtbl->get_viewport(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_put_pixelUnitToMillimeterX(ISVGSVGElement* This,float v) {
    return This->lpVtbl->put_pixelUnitToMillimeterX(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_pixelUnitToMillimeterX(ISVGSVGElement* This,float *p) {
    return This->lpVtbl->get_pixelUnitToMillimeterX(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_put_pixelUnitToMillimeterY(ISVGSVGElement* This,float v) {
    return This->lpVtbl->put_pixelUnitToMillimeterY(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_pixelUnitToMillimeterY(ISVGSVGElement* This,float *p) {
    return This->lpVtbl->get_pixelUnitToMillimeterY(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_put_screenPixelToMillimeterX(ISVGSVGElement* This,float v) {
    return This->lpVtbl->put_screenPixelToMillimeterX(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_screenPixelToMillimeterX(ISVGSVGElement* This,float *p) {
    return This->lpVtbl->get_screenPixelToMillimeterX(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_put_screenPixelToMillimeterY(ISVGSVGElement* This,float v) {
    return This->lpVtbl->put_screenPixelToMillimeterY(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_screenPixelToMillimeterY(ISVGSVGElement* This,float *p) {
    return This->lpVtbl->get_screenPixelToMillimeterY(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_put_useCurrentView(ISVGSVGElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_useCurrentView(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_useCurrentView(ISVGSVGElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_useCurrentView(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_putref_currentView(ISVGSVGElement* This,ISVGViewSpec *v) {
    return This->lpVtbl->putref_currentView(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_currentView(ISVGSVGElement* This,ISVGViewSpec **p) {
    return This->lpVtbl->get_currentView(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_put_currentScale(ISVGSVGElement* This,float v) {
    return This->lpVtbl->put_currentScale(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_currentScale(ISVGSVGElement* This,float *p) {
    return This->lpVtbl->get_currentScale(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_putref_currentTranslate(ISVGSVGElement* This,ISVGPoint *v) {
    return This->lpVtbl->putref_currentTranslate(This,v);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_get_currentTranslate(ISVGSVGElement* This,ISVGPoint **p) {
    return This->lpVtbl->get_currentTranslate(This,p);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_suspendRedraw(ISVGSVGElement* This,ULONG maxWaitMilliseconds,ULONG *pResult) {
    return This->lpVtbl->suspendRedraw(This,maxWaitMilliseconds,pResult);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_unsuspendRedraw(ISVGSVGElement* This,ULONG suspendHandeID) {
    return This->lpVtbl->unsuspendRedraw(This,suspendHandeID);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_unsuspendRedrawAll(ISVGSVGElement* This) {
    return This->lpVtbl->unsuspendRedrawAll(This);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_forceRedraw(ISVGSVGElement* This) {
    return This->lpVtbl->forceRedraw(This);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_pauseAnimations(ISVGSVGElement* This) {
    return This->lpVtbl->pauseAnimations(This);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_unpauseAnimations(ISVGSVGElement* This) {
    return This->lpVtbl->unpauseAnimations(This);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_animationsPaused(ISVGSVGElement* This,VARIANT_BOOL *pResult) {
    return This->lpVtbl->animationsPaused(This,pResult);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_getCurrentTime(ISVGSVGElement* This,float *pResult) {
    return This->lpVtbl->getCurrentTime(This,pResult);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_setCurrentTime(ISVGSVGElement* This,float seconds) {
    return This->lpVtbl->setCurrentTime(This,seconds);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_getIntersectionList(ISVGSVGElement* This,ISVGRect *rect,ISVGElement *referenceElement,VARIANT *pResult) {
    return This->lpVtbl->getIntersectionList(This,rect,referenceElement,pResult);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_getEnclosureList(ISVGSVGElement* This,ISVGRect *rect,ISVGElement *referenceElement,VARIANT *pResult) {
    return This->lpVtbl->getEnclosureList(This,rect,referenceElement,pResult);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_checkIntersection(ISVGSVGElement* This,ISVGElement *element,ISVGRect *rect,VARIANT_BOOL *pResult) {
    return This->lpVtbl->checkIntersection(This,element,rect,pResult);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_checkEnclosure(ISVGSVGElement* This,ISVGElement *element,ISVGRect *rect,VARIANT_BOOL *pResult) {
    return This->lpVtbl->checkEnclosure(This,element,rect,pResult);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_deselectAll(ISVGSVGElement* This) {
    return This->lpVtbl->deselectAll(This);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_createSVGNumber(ISVGSVGElement* This,ISVGNumber **pResult) {
    return This->lpVtbl->createSVGNumber(This,pResult);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_createSVGLength(ISVGSVGElement* This,ISVGLength **pResult) {
    return This->lpVtbl->createSVGLength(This,pResult);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_createSVGAngle(ISVGSVGElement* This,ISVGAngle **pResult) {
    return This->lpVtbl->createSVGAngle(This,pResult);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_createSVGPoint(ISVGSVGElement* This,ISVGPoint **pResult) {
    return This->lpVtbl->createSVGPoint(This,pResult);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_createSVGMatrix(ISVGSVGElement* This,ISVGMatrix **pResult) {
    return This->lpVtbl->createSVGMatrix(This,pResult);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_createSVGRect(ISVGSVGElement* This,ISVGRect **pResult) {
    return This->lpVtbl->createSVGRect(This,pResult);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_createSVGTransform(ISVGSVGElement* This,ISVGTransform **pResult) {
    return This->lpVtbl->createSVGTransform(This,pResult);
}
static __WIDL_INLINE HRESULT ISVGSVGElement_createSVGTransformFromMatrix(ISVGSVGElement* This,ISVGMatrix *matrix,ISVGTransform **pResult) {
    return This->lpVtbl->createSVGTransformFromMatrix(This,matrix,pResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGSVGElement_QueryInterface(DispSVGSVGElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGSVGElement_AddRef(DispSVGSVGElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGSVGElement_Release(DispSVGSVGElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGSVGElement_GetTypeInfoCount(DispSVGSVGElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGSVGElement_GetTypeInfo(DispSVGSVGElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGUseElement_QueryInterface(ISVGUseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGUseElement_AddRef(ISVGUseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGUseElement_Release(ISVGUseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGUseElement_GetTypeInfoCount(ISVGUseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGUseElement_GetTypeInfo(ISVGUseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGUseElement_putref_x(ISVGUseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGUseElement_get_x(ISVGUseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGUseElement_putref_y(ISVGUseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGUseElement_get_y(ISVGUseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGUseElement_putref_width(ISVGUseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_width(This,v);
}
static __WIDL_INLINE HRESULT ISVGUseElement_get_width(ISVGUseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT ISVGUseElement_putref_height(ISVGUseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_height(This,v);
}
static __WIDL_INLINE HRESULT ISVGUseElement_get_height(ISVGUseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT ISVGUseElement_putref_instanceRoot(ISVGUseElement* This,ISVGElementInstance *v) {
    return This->lpVtbl->putref_instanceRoot(This,v);
}
static __WIDL_INLINE HRESULT ISVGUseElement_get_instanceRoot(ISVGUseElement* This,ISVGElementInstance **p) {
    return This->lpVtbl->get_instanceRoot(This,p);
}
static __WIDL_INLINE HRESULT ISVGUseElement_putref_animatedInstanceRoot(ISVGUseElement* This,ISVGElementInstance *v) {
    return This->lpVtbl->putref_animatedInstanceRoot(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGUseElement_QueryInterface(DispSVGUseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGUseElement_AddRef(DispSVGUseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGUseElement_Release(DispSVGUseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGUseElement_GetTypeInfoCount(DispSVGUseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGUseElement_GetTypeInfo(DispSVGUseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_QueryInterface(IHTMLStyleSheetRulesAppliedCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetRulesAppliedCollection_AddRef(IHTMLStyleSheetRulesAppliedCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLStyleSheetRulesAppliedCollection_Release(IHTMLStyleSheetRulesAppliedCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_GetTypeInfoCount(IHTMLStyleSheetRulesAppliedCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_GetTypeInfo(IHTMLStyleSheetRulesAppliedCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_item(IHTMLStyleSheetRulesAppliedCollection* This,LONG index,IHTMLStyleSheetRule **ppHTMLStyleSheetRule) {
    return This->lpVtbl->item(This,index,ppHTMLStyleSheetRule);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_get_length(IHTMLStyleSheetRulesAppliedCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_propertyAppliedBy(IHTMLStyleSheetRulesAppliedCollection* This,BSTR name,IHTMLStyleSheetRule **ppRule) {
    return This->lpVtbl->propertyAppliedBy(This,name,ppRule);
}
static __WIDL_INLINE HRESULT IHTMLStyleSheetRulesAppliedCollection_propertyAppliedTrace(IHTMLStyleSheetRulesAppliedCollection* This,BSTR name,LONG index,IHTMLStyleSheetRule **ppRule) {
    return This->lpVtbl->propertyAppliedTrace(This,name,index,ppRule);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRulesApplied_QueryInterface(IRulesApplied* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRulesApplied_AddRef(IRulesApplied* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRulesApplied_Release(IRulesApplied* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IRulesApplied_GetTypeInfoCount(IRulesApplied* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IRulesApplied_GetTypeInfo(IRulesApplied* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRulesApplied_get_element(IRulesApplied* This,IHTMLElement **p) {
    return This->lpVtbl->get_element(This,p);
}
static __WIDL_INLINE HRESULT IRulesApplied_get_inlineStyles(IRulesApplied* This,IHTMLStyle **p) {
    return This->lpVtbl->get_inlineStyles(This,p);
}
static __WIDL_INLINE HRESULT IRulesApplied_get_appliedRules(IRulesApplied* This,IHTMLStyleSheetRulesAppliedCollection **p) {
    return This->lpVtbl->get_appliedRules(This,p);
}
static __WIDL_INLINE HRESULT IRulesApplied_propertyIsInline(IRulesApplied* This,BSTR name,VARIANT_BOOL *p) {
    return This->lpVtbl->propertyIsInline(This,name,p);
}
static __WIDL_INLINE HRESULT IRulesApplied_propertyIsInheritable(IRulesApplied* This,BSTR name,VARIANT_BOOL *p) {
    return This->lpVtbl->propertyIsInheritable(This,name,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRulesAppliedCollection_QueryInterface(IRulesAppliedCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRulesAppliedCollection_AddRef(IRulesAppliedCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRulesAppliedCollection_Release(IRulesAppliedCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IRulesAppliedCollection_GetTypeInfoCount(IRulesAppliedCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IRulesAppliedCollection_GetTypeInfo(IRulesAppliedCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRulesAppliedCollection_item(IRulesAppliedCollection* This,LONG index,IRulesApplied **ppRulesApplied) {
    return This->lpVtbl->item(This,index,ppRulesApplied);
}
static __WIDL_INLINE HRESULT IRulesAppliedCollection_get_length(IRulesAppliedCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IRulesAppliedCollection_get_element(IRulesAppliedCollection* This,IHTMLElement **p) {
    return This->lpVtbl->get_element(This,p);
}
static __WIDL_INLINE HRESULT IRulesAppliedCollection_propertyInheritedFrom(IRulesAppliedCollection* This,BSTR name,IRulesApplied **ppRulesApplied) {
    return This->lpVtbl->propertyInheritedFrom(This,name,ppRulesApplied);
}
static __WIDL_INLINE HRESULT IRulesAppliedCollection_get_propertyCount(IRulesAppliedCollection* This,LONG *p) {
    return This->lpVtbl->get_propertyCount(This,p);
}
static __WIDL_INLINE HRESULT IRulesAppliedCollection_property(IRulesAppliedCollection* This,LONG index,BSTR *pbstrProperty) {
    return This->lpVtbl->property(This,index,pbstrProperty);
}
static __WIDL_INLINE HRESULT IRulesAppliedCollection_propertyInheritedTrace(IRulesAppliedCollection* This,BSTR name,LONG index,IRulesApplied **ppRulesApplied) {
    return This->lpVtbl->propertyInheritedTrace(This,name,index,ppRulesApplied);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLStyleSheetRulesAppliedCollection_QueryInterface(DispHTMLStyleSheetRulesAppliedCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLStyleSheetRulesAppliedCollection_AddRef(DispHTMLStyleSheetRulesAppliedCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLStyleSheetRulesAppliedCollection_Release(DispHTMLStyleSheetRulesAppliedCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLStyleSheetRulesAppliedCollection_GetTypeInfoCount(DispHTMLStyleSheetRulesAppliedCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLStyleSheetRulesAppliedCollection_GetTypeInfo(DispHTMLStyleSheetRulesAppliedCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispRulesApplied_QueryInterface(DispRulesApplied* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispRulesApplied_AddRef(DispRulesApplied* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispRulesApplied_Release(DispRulesApplied* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispRulesApplied_GetTypeInfoCount(DispRulesApplied* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispRulesApplied_GetTypeInfo(DispRulesApplied* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispRulesAppliedCollection_QueryInterface(DispRulesAppliedCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispRulesAppliedCollection_AddRef(DispRulesAppliedCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispRulesAppliedCollection_Release(DispRulesAppliedCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispRulesAppliedCollection_GetTypeInfoCount(DispRulesAppliedCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispRulesAppliedCollection_GetTypeInfo(DispRulesAppliedCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLW3CComputedStyle_QueryInterface(DispHTMLW3CComputedStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLW3CComputedStyle_AddRef(DispHTMLW3CComputedStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLW3CComputedStyle_Release(DispHTMLW3CComputedStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLW3CComputedStyle_GetTypeInfoCount(DispHTMLW3CComputedStyle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLW3CComputedStyle_GetTypeInfo(DispHTMLW3CComputedStyle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTransformList_QueryInterface(ISVGTransformList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGTransformList_AddRef(ISVGTransformList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGTransformList_Release(ISVGTransformList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGTransformList_GetTypeInfoCount(ISVGTransformList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGTransformList_GetTypeInfo(ISVGTransformList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTransformList_put_numberOfItems(ISVGTransformList* This,LONG v) {
    return This->lpVtbl->put_numberOfItems(This,v);
}
static __WIDL_INLINE HRESULT ISVGTransformList_get_numberOfItems(ISVGTransformList* This,LONG *p) {
    return This->lpVtbl->get_numberOfItems(This,p);
}
static __WIDL_INLINE HRESULT ISVGTransformList_clear(ISVGTransformList* This) {
    return This->lpVtbl->clear(This);
}
static __WIDL_INLINE HRESULT ISVGTransformList_initialize(ISVGTransformList* This,ISVGTransform *newItem,ISVGTransform **ppResult) {
    return This->lpVtbl->initialize(This,newItem,ppResult);
}
static __WIDL_INLINE HRESULT ISVGTransformList_getItem(ISVGTransformList* This,LONG index,ISVGTransform **ppResult) {
    return This->lpVtbl->getItem(This,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGTransformList_insertItemBefore(ISVGTransformList* This,ISVGTransform *newItem,LONG index,ISVGTransform **ppResult) {
    return This->lpVtbl->insertItemBefore(This,newItem,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGTransformList_replaceItem(ISVGTransformList* This,ISVGTransform *newItem,LONG index,ISVGTransform **ppResult) {
    return This->lpVtbl->replaceItem(This,newItem,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGTransformList_removeItem(ISVGTransformList* This,LONG index,ISVGTransform **ppResult) {
    return This->lpVtbl->removeItem(This,index,ppResult);
}
static __WIDL_INLINE HRESULT ISVGTransformList_appendItem(ISVGTransformList* This,ISVGTransform *newItem,ISVGTransform **ppResult) {
    return This->lpVtbl->appendItem(This,newItem,ppResult);
}
static __WIDL_INLINE HRESULT ISVGTransformList_createSVGTransformFromMatrix(ISVGTransformList* This,ISVGMatrix *newItem,ISVGTransform **ppResult) {
    return This->lpVtbl->createSVGTransformFromMatrix(This,newItem,ppResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedPoints_QueryInterface(ISVGAnimatedPoints* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAnimatedPoints_AddRef(ISVGAnimatedPoints* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAnimatedPoints_Release(ISVGAnimatedPoints* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAnimatedPoints_GetTypeInfoCount(ISVGAnimatedPoints* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAnimatedPoints_GetTypeInfo(ISVGAnimatedPoints* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedPoints_putref_points(ISVGAnimatedPoints* This,ISVGPointList *v) {
    return This->lpVtbl->putref_points(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedPoints_get_points(ISVGAnimatedPoints* This,ISVGPointList **p) {
    return This->lpVtbl->get_points(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedPoints_putref_animatedPoints(ISVGAnimatedPoints* This,ISVGPointList *v) {
    return This->lpVtbl->putref_animatedPoints(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGCircleElement_QueryInterface(ISVGCircleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGCircleElement_AddRef(ISVGCircleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGCircleElement_Release(ISVGCircleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGCircleElement_GetTypeInfoCount(ISVGCircleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGCircleElement_GetTypeInfo(ISVGCircleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGCircleElement_putref_cx(ISVGCircleElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_cx(This,v);
}
static __WIDL_INLINE HRESULT ISVGCircleElement_get_cx(ISVGCircleElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_cx(This,p);
}
static __WIDL_INLINE HRESULT ISVGCircleElement_putref_cy(ISVGCircleElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_cy(This,v);
}
static __WIDL_INLINE HRESULT ISVGCircleElement_get_cy(ISVGCircleElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_cy(This,p);
}
static __WIDL_INLINE HRESULT ISVGCircleElement_putref_r(ISVGCircleElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_r(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGEllipseElement_QueryInterface(ISVGEllipseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGEllipseElement_AddRef(ISVGEllipseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGEllipseElement_Release(ISVGEllipseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGEllipseElement_GetTypeInfoCount(ISVGEllipseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGEllipseElement_GetTypeInfo(ISVGEllipseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGEllipseElement_putref_cx(ISVGEllipseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_cx(This,v);
}
static __WIDL_INLINE HRESULT ISVGEllipseElement_get_cx(ISVGEllipseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_cx(This,p);
}
static __WIDL_INLINE HRESULT ISVGEllipseElement_putref_cy(ISVGEllipseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_cy(This,v);
}
static __WIDL_INLINE HRESULT ISVGEllipseElement_get_cy(ISVGEllipseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_cy(This,p);
}
static __WIDL_INLINE HRESULT ISVGEllipseElement_putref_rx(ISVGEllipseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_rx(This,v);
}
static __WIDL_INLINE HRESULT ISVGEllipseElement_get_rx(ISVGEllipseElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_rx(This,p);
}
static __WIDL_INLINE HRESULT ISVGEllipseElement_putref_ry(ISVGEllipseElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_ry(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGLineElement_QueryInterface(ISVGLineElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGLineElement_AddRef(ISVGLineElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGLineElement_Release(ISVGLineElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGLineElement_GetTypeInfoCount(ISVGLineElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGLineElement_GetTypeInfo(ISVGLineElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGLineElement_putref_x1(ISVGLineElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x1(This,v);
}
static __WIDL_INLINE HRESULT ISVGLineElement_get_x1(ISVGLineElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x1(This,p);
}
static __WIDL_INLINE HRESULT ISVGLineElement_putref_y1(ISVGLineElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y1(This,v);
}
static __WIDL_INLINE HRESULT ISVGLineElement_get_y1(ISVGLineElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y1(This,p);
}
static __WIDL_INLINE HRESULT ISVGLineElement_putref_x2(ISVGLineElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x2(This,v);
}
static __WIDL_INLINE HRESULT ISVGLineElement_get_x2(ISVGLineElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x2(This,p);
}
static __WIDL_INLINE HRESULT ISVGLineElement_putref_y2(ISVGLineElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y2(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGRectElement_QueryInterface(ISVGRectElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGRectElement_AddRef(ISVGRectElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGRectElement_Release(ISVGRectElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGRectElement_GetTypeInfoCount(ISVGRectElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGRectElement_GetTypeInfo(ISVGRectElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGRectElement_putref_x(ISVGRectElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGRectElement_get_x(ISVGRectElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGRectElement_putref_y(ISVGRectElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGRectElement_get_y(ISVGRectElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGRectElement_putref_width(ISVGRectElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_width(This,v);
}
static __WIDL_INLINE HRESULT ISVGRectElement_get_width(ISVGRectElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT ISVGRectElement_putref_height(ISVGRectElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_height(This,v);
}
static __WIDL_INLINE HRESULT ISVGRectElement_get_height(ISVGRectElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT ISVGRectElement_putref_rx(ISVGRectElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_rx(This,v);
}
static __WIDL_INLINE HRESULT ISVGRectElement_get_rx(ISVGRectElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_rx(This,p);
}
static __WIDL_INLINE HRESULT ISVGRectElement_putref_ry(ISVGRectElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_ry(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPolygonElement_QueryInterface(ISVGPolygonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPolygonElement_AddRef(ISVGPolygonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPolygonElement_Release(ISVGPolygonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPolygonElement_GetTypeInfoCount(ISVGPolygonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPolygonElement_GetTypeInfo(ISVGPolygonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPolylineElement_QueryInterface(ISVGPolylineElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPolylineElement_AddRef(ISVGPolylineElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPolylineElement_Release(ISVGPolylineElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPolylineElement_GetTypeInfoCount(ISVGPolylineElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPolylineElement_GetTypeInfo(ISVGPolylineElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGCircleElement_QueryInterface(DispSVGCircleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGCircleElement_AddRef(DispSVGCircleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGCircleElement_Release(DispSVGCircleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGCircleElement_GetTypeInfoCount(DispSVGCircleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGCircleElement_GetTypeInfo(DispSVGCircleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGEllipseElement_QueryInterface(DispSVGEllipseElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGEllipseElement_AddRef(DispSVGEllipseElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGEllipseElement_Release(DispSVGEllipseElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGEllipseElement_GetTypeInfoCount(DispSVGEllipseElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGEllipseElement_GetTypeInfo(DispSVGEllipseElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGLineElement_QueryInterface(DispSVGLineElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGLineElement_AddRef(DispSVGLineElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGLineElement_Release(DispSVGLineElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGLineElement_GetTypeInfoCount(DispSVGLineElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGLineElement_GetTypeInfo(DispSVGLineElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGRectElement_QueryInterface(DispSVGRectElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGRectElement_AddRef(DispSVGRectElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGRectElement_Release(DispSVGRectElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGRectElement_GetTypeInfoCount(DispSVGRectElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGRectElement_GetTypeInfo(DispSVGRectElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPolygonElement_QueryInterface(DispSVGPolygonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPolygonElement_AddRef(DispSVGPolygonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPolygonElement_Release(DispSVGPolygonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPolygonElement_GetTypeInfoCount(DispSVGPolygonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPolygonElement_GetTypeInfo(DispSVGPolygonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPolylineElement_QueryInterface(DispSVGPolylineElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPolylineElement_AddRef(DispSVGPolylineElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPolylineElement_Release(DispSVGPolylineElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPolylineElement_GetTypeInfoCount(DispSVGPolylineElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPolylineElement_GetTypeInfo(DispSVGPolylineElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGGElement_QueryInterface(ISVGGElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGGElement_AddRef(ISVGGElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGGElement_Release(ISVGGElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGGElement_GetTypeInfoCount(ISVGGElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGGElement_GetTypeInfo(ISVGGElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGGElement_QueryInterface(DispSVGGElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGGElement_AddRef(DispSVGGElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGGElement_Release(DispSVGGElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGGElement_GetTypeInfoCount(DispSVGGElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGGElement_GetTypeInfo(DispSVGGElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGSymbolElement_QueryInterface(ISVGSymbolElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGSymbolElement_AddRef(ISVGSymbolElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGSymbolElement_Release(ISVGSymbolElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGSymbolElement_GetTypeInfoCount(ISVGSymbolElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGSymbolElement_GetTypeInfo(ISVGSymbolElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGSymbolElement_QueryInterface(DispSVGSymbolElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGSymbolElement_AddRef(DispSVGSymbolElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGSymbolElement_Release(DispSVGSymbolElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGSymbolElement_GetTypeInfoCount(DispSVGSymbolElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGSymbolElement_GetTypeInfo(DispSVGSymbolElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGDefsElement_QueryInterface(ISVGDefsElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGDefsElement_AddRef(ISVGDefsElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGDefsElement_Release(ISVGDefsElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGDefsElement_GetTypeInfoCount(ISVGDefsElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGDefsElement_GetTypeInfo(ISVGDefsElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGDefsElement_QueryInterface(DispSVGDefsElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGDefsElement_AddRef(DispSVGDefsElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGDefsElement_Release(DispSVGDefsElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGDefsElement_GetTypeInfoCount(DispSVGDefsElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGDefsElement_GetTypeInfo(DispSVGDefsElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedPathData_QueryInterface(ISVGAnimatedPathData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAnimatedPathData_AddRef(ISVGAnimatedPathData* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAnimatedPathData_Release(ISVGAnimatedPathData* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAnimatedPathData_GetTypeInfoCount(ISVGAnimatedPathData* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAnimatedPathData_GetTypeInfo(ISVGAnimatedPathData* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedPathData_putref_pathSegList(ISVGAnimatedPathData* This,ISVGPathSegList *v) {
    return This->lpVtbl->putref_pathSegList(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedPathData_get_pathSegList(ISVGAnimatedPathData* This,ISVGPathSegList **p) {
    return This->lpVtbl->get_pathSegList(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedPathData_putref_normalizedPathSegList(ISVGAnimatedPathData* This,ISVGPathSegList *v) {
    return This->lpVtbl->putref_normalizedPathSegList(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedPathData_get_normalizedPathSegList(ISVGAnimatedPathData* This,ISVGPathSegList **p) {
    return This->lpVtbl->get_normalizedPathSegList(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedPathData_putref_animatedPathSegList(ISVGAnimatedPathData* This,ISVGPathSegList *v) {
    return This->lpVtbl->putref_animatedPathSegList(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedPathData_get_animatedPathSegList(ISVGAnimatedPathData* This,ISVGPathSegList **p) {
    return This->lpVtbl->get_animatedPathSegList(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedPathData_putref_animatedNormalizedPathSegList(ISVGAnimatedPathData* This,ISVGPathSegList *v) {
    return This->lpVtbl->putref_animatedNormalizedPathSegList(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathElement_QueryInterface(ISVGPathElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPathElement_AddRef(ISVGPathElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPathElement_Release(ISVGPathElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPathElement_GetTypeInfoCount(ISVGPathElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPathElement_GetTypeInfo(ISVGPathElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathElement_putref_pathLength(ISVGPathElement* This,ISVGAnimatedNumber *v) {
    return This->lpVtbl->putref_pathLength(This,v);
}
static __WIDL_INLINE HRESULT ISVGPathElement_get_pathLength(ISVGPathElement* This,ISVGAnimatedNumber **p) {
    return This->lpVtbl->get_pathLength(This,p);
}
static __WIDL_INLINE HRESULT ISVGPathElement_getTotalLength(ISVGPathElement* This,float *pfltResult) {
    return This->lpVtbl->getTotalLength(This,pfltResult);
}
static __WIDL_INLINE HRESULT ISVGPathElement_getPointAtLength(ISVGPathElement* This,float fltdistance,ISVGPoint **ppPointResult) {
    return This->lpVtbl->getPointAtLength(This,fltdistance,ppPointResult);
}
static __WIDL_INLINE HRESULT ISVGPathElement_getPathSegAtLength(ISVGPathElement* This,float fltdistance,LONG *plResult) {
    return This->lpVtbl->getPathSegAtLength(This,fltdistance,plResult);
}
static __WIDL_INLINE HRESULT ISVGPathElement_createSVGPathSegClosePath(ISVGPathElement* This,ISVGPathSegClosePath **ppResult) {
    return This->lpVtbl->createSVGPathSegClosePath(This,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPathElement_createSVGPathSegMovetoAbs(ISVGPathElement* This,float x,float y,ISVGPathSegMovetoAbs **ppResult) {
    return This->lpVtbl->createSVGPathSegMovetoAbs(This,x,y,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPathElement_createSVGPathSegMovetoRel(ISVGPathElement* This,float x,float y,ISVGPathSegMovetoRel **ppResult) {
    return This->lpVtbl->createSVGPathSegMovetoRel(This,x,y,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPathElement_createSVGPathSegLinetoAbs(ISVGPathElement* This,float x,float y,ISVGPathSegLinetoAbs **ppResult) {
    return This->lpVtbl->createSVGPathSegLinetoAbs(This,x,y,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPathElement_createSVGPathSegLinetoRel(ISVGPathElement* This,float x,float y,ISVGPathSegLinetoRel **ppResult) {
    return This->lpVtbl->createSVGPathSegLinetoRel(This,x,y,ppResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathElement_createSVGPathSegLinetoHorizontalAbs(ISVGPathElement* This,float x,ISVGPathSegLinetoHorizontalAbs **ppResult) {
    return This->lpVtbl->createSVGPathSegLinetoHorizontalAbs(This,x,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPathElement_createSVGPathSegLinetoHorizontalRel(ISVGPathElement* This,float x,ISVGPathSegLinetoHorizontalRel **ppResult) {
    return This->lpVtbl->createSVGPathSegLinetoHorizontalRel(This,x,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPathElement_createSVGPathSegLinetoVerticalAbs(ISVGPathElement* This,float y,ISVGPathSegLinetoVerticalAbs **ppResult) {
    return This->lpVtbl->createSVGPathSegLinetoVerticalAbs(This,y,ppResult);
}
static __WIDL_INLINE HRESULT ISVGPathElement_createSVGPathSegLinetoVerticalRel(ISVGPathElement* This,float y,ISVGPathSegLinetoVerticalRel **ppResult) {
    return This->lpVtbl->createSVGPathSegLinetoVerticalRel(This,y,ppResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs(ISVGPathElement* This,float x,float y,ISVGPathSegCurvetoQuadraticSmoothAbs **ppResult) {
    return This->lpVtbl->createSVGPathSegCurvetoQuadraticSmoothAbs(This,x,y,ppResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGPathElement_QueryInterface(DispSVGPathElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGPathElement_AddRef(DispSVGPathElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGPathElement_Release(DispSVGPathElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGPathElement_GetTypeInfoCount(DispSVGPathElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGPathElement_GetTypeInfo(DispSVGPathElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPreserveAspectRatio_QueryInterface(ISVGPreserveAspectRatio* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGPreserveAspectRatio_AddRef(ISVGPreserveAspectRatio* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGPreserveAspectRatio_Release(ISVGPreserveAspectRatio* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGPreserveAspectRatio_GetTypeInfoCount(ISVGPreserveAspectRatio* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGPreserveAspectRatio_GetTypeInfo(ISVGPreserveAspectRatio* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGPreserveAspectRatio_put_align(ISVGPreserveAspectRatio* This,short v) {
    return This->lpVtbl->put_align(This,v);
}
static __WIDL_INLINE HRESULT ISVGPreserveAspectRatio_get_align(ISVGPreserveAspectRatio* This,short *p) {
    return This->lpVtbl->get_align(This,p);
}
static __WIDL_INLINE HRESULT ISVGPreserveAspectRatio_put_meetOrSlice(ISVGPreserveAspectRatio* This,short v) {
    return This->lpVtbl->put_meetOrSlice(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTextElement_QueryInterface(ISVGTextElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGTextElement_AddRef(ISVGTextElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGTextElement_Release(ISVGTextElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGTextElement_GetTypeInfoCount(ISVGTextElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGTextElement_GetTypeInfo(ISVGTextElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGTextElement_QueryInterface(DispSVGTextElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGTextElement_AddRef(DispSVGTextElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGTextElement_Release(DispSVGTextElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGTextElement_GetTypeInfoCount(DispSVGTextElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGTextElement_GetTypeInfo(DispSVGTextElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedPreserveAspectRatio_QueryInterface(ISVGAnimatedPreserveAspectRatio* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAnimatedPreserveAspectRatio_AddRef(ISVGAnimatedPreserveAspectRatio* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAnimatedPreserveAspectRatio_Release(ISVGAnimatedPreserveAspectRatio* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAnimatedPreserveAspectRatio_GetTypeInfoCount(ISVGAnimatedPreserveAspectRatio* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAnimatedPreserveAspectRatio_GetTypeInfo(ISVGAnimatedPreserveAspectRatio* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAnimatedPreserveAspectRatio_putref_baseVal(ISVGAnimatedPreserveAspectRatio* This,ISVGPreserveAspectRatio *v) {
    return This->lpVtbl->putref_baseVal(This,v);
}
static __WIDL_INLINE HRESULT ISVGAnimatedPreserveAspectRatio_get_baseVal(ISVGAnimatedPreserveAspectRatio* This,ISVGPreserveAspectRatio **p) {
    return This->lpVtbl->get_baseVal(This,p);
}
static __WIDL_INLINE HRESULT ISVGAnimatedPreserveAspectRatio_putref_animVal(ISVGAnimatedPreserveAspectRatio* This,ISVGPreserveAspectRatio *v) {
    return This->lpVtbl->putref_animVal(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGImageElement_QueryInterface(ISVGImageElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGImageElement_AddRef(ISVGImageElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGImageElement_Release(ISVGImageElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGImageElement_GetTypeInfoCount(ISVGImageElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGImageElement_GetTypeInfo(ISVGImageElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGImageElement_putref_x(ISVGImageElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGImageElement_get_x(ISVGImageElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGImageElement_putref_y(ISVGImageElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGImageElement_get_y(ISVGImageElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGImageElement_putref_width(ISVGImageElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_width(This,v);
}
static __WIDL_INLINE HRESULT ISVGImageElement_get_width(ISVGImageElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT ISVGImageElement_putref_height(ISVGImageElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_height(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGImageElement_QueryInterface(DispSVGImageElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGImageElement_AddRef(DispSVGImageElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGImageElement_Release(DispSVGImageElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGImageElement_GetTypeInfoCount(DispSVGImageElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGImageElement_GetTypeInfo(DispSVGImageElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGStopElement_QueryInterface(ISVGStopElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGStopElement_AddRef(ISVGStopElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGStopElement_Release(ISVGStopElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGStopElement_GetTypeInfoCount(ISVGStopElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGStopElement_GetTypeInfo(ISVGStopElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGStopElement_putref_offset(ISVGStopElement* This,ISVGAnimatedNumber *v) {
    return This->lpVtbl->putref_offset(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGStopElement_QueryInterface(DispSVGStopElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGStopElement_AddRef(DispSVGStopElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGStopElement_Release(DispSVGStopElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGStopElement_GetTypeInfoCount(DispSVGStopElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGStopElement_GetTypeInfo(DispSVGStopElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGGradientElement_QueryInterface(ISVGGradientElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGGradientElement_AddRef(ISVGGradientElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGGradientElement_Release(ISVGGradientElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGGradientElement_GetTypeInfoCount(ISVGGradientElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGGradientElement_GetTypeInfo(ISVGGradientElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGGradientElement_putref_gradientUnits(ISVGGradientElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_gradientUnits(This,v);
}
static __WIDL_INLINE HRESULT ISVGGradientElement_get_gradientUnits(ISVGGradientElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_gradientUnits(This,p);
}
static __WIDL_INLINE HRESULT ISVGGradientElement_putref_gradientTransform(ISVGGradientElement* This,ISVGAnimatedTransformList *v) {
    return This->lpVtbl->putref_gradientTransform(This,v);
}
static __WIDL_INLINE HRESULT ISVGGradientElement_get_gradientTransform(ISVGGradientElement* This,ISVGAnimatedTransformList **p) {
    return This->lpVtbl->get_gradientTransform(This,p);
}
static __WIDL_INLINE HRESULT ISVGGradientElement_putref_spreadMethod(ISVGGradientElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_spreadMethod(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGGradientElement_QueryInterface(DispSVGGradientElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGGradientElement_AddRef(DispSVGGradientElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGGradientElement_Release(DispSVGGradientElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGGradientElement_GetTypeInfoCount(DispSVGGradientElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGGradientElement_GetTypeInfo(DispSVGGradientElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGLinearGradientElement_QueryInterface(ISVGLinearGradientElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGLinearGradientElement_AddRef(ISVGLinearGradientElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGLinearGradientElement_Release(ISVGLinearGradientElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGLinearGradientElement_GetTypeInfoCount(ISVGLinearGradientElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGLinearGradientElement_GetTypeInfo(ISVGLinearGradientElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGLinearGradientElement_putref_x1(ISVGLinearGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x1(This,v);
}
static __WIDL_INLINE HRESULT ISVGLinearGradientElement_get_x1(ISVGLinearGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x1(This,p);
}
static __WIDL_INLINE HRESULT ISVGLinearGradientElement_putref_y1(ISVGLinearGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y1(This,v);
}
static __WIDL_INLINE HRESULT ISVGLinearGradientElement_get_y1(ISVGLinearGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y1(This,p);
}
static __WIDL_INLINE HRESULT ISVGLinearGradientElement_putref_x2(ISVGLinearGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x2(This,v);
}
static __WIDL_INLINE HRESULT ISVGLinearGradientElement_get_x2(ISVGLinearGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x2(This,p);
}
static __WIDL_INLINE HRESULT ISVGLinearGradientElement_putref_y2(ISVGLinearGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y2(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGLinearGradientElement_QueryInterface(DispSVGLinearGradientElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGLinearGradientElement_AddRef(DispSVGLinearGradientElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGLinearGradientElement_Release(DispSVGLinearGradientElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGLinearGradientElement_GetTypeInfoCount(DispSVGLinearGradientElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGLinearGradientElement_GetTypeInfo(DispSVGLinearGradientElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGRadialGradientElement_QueryInterface(ISVGRadialGradientElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGRadialGradientElement_AddRef(ISVGRadialGradientElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGRadialGradientElement_Release(ISVGRadialGradientElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGRadialGradientElement_GetTypeInfoCount(ISVGRadialGradientElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGRadialGradientElement_GetTypeInfo(ISVGRadialGradientElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGRadialGradientElement_putref_cx(ISVGRadialGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_cx(This,v);
}
static __WIDL_INLINE HRESULT ISVGRadialGradientElement_get_cx(ISVGRadialGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_cx(This,p);
}
static __WIDL_INLINE HRESULT ISVGRadialGradientElement_putref_cy(ISVGRadialGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_cy(This,v);
}
static __WIDL_INLINE HRESULT ISVGRadialGradientElement_get_cy(ISVGRadialGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_cy(This,p);
}
static __WIDL_INLINE HRESULT ISVGRadialGradientElement_putref_r(ISVGRadialGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_r(This,v);
}
static __WIDL_INLINE HRESULT ISVGRadialGradientElement_get_r(ISVGRadialGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_r(This,p);
}
static __WIDL_INLINE HRESULT ISVGRadialGradientElement_putref_fx(ISVGRadialGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_fx(This,v);
}
static __WIDL_INLINE HRESULT ISVGRadialGradientElement_get_fx(ISVGRadialGradientElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_fx(This,p);
}
static __WIDL_INLINE HRESULT ISVGRadialGradientElement_putref_fy(ISVGRadialGradientElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_fy(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGRadialGradientElement_QueryInterface(DispSVGRadialGradientElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGRadialGradientElement_AddRef(DispSVGRadialGradientElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGRadialGradientElement_Release(DispSVGRadialGradientElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGRadialGradientElement_GetTypeInfoCount(DispSVGRadialGradientElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGRadialGradientElement_GetTypeInfo(DispSVGRadialGradientElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGMaskElement_QueryInterface(ISVGMaskElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGMaskElement_AddRef(ISVGMaskElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGMaskElement_Release(ISVGMaskElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGMaskElement_GetTypeInfoCount(ISVGMaskElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGMaskElement_GetTypeInfo(ISVGMaskElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGMaskElement_putref_maskUnits(ISVGMaskElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_maskUnits(This,v);
}
static __WIDL_INLINE HRESULT ISVGMaskElement_get_maskUnits(ISVGMaskElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_maskUnits(This,p);
}
static __WIDL_INLINE HRESULT ISVGMaskElement_putref_maskContentUnits(ISVGMaskElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_maskContentUnits(This,v);
}
static __WIDL_INLINE HRESULT ISVGMaskElement_get_maskContentUnits(ISVGMaskElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_maskContentUnits(This,p);
}
static __WIDL_INLINE HRESULT ISVGMaskElement_putref_x(ISVGMaskElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGMaskElement_get_x(ISVGMaskElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGMaskElement_putref_y(ISVGMaskElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGMaskElement_get_y(ISVGMaskElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGMaskElement_putref_width(ISVGMaskElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_width(This,v);
}
static __WIDL_INLINE HRESULT ISVGMaskElement_get_width(ISVGMaskElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT ISVGMaskElement_putref_height(ISVGMaskElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_height(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGMaskElement_QueryInterface(DispSVGMaskElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGMaskElement_AddRef(DispSVGMaskElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGMaskElement_Release(DispSVGMaskElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGMaskElement_GetTypeInfoCount(DispSVGMaskElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGMaskElement_GetTypeInfo(DispSVGMaskElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGMarkerElement_QueryInterface(ISVGMarkerElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGMarkerElement_AddRef(ISVGMarkerElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGMarkerElement_Release(ISVGMarkerElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGMarkerElement_GetTypeInfoCount(ISVGMarkerElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_GetTypeInfo(ISVGMarkerElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGMarkerElement_putref_refX(ISVGMarkerElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_refX(This,v);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_get_refX(ISVGMarkerElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_refX(This,p);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_putref_refY(ISVGMarkerElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_refY(This,v);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_get_refY(ISVGMarkerElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_refY(This,p);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_putref_markerUnits(ISVGMarkerElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_markerUnits(This,v);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_get_markerUnits(ISVGMarkerElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_markerUnits(This,p);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_putref_markerWidth(ISVGMarkerElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_markerWidth(This,v);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_get_markerWidth(ISVGMarkerElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_markerWidth(This,p);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_putref_markerHeight(ISVGMarkerElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_markerHeight(This,v);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_get_markerHeight(ISVGMarkerElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_markerHeight(This,p);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_putref_orientType(ISVGMarkerElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_orientType(This,v);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_get_orientType(ISVGMarkerElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_orientType(This,p);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_putref_orientAngle(ISVGMarkerElement* This,ISVGAnimatedAngle *v) {
    return This->lpVtbl->putref_orientAngle(This,v);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_get_orientAngle(ISVGMarkerElement* This,ISVGAnimatedAngle **p) {
    return This->lpVtbl->get_orientAngle(This,p);
}
static __WIDL_INLINE HRESULT ISVGMarkerElement_setOrientToAuto(ISVGMarkerElement* This) {
    return This->lpVtbl->setOrientToAuto(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGMarkerElement_QueryInterface(DispSVGMarkerElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGMarkerElement_AddRef(DispSVGMarkerElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGMarkerElement_Release(DispSVGMarkerElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGMarkerElement_GetTypeInfoCount(DispSVGMarkerElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGMarkerElement_GetTypeInfo(DispSVGMarkerElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGZoomEvent_QueryInterface(ISVGZoomEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGZoomEvent_AddRef(ISVGZoomEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGZoomEvent_Release(ISVGZoomEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGZoomEvent_GetTypeInfoCount(ISVGZoomEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGZoomEvent_GetTypeInfo(ISVGZoomEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGZoomEvent_get_zoomRectScreen(ISVGZoomEvent* This,ISVGRect **p) {
    return This->lpVtbl->get_zoomRectScreen(This,p);
}
static __WIDL_INLINE HRESULT ISVGZoomEvent_get_previousScale(ISVGZoomEvent* This,float *p) {
    return This->lpVtbl->get_previousScale(This,p);
}
static __WIDL_INLINE HRESULT ISVGZoomEvent_get_previousTranslate(ISVGZoomEvent* This,ISVGPoint **p) {
    return This->lpVtbl->get_previousTranslate(This,p);
}
static __WIDL_INLINE HRESULT ISVGZoomEvent_get_newScale(ISVGZoomEvent* This,float *p) {
    return This->lpVtbl->get_newScale(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGZoomEvent_QueryInterface(DispSVGZoomEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGZoomEvent_AddRef(DispSVGZoomEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGZoomEvent_Release(DispSVGZoomEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGZoomEvent_GetTypeInfoCount(DispSVGZoomEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGZoomEvent_GetTypeInfo(DispSVGZoomEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAElement_QueryInterface(ISVGAElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGAElement_AddRef(ISVGAElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGAElement_Release(ISVGAElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGAElement_GetTypeInfoCount(ISVGAElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGAElement_GetTypeInfo(ISVGAElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGAElement_putref_target(ISVGAElement* This,ISVGAnimatedString *v) {
    return This->lpVtbl->putref_target(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGAElement_QueryInterface(DispSVGAElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGAElement_AddRef(DispSVGAElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGAElement_Release(DispSVGAElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGAElement_GetTypeInfoCount(DispSVGAElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGAElement_GetTypeInfo(DispSVGAElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGViewElement_QueryInterface(ISVGViewElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGViewElement_AddRef(ISVGViewElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGViewElement_Release(ISVGViewElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGViewElement_GetTypeInfoCount(ISVGViewElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGViewElement_GetTypeInfo(ISVGViewElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGViewElement_putref_viewTarget(ISVGViewElement* This,ISVGStringList *v) {
    return This->lpVtbl->putref_viewTarget(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGViewElement_QueryInterface(DispSVGViewElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGViewElement_AddRef(DispSVGViewElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGViewElement_Release(DispSVGViewElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGViewElement_GetTypeInfoCount(DispSVGViewElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGViewElement_GetTypeInfo(DispSVGViewElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMediaError_QueryInterface(IHTMLMediaError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLMediaError_AddRef(IHTMLMediaError* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLMediaError_Release(IHTMLMediaError* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLMediaError_GetTypeInfoCount(IHTMLMediaError* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLMediaError_GetTypeInfo(IHTMLMediaError* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTimeRanges_QueryInterface(IHTMLTimeRanges* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTimeRanges_AddRef(IHTMLTimeRanges* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTimeRanges_Release(IHTMLTimeRanges* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTimeRanges_GetTypeInfoCount(IHTMLTimeRanges* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTimeRanges_GetTypeInfo(IHTMLTimeRanges* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTimeRanges_get_length(IHTMLTimeRanges* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLTimeRanges_start(IHTMLTimeRanges* This,LONG index,float *startTime) {
    return This->lpVtbl->start(This,index,startTime);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTimeRanges2_QueryInterface(IHTMLTimeRanges2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLTimeRanges2_AddRef(IHTMLTimeRanges2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLTimeRanges2_Release(IHTMLTimeRanges2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLTimeRanges2_GetTypeInfoCount(IHTMLTimeRanges2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLTimeRanges2_GetTypeInfo(IHTMLTimeRanges2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLTimeRanges2_startDouble(IHTMLTimeRanges2* This,LONG index,double *startTime) {
    return This->lpVtbl->startDouble(This,index,startTime);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMediaElement_QueryInterface(IHTMLMediaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLMediaElement_AddRef(IHTMLMediaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLMediaElement_Release(IHTMLMediaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLMediaElement_GetTypeInfoCount(IHTMLMediaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_GetTypeInfo(IHTMLMediaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMediaElement_get_error(IHTMLMediaElement* This,IHTMLMediaError **p) {
    return This->lpVtbl->get_error(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_put_src(IHTMLMediaElement* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_src(IHTMLMediaElement* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_currentSrc(IHTMLMediaElement* This,BSTR *p) {
    return This->lpVtbl->get_currentSrc(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_networkState(IHTMLMediaElement* This,USHORT *p) {
    return This->lpVtbl->get_networkState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_put_preload(IHTMLMediaElement* This,BSTR v) {
    return This->lpVtbl->put_preload(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_preload(IHTMLMediaElement* This,BSTR *p) {
    return This->lpVtbl->get_preload(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_buffered(IHTMLMediaElement* This,IHTMLTimeRanges **p) {
    return This->lpVtbl->get_buffered(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_load(IHTMLMediaElement* This) {
    return This->lpVtbl->load(This);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_canPlayType(IHTMLMediaElement* This,BSTR type,BSTR *canPlay) {
    return This->lpVtbl->canPlayType(This,type,canPlay);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_seeking(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_seeking(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_put_currentTime(IHTMLMediaElement* This,float v) {
    return This->lpVtbl->put_currentTime(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_currentTime(IHTMLMediaElement* This,float *p) {
    return This->lpVtbl->get_currentTime(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_initialTime(IHTMLMediaElement* This,float *p) {
    return This->lpVtbl->get_initialTime(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_duration(IHTMLMediaElement* This,float *p) {
    return This->lpVtbl->get_duration(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_paused(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_paused(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_put_defaultPlaybackRate(IHTMLMediaElement* This,float v) {
    return This->lpVtbl->put_defaultPlaybackRate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_defaultPlaybackRate(IHTMLMediaElement* This,float *p) {
    return This->lpVtbl->get_defaultPlaybackRate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_put_playbackRate(IHTMLMediaElement* This,float v) {
    return This->lpVtbl->put_playbackRate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_playbackRate(IHTMLMediaElement* This,float *p) {
    return This->lpVtbl->get_playbackRate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_played(IHTMLMediaElement* This,IHTMLTimeRanges **p) {
    return This->lpVtbl->get_played(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_seekable(IHTMLMediaElement* This,IHTMLTimeRanges **p) {
    return This->lpVtbl->get_seekable(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_ended(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_ended(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_put_autoplay(IHTMLMediaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_autoplay(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_autoplay(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_autoplay(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_put_loop(IHTMLMediaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_loop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_loop(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_loop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_play(IHTMLMediaElement* This) {
    return This->lpVtbl->play(This);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_pause(IHTMLMediaElement* This) {
    return This->lpVtbl->pause(This);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_put_controls(IHTMLMediaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_controls(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_controls(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_controls(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_put_volume(IHTMLMediaElement* This,float v) {
    return This->lpVtbl->put_volume(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_volume(IHTMLMediaElement* This,float *p) {
    return This->lpVtbl->get_volume(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_put_muted(IHTMLMediaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_muted(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_get_muted(IHTMLMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_muted(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement_put_autobuffer(IHTMLMediaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_autobuffer(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMediaElement2_QueryInterface(IHTMLMediaElement2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLMediaElement2_AddRef(IHTMLMediaElement2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLMediaElement2_Release(IHTMLMediaElement2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLMediaElement2_GetTypeInfoCount(IHTMLMediaElement2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement2_GetTypeInfo(IHTMLMediaElement2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMediaElement2_put_currentTimeDouble(IHTMLMediaElement2* This,double v) {
    return This->lpVtbl->put_currentTimeDouble(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement2_get_currentTimeDouble(IHTMLMediaElement2* This,double *p) {
    return This->lpVtbl->get_currentTimeDouble(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement2_get_initialTimeDouble(IHTMLMediaElement2* This,double *p) {
    return This->lpVtbl->get_initialTimeDouble(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement2_get_durationDouble(IHTMLMediaElement2* This,double *p) {
    return This->lpVtbl->get_durationDouble(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement2_put_defaultPlaybackRateDouble(IHTMLMediaElement2* This,double v) {
    return This->lpVtbl->put_defaultPlaybackRateDouble(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement2_get_defaultPlaybackRateDouble(IHTMLMediaElement2* This,double *p) {
    return This->lpVtbl->get_defaultPlaybackRateDouble(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement2_put_playbackRateDouble(IHTMLMediaElement2* This,double v) {
    return This->lpVtbl->put_playbackRateDouble(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement2_get_playbackRateDouble(IHTMLMediaElement2* This,double *p) {
    return This->lpVtbl->get_playbackRateDouble(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMediaElement2_put_volumeDouble(IHTMLMediaElement2* This,double v) {
    return This->lpVtbl->put_volumeDouble(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMSMediaElement_QueryInterface(IHTMLMSMediaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLMSMediaElement_AddRef(IHTMLMSMediaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLMSMediaElement_Release(IHTMLMSMediaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLMSMediaElement_GetTypeInfoCount(IHTMLMSMediaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLMSMediaElement_GetTypeInfo(IHTMLMSMediaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLMSMediaElement_put_msPlayToDisabled(IHTMLMSMediaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_msPlayToDisabled(This,v);
}
static __WIDL_INLINE HRESULT IHTMLMSMediaElement_get_msPlayToDisabled(IHTMLMSMediaElement* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_msPlayToDisabled(This,p);
}
static __WIDL_INLINE HRESULT IHTMLMSMediaElement_put_msPlayToPrimary(IHTMLMSMediaElement* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_msPlayToPrimary(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSourceElement_QueryInterface(IHTMLSourceElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLSourceElement_AddRef(IHTMLSourceElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLSourceElement_Release(IHTMLSourceElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLSourceElement_GetTypeInfoCount(IHTMLSourceElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLSourceElement_GetTypeInfo(IHTMLSourceElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLSourceElement_put_src(IHTMLSourceElement* This,BSTR v) {
    return This->lpVtbl->put_src(This,v);
}
static __WIDL_INLINE HRESULT IHTMLSourceElement_get_src(IHTMLSourceElement* This,BSTR *p) {
    return This->lpVtbl->get_src(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSourceElement_put_type(IHTMLSourceElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE HRESULT IHTMLSourceElement_get_type(IHTMLSourceElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLSourceElement_put_media(IHTMLSourceElement* This,BSTR v) {
    return This->lpVtbl->put_media(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAudioElement_QueryInterface(IHTMLAudioElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAudioElement_AddRef(IHTMLAudioElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAudioElement_Release(IHTMLAudioElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAudioElement_GetTypeInfoCount(IHTMLAudioElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAudioElement_GetTypeInfo(IHTMLAudioElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLVideoElement_QueryInterface(IHTMLVideoElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLVideoElement_AddRef(IHTMLVideoElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLVideoElement_Release(IHTMLVideoElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLVideoElement_GetTypeInfoCount(IHTMLVideoElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLVideoElement_GetTypeInfo(IHTMLVideoElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLVideoElement_put_width(IHTMLVideoElement* This,LONG v) {
    return This->lpVtbl->put_width(This,v);
}
static __WIDL_INLINE HRESULT IHTMLVideoElement_get_width(IHTMLVideoElement* This,LONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IHTMLVideoElement_put_height(IHTMLVideoElement* This,LONG v) {
    return This->lpVtbl->put_height(This,v);
}
static __WIDL_INLINE HRESULT IHTMLVideoElement_get_height(IHTMLVideoElement* This,LONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IHTMLVideoElement_get_videoWidth(IHTMLVideoElement* This,ULONG *p) {
    return This->lpVtbl->get_videoWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLVideoElement_get_videoHeight(IHTMLVideoElement* This,ULONG *p) {
    return This->lpVtbl->get_videoHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLVideoElement_put_poster(IHTMLVideoElement* This,BSTR v) {
    return This->lpVtbl->put_poster(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAudioElementFactory_QueryInterface(IHTMLAudioElementFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAudioElementFactory_AddRef(IHTMLAudioElementFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAudioElementFactory_Release(IHTMLAudioElementFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAudioElementFactory_GetTypeInfoCount(IHTMLAudioElementFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAudioElementFactory_GetTypeInfo(IHTMLAudioElementFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLMediaError_QueryInterface(DispHTMLMediaError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLMediaError_AddRef(DispHTMLMediaError* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLMediaError_Release(DispHTMLMediaError* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLMediaError_GetTypeInfoCount(DispHTMLMediaError* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLMediaError_GetTypeInfo(DispHTMLMediaError* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLTimeRanges_QueryInterface(DispHTMLTimeRanges* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLTimeRanges_AddRef(DispHTMLTimeRanges* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLTimeRanges_Release(DispHTMLTimeRanges* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLTimeRanges_GetTypeInfoCount(DispHTMLTimeRanges* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLTimeRanges_GetTypeInfo(DispHTMLTimeRanges* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLMediaElement_QueryInterface(DispHTMLMediaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLMediaElement_AddRef(DispHTMLMediaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLMediaElement_Release(DispHTMLMediaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLMediaElement_GetTypeInfoCount(DispHTMLMediaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLMediaElement_GetTypeInfo(DispHTMLMediaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLSourceElement_QueryInterface(DispHTMLSourceElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLSourceElement_AddRef(DispHTMLSourceElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLSourceElement_Release(DispHTMLSourceElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLSourceElement_GetTypeInfoCount(DispHTMLSourceElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLSourceElement_GetTypeInfo(DispHTMLSourceElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLAudioElement_QueryInterface(DispHTMLAudioElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLAudioElement_AddRef(DispHTMLAudioElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLAudioElement_Release(DispHTMLAudioElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLAudioElement_GetTypeInfoCount(DispHTMLAudioElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLAudioElement_GetTypeInfo(DispHTMLAudioElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLVideoElement_QueryInterface(DispHTMLVideoElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLVideoElement_AddRef(DispHTMLVideoElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLVideoElement_Release(DispHTMLVideoElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLVideoElement_GetTypeInfoCount(DispHTMLVideoElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLVideoElement_GetTypeInfo(DispHTMLVideoElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGSwitchElement_QueryInterface(ISVGSwitchElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGSwitchElement_AddRef(ISVGSwitchElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGSwitchElement_Release(ISVGSwitchElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGSwitchElement_GetTypeInfoCount(ISVGSwitchElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGSwitchElement_GetTypeInfo(ISVGSwitchElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGSwitchElement_QueryInterface(DispSVGSwitchElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGSwitchElement_AddRef(DispSVGSwitchElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGSwitchElement_Release(DispSVGSwitchElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGSwitchElement_GetTypeInfoCount(DispSVGSwitchElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGSwitchElement_GetTypeInfo(DispSVGSwitchElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGDescElement_QueryInterface(ISVGDescElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGDescElement_AddRef(ISVGDescElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGDescElement_Release(ISVGDescElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGDescElement_GetTypeInfoCount(ISVGDescElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGDescElement_GetTypeInfo(ISVGDescElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGDescElement_QueryInterface(DispSVGDescElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGDescElement_AddRef(DispSVGDescElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGDescElement_Release(DispSVGDescElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGDescElement_GetTypeInfoCount(DispSVGDescElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGDescElement_GetTypeInfo(DispSVGDescElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTitleElement_QueryInterface(ISVGTitleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGTitleElement_AddRef(ISVGTitleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGTitleElement_Release(ISVGTitleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGTitleElement_GetTypeInfoCount(ISVGTitleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGTitleElement_GetTypeInfo(ISVGTitleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGTitleElement_QueryInterface(DispSVGTitleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGTitleElement_AddRef(DispSVGTitleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGTitleElement_Release(DispSVGTitleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGTitleElement_GetTypeInfoCount(DispSVGTitleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGTitleElement_GetTypeInfo(DispSVGTitleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGMetadataElement_QueryInterface(ISVGMetadataElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGMetadataElement_AddRef(ISVGMetadataElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGMetadataElement_Release(ISVGMetadataElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGMetadataElement_GetTypeInfoCount(ISVGMetadataElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGMetadataElement_GetTypeInfo(ISVGMetadataElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGMetadataElement_QueryInterface(DispSVGMetadataElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGMetadataElement_AddRef(DispSVGMetadataElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGMetadataElement_Release(DispSVGMetadataElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGMetadataElement_GetTypeInfoCount(DispSVGMetadataElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGMetadataElement_GetTypeInfo(DispSVGMetadataElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGElementInstance_QueryInterface(ISVGElementInstance* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGElementInstance_AddRef(ISVGElementInstance* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGElementInstance_Release(ISVGElementInstance* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGElementInstance_GetTypeInfoCount(ISVGElementInstance* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGElementInstance_GetTypeInfo(ISVGElementInstance* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGElementInstance_get_correspondingElement(ISVGElementInstance* This,ISVGElement **p) {
    return This->lpVtbl->get_correspondingElement(This,p);
}
static __WIDL_INLINE HRESULT ISVGElementInstance_get_correspondingUseElement(ISVGElementInstance* This,ISVGUseElement **p) {
    return This->lpVtbl->get_correspondingUseElement(This,p);
}
static __WIDL_INLINE HRESULT ISVGElementInstance_get_parentNode(ISVGElementInstance* This,ISVGElementInstance **p) {
    return This->lpVtbl->get_parentNode(This,p);
}
static __WIDL_INLINE HRESULT ISVGElementInstance_get_childNodes(ISVGElementInstance* This,ISVGElementInstanceList **p) {
    return This->lpVtbl->get_childNodes(This,p);
}
static __WIDL_INLINE HRESULT ISVGElementInstance_get_firstChild(ISVGElementInstance* This,ISVGElementInstance **p) {
    return This->lpVtbl->get_firstChild(This,p);
}
static __WIDL_INLINE HRESULT ISVGElementInstance_get_lastChild(ISVGElementInstance* This,ISVGElementInstance **p) {
    return This->lpVtbl->get_lastChild(This,p);
}
static __WIDL_INLINE HRESULT ISVGElementInstance_get_previousSibling(ISVGElementInstance* This,ISVGElementInstance **p) {
    return This->lpVtbl->get_previousSibling(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGElementInstance_QueryInterface(DispSVGElementInstance* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGElementInstance_AddRef(DispSVGElementInstance* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGElementInstance_Release(DispSVGElementInstance* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGElementInstance_GetTypeInfoCount(DispSVGElementInstance* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGElementInstance_GetTypeInfo(DispSVGElementInstance* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGElementInstanceList_QueryInterface(ISVGElementInstanceList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGElementInstanceList_AddRef(ISVGElementInstanceList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGElementInstanceList_Release(ISVGElementInstanceList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGElementInstanceList_GetTypeInfoCount(ISVGElementInstanceList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGElementInstanceList_GetTypeInfo(ISVGElementInstanceList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGElementInstanceList_get_length(ISVGElementInstanceList* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGElementInstanceList_QueryInterface(DispSVGElementInstanceList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGElementInstanceList_AddRef(DispSVGElementInstanceList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGElementInstanceList_Release(DispSVGElementInstanceList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGElementInstanceList_GetTypeInfoCount(DispSVGElementInstanceList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGElementInstanceList_GetTypeInfo(DispSVGElementInstanceList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMException_QueryInterface(IDOMException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMException_AddRef(IDOMException* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMException_Release(IDOMException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMException_GetTypeInfoCount(IDOMException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMException_GetTypeInfo(IDOMException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMException_put_code(IDOMException* This,LONG v) {
    return This->lpVtbl->put_code(This,v);
}
static __WIDL_INLINE HRESULT IDOMException_get_code(IDOMException* This,LONG *p) {
    return This->lpVtbl->get_code(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRangeException_QueryInterface(IRangeException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IRangeException_AddRef(IRangeException* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IRangeException_Release(IRangeException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IRangeException_GetTypeInfoCount(IRangeException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IRangeException_GetTypeInfo(IRangeException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IRangeException_put_code(IRangeException* This,LONG v) {
    return This->lpVtbl->put_code(This,v);
}
static __WIDL_INLINE HRESULT IRangeException_get_code(IRangeException* This,LONG *p) {
    return This->lpVtbl->get_code(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGException_QueryInterface(ISVGException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGException_AddRef(ISVGException* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGException_Release(ISVGException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGException_GetTypeInfoCount(ISVGException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGException_GetTypeInfo(ISVGException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGException_put_code(ISVGException* This,LONG v) {
    return This->lpVtbl->put_code(This,v);
}
static __WIDL_INLINE HRESULT ISVGException_get_code(ISVGException* This,LONG *p) {
    return This->lpVtbl->get_code(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IEventException_QueryInterface(IEventException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEventException_AddRef(IEventException* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEventException_Release(IEventException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IEventException_GetTypeInfoCount(IEventException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IEventException_GetTypeInfo(IEventException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IEventException_put_code(IEventException* This,LONG v) {
    return This->lpVtbl->put_code(This,v);
}
static __WIDL_INLINE HRESULT IEventException_get_code(IEventException* This,LONG *p) {
    return This->lpVtbl->get_code(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMException_QueryInterface(DispDOMException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMException_AddRef(DispDOMException* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMException_Release(DispDOMException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMException_GetTypeInfoCount(DispDOMException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMException_GetTypeInfo(DispDOMException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispRangeException_QueryInterface(DispRangeException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispRangeException_AddRef(DispRangeException* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispRangeException_Release(DispRangeException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispRangeException_GetTypeInfoCount(DispRangeException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispRangeException_GetTypeInfo(DispRangeException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGException_QueryInterface(DispSVGException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGException_AddRef(DispSVGException* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGException_Release(DispSVGException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGException_GetTypeInfoCount(DispSVGException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGException_GetTypeInfo(DispSVGException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispEventException_QueryInterface(DispEventException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispEventException_AddRef(DispEventException* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispEventException_Release(DispEventException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispEventException_GetTypeInfoCount(DispEventException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispEventException_GetTypeInfo(DispEventException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGScriptElement_QueryInterface(ISVGScriptElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGScriptElement_AddRef(ISVGScriptElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGScriptElement_Release(ISVGScriptElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGScriptElement_GetTypeInfoCount(ISVGScriptElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGScriptElement_GetTypeInfo(ISVGScriptElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGScriptElement_put_type(ISVGScriptElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGScriptElement_QueryInterface(DispSVGScriptElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGScriptElement_AddRef(DispSVGScriptElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGScriptElement_Release(DispSVGScriptElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGScriptElement_GetTypeInfoCount(DispSVGScriptElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGScriptElement_GetTypeInfo(DispSVGScriptElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGStyleElement_QueryInterface(ISVGStyleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGStyleElement_AddRef(ISVGStyleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGStyleElement_Release(ISVGStyleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGStyleElement_GetTypeInfoCount(ISVGStyleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGStyleElement_GetTypeInfo(ISVGStyleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGStyleElement_put_type(ISVGStyleElement* This,BSTR v) {
    return This->lpVtbl->put_type(This,v);
}
static __WIDL_INLINE HRESULT ISVGStyleElement_get_type(ISVGStyleElement* This,BSTR *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT ISVGStyleElement_put_media(ISVGStyleElement* This,BSTR v) {
    return This->lpVtbl->put_media(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGStyleElement_QueryInterface(DispSVGStyleElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGStyleElement_AddRef(DispSVGStyleElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGStyleElement_Release(DispSVGStyleElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGStyleElement_GetTypeInfoCount(DispSVGStyleElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGStyleElement_GetTypeInfo(DispSVGStyleElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTextContentElement_QueryInterface(ISVGTextContentElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGTextContentElement_AddRef(ISVGTextContentElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGTextContentElement_Release(ISVGTextContentElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGTextContentElement_GetTypeInfoCount(ISVGTextContentElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGTextContentElement_GetTypeInfo(ISVGTextContentElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTextContentElement_putref_textLength(ISVGTextContentElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_textLength(This,v);
}
static __WIDL_INLINE HRESULT ISVGTextContentElement_get_textLength(ISVGTextContentElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_textLength(This,p);
}
static __WIDL_INLINE HRESULT ISVGTextContentElement_putref_lengthAdjust(ISVGTextContentElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_lengthAdjust(This,v);
}
static __WIDL_INLINE HRESULT ISVGTextContentElement_get_lengthAdjust(ISVGTextContentElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_lengthAdjust(This,p);
}
static __WIDL_INLINE HRESULT ISVGTextContentElement_getNumberOfChars(ISVGTextContentElement* This,LONG *pResult) {
    return This->lpVtbl->getNumberOfChars(This,pResult);
}
static __WIDL_INLINE HRESULT ISVGTextContentElement_getComputedTextLength(ISVGTextContentElement* This,float *pResult) {
    return This->lpVtbl->getComputedTextLength(This,pResult);
}
static __WIDL_INLINE HRESULT ISVGTextContentElement_getSubStringLength(ISVGTextContentElement* This,LONG charnum,LONG nchars,float *pResult) {
    return This->lpVtbl->getSubStringLength(This,charnum,nchars,pResult);
}
static __WIDL_INLINE HRESULT ISVGTextContentElement_getStartPositionOfChar(ISVGTextContentElement* This,LONG charnum,ISVGPoint **ppResult) {
    return This->lpVtbl->getStartPositionOfChar(This,charnum,ppResult);
}
static __WIDL_INLINE HRESULT ISVGTextContentElement_getEndPositionOfChar(ISVGTextContentElement* This,LONG charnum,ISVGPoint **ppResult) {
    return This->lpVtbl->getEndPositionOfChar(This,charnum,ppResult);
}
static __WIDL_INLINE HRESULT ISVGTextContentElement_getExtentOfChar(ISVGTextContentElement* This,LONG charnum,ISVGRect **ppResult) {
    return This->lpVtbl->getExtentOfChar(This,charnum,ppResult);
}
static __WIDL_INLINE HRESULT ISVGTextContentElement_getRotationOfChar(ISVGTextContentElement* This,LONG charnum,float *pResult) {
    return This->lpVtbl->getRotationOfChar(This,charnum,pResult);
}
static __WIDL_INLINE HRESULT ISVGTextContentElement_getCharNumAtPosition(ISVGTextContentElement* This,ISVGPoint *point,LONG *pResult) {
    return This->lpVtbl->getCharNumAtPosition(This,point,pResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGTextContentElement_QueryInterface(DispSVGTextContentElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGTextContentElement_AddRef(DispSVGTextContentElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGTextContentElement_Release(DispSVGTextContentElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGTextContentElement_GetTypeInfoCount(DispSVGTextContentElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGTextContentElement_GetTypeInfo(DispSVGTextContentElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTextPositioningElement_QueryInterface(ISVGTextPositioningElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGTextPositioningElement_AddRef(ISVGTextPositioningElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGTextPositioningElement_Release(ISVGTextPositioningElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGTextPositioningElement_GetTypeInfoCount(ISVGTextPositioningElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGTextPositioningElement_GetTypeInfo(ISVGTextPositioningElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTextPositioningElement_putref_x(ISVGTextPositioningElement* This,ISVGAnimatedLengthList *v) {
    return This->lpVtbl->putref_x(This,v);
}
static __WIDL_INLINE HRESULT ISVGTextPositioningElement_get_x(ISVGTextPositioningElement* This,ISVGAnimatedLengthList **p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ISVGTextPositioningElement_putref_y(ISVGTextPositioningElement* This,ISVGAnimatedLengthList *v) {
    return This->lpVtbl->putref_y(This,v);
}
static __WIDL_INLINE HRESULT ISVGTextPositioningElement_get_y(ISVGTextPositioningElement* This,ISVGAnimatedLengthList **p) {
    return This->lpVtbl->get_y(This,p);
}
static __WIDL_INLINE HRESULT ISVGTextPositioningElement_putref_dx(ISVGTextPositioningElement* This,ISVGAnimatedLengthList *v) {
    return This->lpVtbl->putref_dx(This,v);
}
static __WIDL_INLINE HRESULT ISVGTextPositioningElement_get_dx(ISVGTextPositioningElement* This,ISVGAnimatedLengthList **p) {
    return This->lpVtbl->get_dx(This,p);
}
static __WIDL_INLINE HRESULT ISVGTextPositioningElement_putref_dy(ISVGTextPositioningElement* This,ISVGAnimatedLengthList *v) {
    return This->lpVtbl->putref_dy(This,v);
}
static __WIDL_INLINE HRESULT ISVGTextPositioningElement_get_dy(ISVGTextPositioningElement* This,ISVGAnimatedLengthList **p) {
    return This->lpVtbl->get_dy(This,p);
}
static __WIDL_INLINE HRESULT ISVGTextPositioningElement_putref_rotate(ISVGTextPositioningElement* This,ISVGAnimatedNumberList *v) {
    return This->lpVtbl->putref_rotate(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGTextPositioningElement_QueryInterface(DispSVGTextPositioningElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGTextPositioningElement_AddRef(DispSVGTextPositioningElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGTextPositioningElement_Release(DispSVGTextPositioningElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGTextPositioningElement_GetTypeInfoCount(DispSVGTextPositioningElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGTextPositioningElement_GetTypeInfo(DispSVGTextPositioningElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMDocumentType_QueryInterface(IDOMDocumentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMDocumentType_AddRef(IDOMDocumentType* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMDocumentType_Release(IDOMDocumentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMDocumentType_GetTypeInfoCount(IDOMDocumentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMDocumentType_GetTypeInfo(IDOMDocumentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMDocumentType_get_name(IDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IDOMDocumentType_get_entities(IDOMDocumentType* This,IDispatch **p) {
    return This->lpVtbl->get_entities(This,p);
}
static __WIDL_INLINE HRESULT IDOMDocumentType_get_notations(IDOMDocumentType* This,IDispatch **p) {
    return This->lpVtbl->get_notations(This,p);
}
static __WIDL_INLINE HRESULT IDOMDocumentType_get_publicId(IDOMDocumentType* This,VARIANT *p) {
    return This->lpVtbl->get_publicId(This,p);
}
static __WIDL_INLINE HRESULT IDOMDocumentType_get_systemId(IDOMDocumentType* This,VARIANT *p) {
    return This->lpVtbl->get_systemId(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMDocumentType_QueryInterface(DispDOMDocumentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMDocumentType_AddRef(DispDOMDocumentType* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMDocumentType_Release(DispDOMDocumentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMDocumentType_GetTypeInfoCount(DispDOMDocumentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMDocumentType_GetTypeInfo(DispDOMDocumentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMNodeIterator_QueryInterface(IDOMNodeIterator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMNodeIterator_AddRef(IDOMNodeIterator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMNodeIterator_Release(IDOMNodeIterator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMNodeIterator_GetTypeInfoCount(IDOMNodeIterator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMNodeIterator_GetTypeInfo(IDOMNodeIterator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMNodeIterator_get_root(IDOMNodeIterator* This,IDispatch **p) {
    return This->lpVtbl->get_root(This,p);
}
static __WIDL_INLINE HRESULT IDOMNodeIterator_get_whatToShow(IDOMNodeIterator* This,ULONG *p) {
    return This->lpVtbl->get_whatToShow(This,p);
}
static __WIDL_INLINE HRESULT IDOMNodeIterator_get_filter(IDOMNodeIterator* This,IDispatch **p) {
    return This->lpVtbl->get_filter(This,p);
}
static __WIDL_INLINE HRESULT IDOMNodeIterator_get_expandEntityReferences(IDOMNodeIterator* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_expandEntityReferences(This,p);
}
static __WIDL_INLINE HRESULT IDOMNodeIterator_nextNode(IDOMNodeIterator* This,IDispatch **ppRetNode) {
    return This->lpVtbl->nextNode(This,ppRetNode);
}
static __WIDL_INLINE HRESULT IDOMNodeIterator_previousNode(IDOMNodeIterator* This,IDispatch **ppRetNode) {
    return This->lpVtbl->previousNode(This,ppRetNode);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMTreeWalker_QueryInterface(IDOMTreeWalker* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMTreeWalker_AddRef(IDOMTreeWalker* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMTreeWalker_Release(IDOMTreeWalker* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMTreeWalker_GetTypeInfoCount(IDOMTreeWalker* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMTreeWalker_GetTypeInfo(IDOMTreeWalker* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMTreeWalker_get_root(IDOMTreeWalker* This,IDispatch **p) {
    return This->lpVtbl->get_root(This,p);
}
static __WIDL_INLINE HRESULT IDOMTreeWalker_get_whatToShow(IDOMTreeWalker* This,ULONG *p) {
    return This->lpVtbl->get_whatToShow(This,p);
}
static __WIDL_INLINE HRESULT IDOMTreeWalker_get_filter(IDOMTreeWalker* This,IDispatch **p) {
    return This->lpVtbl->get_filter(This,p);
}
static __WIDL_INLINE HRESULT IDOMTreeWalker_get_expandEntityReferences(IDOMTreeWalker* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_expandEntityReferences(This,p);
}
static __WIDL_INLINE HRESULT IDOMTreeWalker_putref_currentNode(IDOMTreeWalker* This,IDispatch *v) {
    return This->lpVtbl->putref_currentNode(This,v);
}
static __WIDL_INLINE HRESULT IDOMTreeWalker_get_currentNode(IDOMTreeWalker* This,IDispatch **p) {
    return This->lpVtbl->get_currentNode(This,p);
}
static __WIDL_INLINE HRESULT IDOMTreeWalker_parentNode(IDOMTreeWalker* This,IDispatch **ppRetNode) {
    return This->lpVtbl->parentNode(This,ppRetNode);
}
static __WIDL_INLINE HRESULT IDOMTreeWalker_firstChild(IDOMTreeWalker* This,IDispatch **ppRetNode) {
    return This->lpVtbl->firstChild(This,ppRetNode);
}
static __WIDL_INLINE HRESULT IDOMTreeWalker_lastChild(IDOMTreeWalker* This,IDispatch **ppRetNode) {
    return This->lpVtbl->lastChild(This,ppRetNode);
}
static __WIDL_INLINE HRESULT IDOMTreeWalker_previousSibling(IDOMTreeWalker* This,IDispatch **ppRetNode) {
    return This->lpVtbl->previousSibling(This,ppRetNode);
}
static __WIDL_INLINE HRESULT IDOMTreeWalker_nextSibling(IDOMTreeWalker* This,IDispatch **ppRetNode) {
    return This->lpVtbl->nextSibling(This,ppRetNode);
}
static __WIDL_INLINE HRESULT IDOMTreeWalker_previousNode(IDOMTreeWalker* This,IDispatch **ppRetNode) {
    return This->lpVtbl->previousNode(This,ppRetNode);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispNodeIterator_QueryInterface(DispNodeIterator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispNodeIterator_AddRef(DispNodeIterator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispNodeIterator_Release(DispNodeIterator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispNodeIterator_GetTypeInfoCount(DispNodeIterator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispNodeIterator_GetTypeInfo(DispNodeIterator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispTreeWalker_QueryInterface(DispTreeWalker* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispTreeWalker_AddRef(DispTreeWalker* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispTreeWalker_Release(DispTreeWalker* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispTreeWalker_GetTypeInfoCount(DispTreeWalker* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispTreeWalker_GetTypeInfo(DispTreeWalker* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMProcessingInstruction_QueryInterface(IDOMProcessingInstruction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMProcessingInstruction_AddRef(IDOMProcessingInstruction* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMProcessingInstruction_Release(IDOMProcessingInstruction* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMProcessingInstruction_GetTypeInfoCount(IDOMProcessingInstruction* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMProcessingInstruction_GetTypeInfo(IDOMProcessingInstruction* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMProcessingInstruction_get_target(IDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_target(This,p);
}
static __WIDL_INLINE HRESULT IDOMProcessingInstruction_put_data(IDOMProcessingInstruction* This,BSTR v) {
    return This->lpVtbl->put_data(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMProcessingInstruction_QueryInterface(DispDOMProcessingInstruction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMProcessingInstruction_AddRef(DispDOMProcessingInstruction* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMProcessingInstruction_Release(DispDOMProcessingInstruction* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMProcessingInstruction_GetTypeInfoCount(DispDOMProcessingInstruction* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMProcessingInstruction_GetTypeInfo(DispDOMProcessingInstruction* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPerformance_QueryInterface(IHTMLPerformance* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLPerformance_AddRef(IHTMLPerformance* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLPerformance_Release(IHTMLPerformance* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLPerformance_GetTypeInfoCount(IHTMLPerformance* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLPerformance_GetTypeInfo(IHTMLPerformance* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPerformance_get_navigation(IHTMLPerformance* This,IHTMLPerformanceNavigation **p) {
    return This->lpVtbl->get_navigation(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformance_get_timing(IHTMLPerformance* This,IHTMLPerformanceTiming **p) {
    return This->lpVtbl->get_timing(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformance_toString(IHTMLPerformance* This,BSTR *string) {
    return This->lpVtbl->toString(This,string);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPerformanceNavigation_QueryInterface(IHTMLPerformanceNavigation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLPerformanceNavigation_AddRef(IHTMLPerformanceNavigation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLPerformanceNavigation_Release(IHTMLPerformanceNavigation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLPerformanceNavigation_GetTypeInfoCount(IHTMLPerformanceNavigation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceNavigation_GetTypeInfo(IHTMLPerformanceNavigation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPerformanceNavigation_get_type(IHTMLPerformanceNavigation* This,ULONG *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceNavigation_get_redirectCount(IHTMLPerformanceNavigation* This,ULONG *p) {
    return This->lpVtbl->get_redirectCount(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceNavigation_toString(IHTMLPerformanceNavigation* This,BSTR *string) {
    return This->lpVtbl->toString(This,string);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPerformanceTiming_QueryInterface(IHTMLPerformanceTiming* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLPerformanceTiming_AddRef(IHTMLPerformanceTiming* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLPerformanceTiming_Release(IHTMLPerformanceTiming* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_GetTypeInfoCount(IHTMLPerformanceTiming* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_GetTypeInfo(IHTMLPerformanceTiming* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_navigationStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_navigationStart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_unloadEventStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_unloadEventStart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_unloadEventEnd(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_unloadEventEnd(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_redirectStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_redirectStart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_redirectEnd(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_redirectEnd(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_fetchStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_fetchStart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_domainLookupStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_domainLookupStart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_domainLookupEnd(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_domainLookupEnd(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_connectStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_connectStart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_connectEnd(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_connectEnd(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_requestStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_requestStart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_responseStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_responseStart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_responseEnd(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_responseEnd(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_domLoading(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_domLoading(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_domInteractive(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_domInteractive(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_domContentLoadedEventStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_domContentLoadedEventStart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_domContentLoadedEventEnd(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_domContentLoadedEventEnd(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_domComplete(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_domComplete(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_loadEventStart(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_loadEventStart(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_loadEventEnd(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_loadEventEnd(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_get_msFirstPaint(IHTMLPerformanceTiming* This,ULONGLONG *p) {
    return This->lpVtbl->get_msFirstPaint(This,p);
}
static __WIDL_INLINE HRESULT IHTMLPerformanceTiming_toString(IHTMLPerformanceTiming* This,BSTR *string) {
    return This->lpVtbl->toString(This,string);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLPerformance_QueryInterface(DispHTMLPerformance* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLPerformance_AddRef(DispHTMLPerformance* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLPerformance_Release(DispHTMLPerformance* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLPerformance_GetTypeInfoCount(DispHTMLPerformance* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLPerformance_GetTypeInfo(DispHTMLPerformance* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLPerformanceNavigation_QueryInterface(DispHTMLPerformanceNavigation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLPerformanceNavigation_AddRef(DispHTMLPerformanceNavigation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLPerformanceNavigation_Release(DispHTMLPerformanceNavigation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLPerformanceNavigation_GetTypeInfoCount(DispHTMLPerformanceNavigation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLPerformanceNavigation_GetTypeInfo(DispHTMLPerformanceNavigation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLPerformanceTiming_QueryInterface(DispHTMLPerformanceTiming* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLPerformanceTiming_AddRef(DispHTMLPerformanceTiming* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLPerformanceTiming_Release(DispHTMLPerformanceTiming* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLPerformanceTiming_GetTypeInfoCount(DispHTMLPerformanceTiming* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLPerformanceTiming_GetTypeInfo(DispHTMLPerformanceTiming* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTSpanElement_QueryInterface(ISVGTSpanElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGTSpanElement_AddRef(ISVGTSpanElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGTSpanElement_Release(ISVGTSpanElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGTSpanElement_GetTypeInfoCount(ISVGTSpanElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGTSpanElement_GetTypeInfo(ISVGTSpanElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGTSpanElement_QueryInterface(DispSVGTSpanElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGTSpanElement_AddRef(DispSVGTSpanElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGTSpanElement_Release(DispSVGTSpanElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGTSpanElement_GetTypeInfoCount(DispSVGTSpanElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGTSpanElement_GetTypeInfo(DispSVGTSpanElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITemplatePrinter_QueryInterface(ITemplatePrinter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITemplatePrinter_AddRef(ITemplatePrinter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITemplatePrinter_Release(ITemplatePrinter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ITemplatePrinter_GetTypeInfoCount(ITemplatePrinter* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_GetTypeInfo(ITemplatePrinter* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITemplatePrinter_startDoc(ITemplatePrinter* This,BSTR bstrTitle,VARIANT_BOOL *p) {
    return This->lpVtbl->startDoc(This,bstrTitle,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_stopDoc(ITemplatePrinter* This) {
    return This->lpVtbl->stopDoc(This);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_printBlankPage(ITemplatePrinter* This) {
    return This->lpVtbl->printBlankPage(This);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_printPage(ITemplatePrinter* This,IDispatch *pElemDisp) {
    return This->lpVtbl->printPage(This,pElemDisp);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_ensurePrintDialogDefaults(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->ensurePrintDialogDefaults(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_showPrintDialog(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->showPrintDialog(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_showPageSetupDialog(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->showPageSetupDialog(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_printNonNative(ITemplatePrinter* This,IUnknown *pMarkup,VARIANT_BOOL *p) {
    return This->lpVtbl->printNonNative(This,pMarkup,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_printNonNativeFrames(ITemplatePrinter* This,IUnknown *pMarkup,VARIANT_BOOL fActiveFrame) {
    return This->lpVtbl->printNonNativeFrames(This,pMarkup,fActiveFrame);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_framesetDocument(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_framesetDocument(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_framesetDocument(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_framesetDocument(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_frameActive(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameActive(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_frameActive(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameActive(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_frameAsShown(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameAsShown(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_frameAsShown(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameAsShown(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_selection(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selection(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_selection(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selection(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_selectedPages(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selectedPages(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_selectedPages(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selectedPages(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_currentPage(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_currentPage(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_currentPage(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_currentPage(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_currentPageAvail(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_currentPageAvail(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_currentPageAvail(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_currentPageAvail(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_collate(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_collate(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_collate(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_collate(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_duplex(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_duplex(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_copies(ITemplatePrinter* This,USHORT v) {
    return This->lpVtbl->put_copies(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_copies(ITemplatePrinter* This,USHORT *p) {
    return This->lpVtbl->get_copies(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_pageFrom(ITemplatePrinter* This,USHORT v) {
    return This->lpVtbl->put_pageFrom(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_pageFrom(ITemplatePrinter* This,USHORT *p) {
    return This->lpVtbl->get_pageFrom(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_pageTo(ITemplatePrinter* This,USHORT v) {
    return This->lpVtbl->put_pageTo(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_pageTo(ITemplatePrinter* This,USHORT *p) {
    return This->lpVtbl->get_pageTo(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_tableOfLinks(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_tableOfLinks(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_tableOfLinks(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_tableOfLinks(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_allLinkedDocuments(ITemplatePrinter* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_allLinkedDocuments(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_allLinkedDocuments(ITemplatePrinter* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_allLinkedDocuments(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_header(ITemplatePrinter* This,BSTR v) {
    return This->lpVtbl->put_header(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_header(ITemplatePrinter* This,BSTR *p) {
    return This->lpVtbl->get_header(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_footer(ITemplatePrinter* This,BSTR v) {
    return This->lpVtbl->put_footer(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_footer(ITemplatePrinter* This,BSTR *p) {
    return This->lpVtbl->get_footer(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_marginLeft(ITemplatePrinter* This,LONG v) {
    return This->lpVtbl->put_marginLeft(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_marginLeft(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_marginLeft(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_marginRight(ITemplatePrinter* This,LONG v) {
    return This->lpVtbl->put_marginRight(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_marginRight(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_marginRight(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_marginTop(ITemplatePrinter* This,LONG v) {
    return This->lpVtbl->put_marginTop(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_marginTop(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_marginTop(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_put_marginBottom(ITemplatePrinter* This,LONG v) {
    return This->lpVtbl->put_marginBottom(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_marginBottom(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_marginBottom(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_pageWidth(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_pageWidth(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_pageHeight(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_pageHeight(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_unprintableLeft(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_unprintableLeft(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_unprintableTop(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_unprintableTop(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_unprintableRight(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_unprintableRight(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter_get_unprintableBottom(ITemplatePrinter* This,LONG *p) {
    return This->lpVtbl->get_unprintableBottom(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITemplatePrinter2_QueryInterface(ITemplatePrinter2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITemplatePrinter2_AddRef(ITemplatePrinter2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITemplatePrinter2_Release(ITemplatePrinter2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ITemplatePrinter2_GetTypeInfoCount(ITemplatePrinter2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_GetTypeInfo(ITemplatePrinter2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITemplatePrinter2_startDoc(ITemplatePrinter2* This,BSTR bstrTitle,VARIANT_BOOL *p) {
    return This->lpVtbl->startDoc(This,bstrTitle,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_stopDoc(ITemplatePrinter2* This) {
    return This->lpVtbl->stopDoc(This);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_printBlankPage(ITemplatePrinter2* This) {
    return This->lpVtbl->printBlankPage(This);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_printPage(ITemplatePrinter2* This,IDispatch *pElemDisp) {
    return This->lpVtbl->printPage(This,pElemDisp);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_ensurePrintDialogDefaults(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->ensurePrintDialogDefaults(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_showPrintDialog(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->showPrintDialog(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_showPageSetupDialog(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->showPageSetupDialog(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_printNonNative(ITemplatePrinter2* This,IUnknown *pMarkup,VARIANT_BOOL *p) {
    return This->lpVtbl->printNonNative(This,pMarkup,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_printNonNativeFrames(ITemplatePrinter2* This,IUnknown *pMarkup,VARIANT_BOOL fActiveFrame) {
    return This->lpVtbl->printNonNativeFrames(This,pMarkup,fActiveFrame);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_framesetDocument(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_framesetDocument(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_framesetDocument(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_framesetDocument(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_frameActive(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameActive(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_frameActive(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameActive(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_frameAsShown(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameAsShown(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_frameAsShown(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameAsShown(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_selection(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selection(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_selection(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selection(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_selectedPages(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selectedPages(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_selectedPages(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selectedPages(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_currentPage(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_currentPage(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_currentPage(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_currentPage(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_currentPageAvail(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_currentPageAvail(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_currentPageAvail(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_currentPageAvail(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_collate(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_collate(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_collate(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_collate(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_duplex(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_duplex(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_copies(ITemplatePrinter2* This,USHORT v) {
    return This->lpVtbl->put_copies(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_copies(ITemplatePrinter2* This,USHORT *p) {
    return This->lpVtbl->get_copies(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_pageFrom(ITemplatePrinter2* This,USHORT v) {
    return This->lpVtbl->put_pageFrom(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_pageFrom(ITemplatePrinter2* This,USHORT *p) {
    return This->lpVtbl->get_pageFrom(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_pageTo(ITemplatePrinter2* This,USHORT v) {
    return This->lpVtbl->put_pageTo(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_pageTo(ITemplatePrinter2* This,USHORT *p) {
    return This->lpVtbl->get_pageTo(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_tableOfLinks(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_tableOfLinks(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_tableOfLinks(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_tableOfLinks(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_allLinkedDocuments(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_allLinkedDocuments(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_allLinkedDocuments(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_allLinkedDocuments(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_header(ITemplatePrinter2* This,BSTR v) {
    return This->lpVtbl->put_header(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_header(ITemplatePrinter2* This,BSTR *p) {
    return This->lpVtbl->get_header(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_footer(ITemplatePrinter2* This,BSTR v) {
    return This->lpVtbl->put_footer(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_footer(ITemplatePrinter2* This,BSTR *p) {
    return This->lpVtbl->get_footer(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_marginLeft(ITemplatePrinter2* This,LONG v) {
    return This->lpVtbl->put_marginLeft(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_marginLeft(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_marginLeft(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_marginRight(ITemplatePrinter2* This,LONG v) {
    return This->lpVtbl->put_marginRight(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_marginRight(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_marginRight(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_marginTop(ITemplatePrinter2* This,LONG v) {
    return This->lpVtbl->put_marginTop(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_marginTop(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_marginTop(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_marginBottom(ITemplatePrinter2* This,LONG v) {
    return This->lpVtbl->put_marginBottom(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_marginBottom(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_marginBottom(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_pageWidth(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_pageWidth(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_pageHeight(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_pageHeight(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_unprintableLeft(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_unprintableLeft(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_unprintableTop(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_unprintableTop(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_unprintableRight(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_unprintableRight(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_unprintableBottom(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->get_unprintableBottom(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_updatePageStatus(ITemplatePrinter2* This,LONG *p) {
    return This->lpVtbl->updatePageStatus(This,p);
}
/*** ITemplatePrinter2 methods ***/
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_selectionEnabled(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selectionEnabled(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_selectionEnabled(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selectionEnabled(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_frameActiveEnabled(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameActiveEnabled(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_frameActiveEnabled(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameActiveEnabled(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_orientation(ITemplatePrinter2* This,BSTR v) {
    return This->lpVtbl->put_orientation(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_orientation(ITemplatePrinter2* This,BSTR *p) {
    return This->lpVtbl->get_orientation(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_put_usePrinterCopyCollate(ITemplatePrinter2* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_usePrinterCopyCollate(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter2_get_usePrinterCopyCollate(ITemplatePrinter2* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_usePrinterCopyCollate(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITemplatePrinter3_QueryInterface(ITemplatePrinter3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITemplatePrinter3_AddRef(ITemplatePrinter3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITemplatePrinter3_Release(ITemplatePrinter3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ITemplatePrinter3_GetTypeInfoCount(ITemplatePrinter3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_GetTypeInfo(ITemplatePrinter3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITemplatePrinter3_startDoc(ITemplatePrinter3* This,BSTR bstrTitle,VARIANT_BOOL *p) {
    return This->lpVtbl->startDoc(This,bstrTitle,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_stopDoc(ITemplatePrinter3* This) {
    return This->lpVtbl->stopDoc(This);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_printBlankPage(ITemplatePrinter3* This) {
    return This->lpVtbl->printBlankPage(This);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_printPage(ITemplatePrinter3* This,IDispatch *pElemDisp) {
    return This->lpVtbl->printPage(This,pElemDisp);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_ensurePrintDialogDefaults(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->ensurePrintDialogDefaults(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_showPrintDialog(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->showPrintDialog(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_showPageSetupDialog(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->showPageSetupDialog(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_printNonNative(ITemplatePrinter3* This,IUnknown *pMarkup,VARIANT_BOOL *p) {
    return This->lpVtbl->printNonNative(This,pMarkup,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_printNonNativeFrames(ITemplatePrinter3* This,IUnknown *pMarkup,VARIANT_BOOL fActiveFrame) {
    return This->lpVtbl->printNonNativeFrames(This,pMarkup,fActiveFrame);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_framesetDocument(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_framesetDocument(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_framesetDocument(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_framesetDocument(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_frameActive(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameActive(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_frameActive(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameActive(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_frameAsShown(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameAsShown(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_frameAsShown(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameAsShown(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_selection(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selection(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_selection(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selection(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_selectedPages(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selectedPages(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_selectedPages(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selectedPages(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_currentPage(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_currentPage(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_currentPage(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_currentPage(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_currentPageAvail(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_currentPageAvail(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_currentPageAvail(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_currentPageAvail(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_collate(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_collate(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_collate(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_collate(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_duplex(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_duplex(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_copies(ITemplatePrinter3* This,USHORT v) {
    return This->lpVtbl->put_copies(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_copies(ITemplatePrinter3* This,USHORT *p) {
    return This->lpVtbl->get_copies(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_pageFrom(ITemplatePrinter3* This,USHORT v) {
    return This->lpVtbl->put_pageFrom(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_pageFrom(ITemplatePrinter3* This,USHORT *p) {
    return This->lpVtbl->get_pageFrom(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_pageTo(ITemplatePrinter3* This,USHORT v) {
    return This->lpVtbl->put_pageTo(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_pageTo(ITemplatePrinter3* This,USHORT *p) {
    return This->lpVtbl->get_pageTo(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_tableOfLinks(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_tableOfLinks(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_tableOfLinks(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_tableOfLinks(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_allLinkedDocuments(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_allLinkedDocuments(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_allLinkedDocuments(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_allLinkedDocuments(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_header(ITemplatePrinter3* This,BSTR v) {
    return This->lpVtbl->put_header(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_header(ITemplatePrinter3* This,BSTR *p) {
    return This->lpVtbl->get_header(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_footer(ITemplatePrinter3* This,BSTR v) {
    return This->lpVtbl->put_footer(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_footer(ITemplatePrinter3* This,BSTR *p) {
    return This->lpVtbl->get_footer(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_marginLeft(ITemplatePrinter3* This,LONG v) {
    return This->lpVtbl->put_marginLeft(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_marginLeft(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_marginLeft(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_marginRight(ITemplatePrinter3* This,LONG v) {
    return This->lpVtbl->put_marginRight(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_marginRight(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_marginRight(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_marginTop(ITemplatePrinter3* This,LONG v) {
    return This->lpVtbl->put_marginTop(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_marginTop(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_marginTop(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_marginBottom(ITemplatePrinter3* This,LONG v) {
    return This->lpVtbl->put_marginBottom(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_marginBottom(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_marginBottom(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_pageWidth(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_pageWidth(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_pageHeight(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_pageHeight(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_unprintableLeft(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_unprintableLeft(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_unprintableTop(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_unprintableTop(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_unprintableRight(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_unprintableRight(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_unprintableBottom(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->get_unprintableBottom(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_updatePageStatus(ITemplatePrinter3* This,LONG *p) {
    return This->lpVtbl->updatePageStatus(This,p);
}
/*** ITemplatePrinter2 methods ***/
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_selectionEnabled(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_selectionEnabled(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_selectionEnabled(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_selectionEnabled(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_frameActiveEnabled(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_frameActiveEnabled(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_frameActiveEnabled(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_frameActiveEnabled(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_orientation(ITemplatePrinter3* This,BSTR v) {
    return This->lpVtbl->put_orientation(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_orientation(ITemplatePrinter3* This,BSTR *p) {
    return This->lpVtbl->get_orientation(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_usePrinterCopyCollate(ITemplatePrinter3* This,VARIANT_BOOL v) {
    return This->lpVtbl->put_usePrinterCopyCollate(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_usePrinterCopyCollate(ITemplatePrinter3* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_usePrinterCopyCollate(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_deviceSupports(ITemplatePrinter3* This,BSTR bstrProperty,VARIANT *pvar) {
    return This->lpVtbl->deviceSupports(This,bstrProperty,pvar);
}
/*** ITemplatePrinter3 methods ***/
static __WIDL_INLINE HRESULT ITemplatePrinter3_put_headerFooterFont(ITemplatePrinter3* This,BSTR v) {
    return This->lpVtbl->put_headerFooterFont(This,v);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_get_headerFooterFont(ITemplatePrinter3* This,BSTR *p) {
    return This->lpVtbl->get_headerFooterFont(This,p);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_getPageMarginTop(ITemplatePrinter3* This,IDispatch *pageRule,LONG pageWidth,LONG pageHeight,VARIANT *pMargin) {
    return This->lpVtbl->getPageMarginTop(This,pageRule,pageWidth,pageHeight,pMargin);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_getPageMarginRight(ITemplatePrinter3* This,IDispatch *pageRule,LONG pageWidth,LONG pageHeight,VARIANT *pMargin) {
    return This->lpVtbl->getPageMarginRight(This,pageRule,pageWidth,pageHeight,pMargin);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_getPageMarginBottom(ITemplatePrinter3* This,IDispatch *pageRule,LONG pageWidth,LONG pageHeight,VARIANT *pMargin) {
    return This->lpVtbl->getPageMarginBottom(This,pageRule,pageWidth,pageHeight,pMargin);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_getPageMarginLeft(ITemplatePrinter3* This,IDispatch *pageRule,LONG pageWidth,LONG pageHeight,VARIANT *pMargin) {
    return This->lpVtbl->getPageMarginLeft(This,pageRule,pageWidth,pageHeight,pMargin);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_getPageMarginTopImportant(ITemplatePrinter3* This,IDispatch *pageRule,VARIANT_BOOL *pbImportant) {
    return This->lpVtbl->getPageMarginTopImportant(This,pageRule,pbImportant);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_getPageMarginRightImportant(ITemplatePrinter3* This,IDispatch *pageRule,VARIANT_BOOL *pbImportant) {
    return This->lpVtbl->getPageMarginRightImportant(This,pageRule,pbImportant);
}
static __WIDL_INLINE HRESULT ITemplatePrinter3_getPageMarginBottomImportant(ITemplatePrinter3* This,IDispatch *pageRule,VARIANT_BOOL *pbImportant) {
    return This->lpVtbl->getPageMarginBottomImportant(This,pageRule,pbImportant);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IPrintManagerTemplatePrinter_QueryInterface(IPrintManagerTemplatePrinter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IPrintManagerTemplatePrinter_AddRef(IPrintManagerTemplatePrinter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IPrintManagerTemplatePrinter_Release(IPrintManagerTemplatePrinter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IPrintManagerTemplatePrinter_GetTypeInfoCount(IPrintManagerTemplatePrinter* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IPrintManagerTemplatePrinter_GetTypeInfo(IPrintManagerTemplatePrinter* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IPrintManagerTemplatePrinter_startPrint(IPrintManagerTemplatePrinter* This) {
    return This->lpVtbl->startPrint(This);
}
static __WIDL_INLINE HRESULT IPrintManagerTemplatePrinter_drawPreviewPage(IPrintManagerTemplatePrinter* This,IDispatch *pElemDisp,LONG nPage) {
    return This->lpVtbl->drawPreviewPage(This,pElemDisp,nPage);
}
static __WIDL_INLINE HRESULT IPrintManagerTemplatePrinter_setPageCount(IPrintManagerTemplatePrinter* This,LONG nPage) {
    return This->lpVtbl->setPageCount(This,nPage);
}
static __WIDL_INLINE HRESULT IPrintManagerTemplatePrinter_invalidatePreview(IPrintManagerTemplatePrinter* This) {
    return This->lpVtbl->invalidatePreview(This);
}
static __WIDL_INLINE HRESULT IPrintManagerTemplatePrinter_getPrintTaskOptionValue(IPrintManagerTemplatePrinter* This,BSTR bstrKey,VARIANT *pvarin) {
    return This->lpVtbl->getPrintTaskOptionValue(This,bstrKey,pvarin);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispCPrintManagerTemplatePrinter_QueryInterface(DispCPrintManagerTemplatePrinter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispCPrintManagerTemplatePrinter_AddRef(DispCPrintManagerTemplatePrinter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispCPrintManagerTemplatePrinter_Release(DispCPrintManagerTemplatePrinter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispCPrintManagerTemplatePrinter_GetTypeInfoCount(DispCPrintManagerTemplatePrinter* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispCPrintManagerTemplatePrinter_GetTypeInfo(DispCPrintManagerTemplatePrinter* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTextPathElement_QueryInterface(ISVGTextPathElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISVGTextPathElement_AddRef(ISVGTextPathElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISVGTextPathElement_Release(ISVGTextPathElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISVGTextPathElement_GetTypeInfoCount(ISVGTextPathElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISVGTextPathElement_GetTypeInfo(ISVGTextPathElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISVGTextPathElement_putref_startOffset(ISVGTextPathElement* This,ISVGAnimatedLength *v) {
    return This->lpVtbl->putref_startOffset(This,v);
}
static __WIDL_INLINE HRESULT ISVGTextPathElement_get_startOffset(ISVGTextPathElement* This,ISVGAnimatedLength **p) {
    return This->lpVtbl->get_startOffset(This,p);
}
static __WIDL_INLINE HRESULT ISVGTextPathElement_putref_method(ISVGTextPathElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_method(This,v);
}
static __WIDL_INLINE HRESULT ISVGTextPathElement_get_method(ISVGTextPathElement* This,ISVGAnimatedEnumeration **p) {
    return This->lpVtbl->get_method(This,p);
}
static __WIDL_INLINE HRESULT ISVGTextPathElement_putref_spacing(ISVGTextPathElement* This,ISVGAnimatedEnumeration *v) {
    return This->lpVtbl->putref_spacing(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispSVGTextPathElement_QueryInterface(DispSVGTextPathElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispSVGTextPathElement_AddRef(DispSVGTextPathElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispSVGTextPathElement_Release(DispSVGTextPathElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispSVGTextPathElement_GetTypeInfoCount(DispSVGTextPathElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispSVGTextPathElement_GetTypeInfo(DispSVGTextPathElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMXmlSerializer_QueryInterface(IDOMXmlSerializer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMXmlSerializer_AddRef(IDOMXmlSerializer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMXmlSerializer_Release(IDOMXmlSerializer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMXmlSerializer_GetTypeInfoCount(IDOMXmlSerializer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMXmlSerializer_GetTypeInfo(IDOMXmlSerializer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMXmlSerializerFactory_QueryInterface(IDOMXmlSerializerFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMXmlSerializerFactory_AddRef(IDOMXmlSerializerFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMXmlSerializerFactory_Release(IDOMXmlSerializerFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMXmlSerializerFactory_GetTypeInfoCount(IDOMXmlSerializerFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMXmlSerializerFactory_GetTypeInfo(IDOMXmlSerializerFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMParser_QueryInterface(IDOMParser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMParser_AddRef(IDOMParser* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMParser_Release(IDOMParser* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMParser_GetTypeInfoCount(IDOMParser* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMParser_GetTypeInfo(IDOMParser* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMParserFactory_QueryInterface(IDOMParserFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMParserFactory_AddRef(IDOMParserFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMParserFactory_Release(IDOMParserFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMParserFactory_GetTypeInfoCount(IDOMParserFactory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMParserFactory_GetTypeInfo(IDOMParserFactory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispXMLSerializer_QueryInterface(DispXMLSerializer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispXMLSerializer_AddRef(DispXMLSerializer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispXMLSerializer_Release(DispXMLSerializer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispXMLSerializer_GetTypeInfoCount(DispXMLSerializer* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispXMLSerializer_GetTypeInfo(DispXMLSerializer* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMParser_QueryInterface(DispDOMParser* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMParser_AddRef(DispDOMParser* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMParser_Release(DispDOMParser* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMParser_GetTypeInfoCount(DispDOMParser* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMParser_GetTypeInfo(DispDOMParser* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLSemanticElement_QueryInterface(DispHTMLSemanticElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLSemanticElement_AddRef(DispHTMLSemanticElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLSemanticElement_Release(DispHTMLSemanticElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLSemanticElement_GetTypeInfoCount(DispHTMLSemanticElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLSemanticElement_GetTypeInfo(DispHTMLSemanticElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLProgressElement_QueryInterface(IHTMLProgressElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLProgressElement_AddRef(IHTMLProgressElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLProgressElement_Release(IHTMLProgressElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLProgressElement_GetTypeInfoCount(IHTMLProgressElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLProgressElement_GetTypeInfo(IHTMLProgressElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLProgressElement_put_value(IHTMLProgressElement* This,float v) {
    return This->lpVtbl->put_value(This,v);
}
static __WIDL_INLINE HRESULT IHTMLProgressElement_get_value(IHTMLProgressElement* This,float *p) {
    return This->lpVtbl->get_value(This,p);
}
static __WIDL_INLINE HRESULT IHTMLProgressElement_put_max(IHTMLProgressElement* This,float v) {
    return This->lpVtbl->put_max(This,v);
}
static __WIDL_INLINE HRESULT IHTMLProgressElement_get_max(IHTMLProgressElement* This,float *p) {
    return This->lpVtbl->get_max(This,p);
}
static __WIDL_INLINE HRESULT IHTMLProgressElement_get_position(IHTMLProgressElement* This,float *p) {
    return This->lpVtbl->get_position(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLProgressElement_QueryInterface(DispHTMLProgressElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLProgressElement_AddRef(DispHTMLProgressElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLProgressElement_Release(DispHTMLProgressElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLProgressElement_GetTypeInfoCount(DispHTMLProgressElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLProgressElement_GetTypeInfo(DispHTMLProgressElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMSTransitionEvent_QueryInterface(IDOMMSTransitionEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMMSTransitionEvent_AddRef(IDOMMSTransitionEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMMSTransitionEvent_Release(IDOMMSTransitionEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMMSTransitionEvent_GetTypeInfoCount(IDOMMSTransitionEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMMSTransitionEvent_GetTypeInfo(IDOMMSTransitionEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMSTransitionEvent_get_propertyName(IDOMMSTransitionEvent* This,BSTR *p) {
    return This->lpVtbl->get_propertyName(This,p);
}
static __WIDL_INLINE HRESULT IDOMMSTransitionEvent_get_elapsedTime(IDOMMSTransitionEvent* This,float *p) {
    return This->lpVtbl->get_elapsedTime(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMMSTransitionEvent_QueryInterface(DispDOMMSTransitionEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMMSTransitionEvent_AddRef(DispDOMMSTransitionEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMMSTransitionEvent_Release(DispDOMMSTransitionEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMMSTransitionEvent_GetTypeInfoCount(DispDOMMSTransitionEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMMSTransitionEvent_GetTypeInfo(DispDOMMSTransitionEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMSAnimationEvent_QueryInterface(IDOMMSAnimationEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMMSAnimationEvent_AddRef(IDOMMSAnimationEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMMSAnimationEvent_Release(IDOMMSAnimationEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMMSAnimationEvent_GetTypeInfoCount(IDOMMSAnimationEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMMSAnimationEvent_GetTypeInfo(IDOMMSAnimationEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMSAnimationEvent_get_animationName(IDOMMSAnimationEvent* This,BSTR *p) {
    return This->lpVtbl->get_animationName(This,p);
}
static __WIDL_INLINE HRESULT IDOMMSAnimationEvent_get_elapsedTime(IDOMMSAnimationEvent* This,float *p) {
    return This->lpVtbl->get_elapsedTime(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMMSAnimationEvent_QueryInterface(DispDOMMSAnimationEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMMSAnimationEvent_AddRef(DispDOMMSAnimationEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMMSAnimationEvent_Release(DispDOMMSAnimationEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMMSAnimationEvent_GetTypeInfoCount(DispDOMMSAnimationEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMMSAnimationEvent_GetTypeInfo(DispDOMMSAnimationEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWebGeolocation_QueryInterface(IWebGeolocation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWebGeolocation_AddRef(IWebGeolocation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWebGeolocation_Release(IWebGeolocation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWebGeolocation_GetTypeInfoCount(IWebGeolocation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWebGeolocation_GetTypeInfo(IWebGeolocation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWebGeolocation_getCurrentPosition(IWebGeolocation* This,IDispatch *successCallback,IDispatch *errorCallback,IDispatch *options) {
    return This->lpVtbl->getCurrentPosition(This,successCallback,errorCallback,options);
}
static __WIDL_INLINE HRESULT IWebGeolocation_watchPosition(IWebGeolocation* This,IDispatch *successCallback,IDispatch *errorCallback,IDispatch *options,LONG *watchId) {
    return This->lpVtbl->watchPosition(This,successCallback,errorCallback,options,watchId);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWebGeocoordinates_QueryInterface(IWebGeocoordinates* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWebGeocoordinates_AddRef(IWebGeocoordinates* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWebGeocoordinates_Release(IWebGeocoordinates* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWebGeocoordinates_GetTypeInfoCount(IWebGeocoordinates* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWebGeocoordinates_GetTypeInfo(IWebGeocoordinates* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWebGeocoordinates_get_latitude(IWebGeocoordinates* This,double *p) {
    return This->lpVtbl->get_latitude(This,p);
}
static __WIDL_INLINE HRESULT IWebGeocoordinates_get_longitude(IWebGeocoordinates* This,double *p) {
    return This->lpVtbl->get_longitude(This,p);
}
static __WIDL_INLINE HRESULT IWebGeocoordinates_get_altitude(IWebGeocoordinates* This,VARIANT *p) {
    return This->lpVtbl->get_altitude(This,p);
}
static __WIDL_INLINE HRESULT IWebGeocoordinates_get_accuracy(IWebGeocoordinates* This,double *p) {
    return This->lpVtbl->get_accuracy(This,p);
}
static __WIDL_INLINE HRESULT IWebGeocoordinates_get_altitudeAccuracy(IWebGeocoordinates* This,VARIANT *p) {
    return This->lpVtbl->get_altitudeAccuracy(This,p);
}
static __WIDL_INLINE HRESULT IWebGeocoordinates_get_heading(IWebGeocoordinates* This,VARIANT *p) {
    return This->lpVtbl->get_heading(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWebGeopositionError_QueryInterface(IWebGeopositionError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWebGeopositionError_AddRef(IWebGeopositionError* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWebGeopositionError_Release(IWebGeopositionError* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWebGeopositionError_GetTypeInfoCount(IWebGeopositionError* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWebGeopositionError_GetTypeInfo(IWebGeopositionError* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWebGeopositionError_get_code(IWebGeopositionError* This,LONG *p) {
    return This->lpVtbl->get_code(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWebGeoposition_QueryInterface(IWebGeoposition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWebGeoposition_AddRef(IWebGeoposition* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWebGeoposition_Release(IWebGeoposition* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IWebGeoposition_GetTypeInfoCount(IWebGeoposition* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IWebGeoposition_GetTypeInfo(IWebGeoposition* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWebGeoposition_get_coords(IWebGeoposition* This,IWebGeocoordinates **p) {
    return This->lpVtbl->get_coords(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispWebGeolocation_QueryInterface(DispWebGeolocation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispWebGeolocation_AddRef(DispWebGeolocation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispWebGeolocation_Release(DispWebGeolocation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispWebGeolocation_GetTypeInfoCount(DispWebGeolocation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispWebGeolocation_GetTypeInfo(DispWebGeolocation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispWebGeocoordinates_QueryInterface(DispWebGeocoordinates* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispWebGeocoordinates_AddRef(DispWebGeocoordinates* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispWebGeocoordinates_Release(DispWebGeocoordinates* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispWebGeocoordinates_GetTypeInfoCount(DispWebGeocoordinates* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispWebGeocoordinates_GetTypeInfo(DispWebGeocoordinates* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispWebGeopositionError_QueryInterface(DispWebGeopositionError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispWebGeopositionError_AddRef(DispWebGeopositionError* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispWebGeopositionError_Release(DispWebGeopositionError* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispWebGeopositionError_GetTypeInfoCount(DispWebGeopositionError* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispWebGeopositionError_GetTypeInfo(DispWebGeopositionError* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispWebGeoposition_QueryInterface(DispWebGeoposition* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispWebGeoposition_AddRef(DispWebGeoposition* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispWebGeoposition_Release(DispWebGeoposition* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispWebGeoposition_GetTypeInfoCount(DispWebGeoposition* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispWebGeoposition_GetTypeInfo(DispWebGeoposition* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IClientCaps_QueryInterface(IClientCaps* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IClientCaps_AddRef(IClientCaps* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IClientCaps_Release(IClientCaps* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IClientCaps_GetTypeInfoCount(IClientCaps* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IClientCaps_GetTypeInfo(IClientCaps* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IClientCaps_get_javaEnabled(IClientCaps* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_javaEnabled(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_get_cookieEnabled(IClientCaps* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_cookieEnabled(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_get_cpuClass(IClientCaps* This,BSTR *p) {
    return This->lpVtbl->get_cpuClass(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_get_systemLanguage(IClientCaps* This,BSTR *p) {
    return This->lpVtbl->get_systemLanguage(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_get_userLanguage(IClientCaps* This,BSTR *p) {
    return This->lpVtbl->get_userLanguage(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_get_platform(IClientCaps* This,BSTR *p) {
    return This->lpVtbl->get_platform(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_get_connectionSpeed(IClientCaps* This,LONG *p) {
    return This->lpVtbl->get_connectionSpeed(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_get_onLine(IClientCaps* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_onLine(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_get_colorDepth(IClientCaps* This,LONG *p) {
    return This->lpVtbl->get_colorDepth(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_get_bufferDepth(IClientCaps* This,LONG *p) {
    return This->lpVtbl->get_bufferDepth(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_get_width(IClientCaps* This,LONG *p) {
    return This->lpVtbl->get_width(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_get_height(IClientCaps* This,LONG *p) {
    return This->lpVtbl->get_height(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_get_availHeight(IClientCaps* This,LONG *p) {
    return This->lpVtbl->get_availHeight(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_get_availWidth(IClientCaps* This,LONG *p) {
    return This->lpVtbl->get_availWidth(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_get_connectionType(IClientCaps* This,BSTR *p) {
    return This->lpVtbl->get_connectionType(This,p);
}
static __WIDL_INLINE HRESULT IClientCaps_isComponentInstalled(IClientCaps* This,BSTR bstrName,BSTR bstrUrl,BSTR bStrVer,VARIANT_BOOL *p) {
    return This->lpVtbl->isComponentInstalled(This,bstrName,bstrUrl,bStrVer,p);
}
static __WIDL_INLINE HRESULT IClientCaps_getComponentVersion(IClientCaps* This,BSTR bstrName,BSTR bstrUrl,BSTR *pbstrVer) {
    return This->lpVtbl->getComponentVersion(This,bstrName,bstrUrl,pbstrVer);
}
static __WIDL_INLINE HRESULT IClientCaps_compareVersions(IClientCaps* This,BSTR bstrVer1,BSTR bstrVer2,LONG *p) {
    return This->lpVtbl->compareVersions(This,bstrVer1,bstrVer2,p);
}
static __WIDL_INLINE HRESULT IClientCaps_addComponentRequest(IClientCaps* This,BSTR bstrName,BSTR bstrUrl,BSTR bStrVer) {
    return This->lpVtbl->addComponentRequest(This,bstrName,bstrUrl,bStrVer);
}
static __WIDL_INLINE HRESULT IClientCaps_doComponentRequest(IClientCaps* This,VARIANT_BOOL *p) {
    return This->lpVtbl->doComponentRequest(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMSManipulationEvent_QueryInterface(IDOMMSManipulationEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMMSManipulationEvent_AddRef(IDOMMSManipulationEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMMSManipulationEvent_Release(IDOMMSManipulationEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMMSManipulationEvent_GetTypeInfoCount(IDOMMSManipulationEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMMSManipulationEvent_GetTypeInfo(IDOMMSManipulationEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMMSManipulationEvent_get_lastState(IDOMMSManipulationEvent* This,LONG *p) {
    return This->lpVtbl->get_lastState(This,p);
}
static __WIDL_INLINE HRESULT IDOMMSManipulationEvent_get_currentState(IDOMMSManipulationEvent* This,LONG *p) {
    return This->lpVtbl->get_currentState(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMMSManipulationEvent_QueryInterface(DispDOMMSManipulationEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMMSManipulationEvent_AddRef(DispDOMMSManipulationEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMMSManipulationEvent_Release(DispDOMMSManipulationEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMMSManipulationEvent_GetTypeInfoCount(DispDOMMSManipulationEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMMSManipulationEvent_GetTypeInfo(DispDOMMSManipulationEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMCloseEvent_QueryInterface(IDOMCloseEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMCloseEvent_AddRef(IDOMCloseEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMCloseEvent_Release(IDOMCloseEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDOMCloseEvent_GetTypeInfoCount(IDOMCloseEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDOMCloseEvent_GetTypeInfo(IDOMCloseEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMCloseEvent_get_wasClean(IDOMCloseEvent* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_wasClean(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispDOMCloseEvent_QueryInterface(DispDOMCloseEvent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispDOMCloseEvent_AddRef(DispDOMCloseEvent* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispDOMCloseEvent_Release(DispDOMCloseEvent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispDOMCloseEvent_GetTypeInfoCount(DispDOMCloseEvent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispDOMCloseEvent_GetTypeInfo(DispDOMCloseEvent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLApplicationCache_QueryInterface(IHTMLApplicationCache* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLApplicationCache_AddRef(IHTMLApplicationCache* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLApplicationCache_Release(IHTMLApplicationCache* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLApplicationCache_GetTypeInfoCount(IHTMLApplicationCache* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_GetTypeInfo(IHTMLApplicationCache* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLApplicationCache_get_status(IHTMLApplicationCache* This,LONG *p) {
    return This->lpVtbl->get_status(This,p);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_put_onchecking(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_onchecking(This,v);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_get_onchecking(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_onchecking(This,p);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_put_onerror(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_onerror(This,v);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_get_onerror(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_onerror(This,p);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_put_onnoupdate(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_onnoupdate(This,v);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_get_onnoupdate(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_onnoupdate(This,p);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_put_ondownloading(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_ondownloading(This,v);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_get_ondownloading(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_ondownloading(This,p);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_put_onprogress(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_onprogress(This,v);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_get_onprogress(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_onprogress(This,p);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_put_onupdateready(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_onupdateready(This,v);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_get_onupdateready(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_onupdateready(This,p);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_put_oncached(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_oncached(This,v);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_get_oncached(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_oncached(This,p);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_put_onobsolete(IHTMLApplicationCache* This,VARIANT v) {
    return This->lpVtbl->put_onobsolete(This,v);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_get_onobsolete(IHTMLApplicationCache* This,VARIANT *p) {
    return This->lpVtbl->get_onobsolete(This,p);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_update(IHTMLApplicationCache* This) {
    return This->lpVtbl->update(This);
}
static __WIDL_INLINE HRESULT IHTMLApplicationCache_swapCache(IHTMLApplicationCache* This) {
    return This->lpVtbl->swapCache(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispApplicationCache_QueryInterface(DispApplicationCache* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispApplicationCache_AddRef(DispApplicationCache* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispApplicationCache_Release(DispApplicationCache* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispApplicationCache_GetTypeInfoCount(DispApplicationCache* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispApplicationCache_GetTypeInfo(DispApplicationCache* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICSSFilterSite_QueryInterface(ICSSFilterSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICSSFilterSite_AddRef(ICSSFilterSite* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICSSFilterSite_Release(ICSSFilterSite* This) {
    return This->lpVtbl->Release(This);
}
/*** ICSSFilterSite methods ***/
static __WIDL_INLINE HRESULT ICSSFilterSite_GetElement(ICSSFilterSite* This,IHTMLElement **Element) {
    return This->lpVtbl->GetElement(This,Element);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICSSFilter_QueryInterface(ICSSFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICSSFilter_AddRef(ICSSFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICSSFilter_Release(ICSSFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** ICSSFilter methods ***/
static __WIDL_INLINE HRESULT ICSSFilter_SetSite(ICSSFilter* This,ICSSFilterSite *pSink) {
    return This->lpVtbl->SetSite(This,pSink);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISecureUrlHost_QueryInterface(ISecureUrlHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISecureUrlHost_AddRef(ISecureUrlHost* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISecureUrlHost_Release(ISecureUrlHost* This) {
    return This->lpVtbl->Release(This);
}
/*** ISecureUrlHost methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMarkupServices_QueryInterface(IMarkupServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMarkupServices_AddRef(IMarkupServices* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMarkupServices_Release(IMarkupServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IMarkupServices methods ***/
static __WIDL_INLINE HRESULT IMarkupServices_CreateMarkupPointer(IMarkupServices* This,IMarkupPointer **ppPointer) {
    return This->lpVtbl->CreateMarkupPointer(This,ppPointer);
}
static __WIDL_INLINE HRESULT IMarkupServices_CreateMarkupContainer(IMarkupServices* This,IMarkupContainer **ppMarkupContainer) {
    return This->lpVtbl->CreateMarkupContainer(This,ppMarkupContainer);
}
static __WIDL_INLINE HRESULT IMarkupServices_CreateElement(IMarkupServices* This,ELEMENT_TAG_ID tagID,OLECHAR *pchAttributes,IHTMLElement **ppElement) {
    return This->lpVtbl->CreateElement(This,tagID,pchAttributes,ppElement);
}
static __WIDL_INLINE HRESULT IMarkupServices_CloneElement(IMarkupServices* This,IHTMLElement *pElemCloneThis,IHTMLElement **ppElementTheClone) {
    return This->lpVtbl->CloneElement(This,pElemCloneThis,ppElementTheClone);
}
static __WIDL_INLINE HRESULT IMarkupServices_InsertElement(IMarkupServices* This,IHTMLElement *pElementInsert,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->InsertElement(This,pElementInsert,pPointerStart,pPointerFinish);
}
static __WIDL_INLINE HRESULT IMarkupServices_RemoveElement(IMarkupServices* This,IHTMLElement *pElementRemove) {
    return This->lpVtbl->RemoveElement(This,pElementRemove);
}
static __WIDL_INLINE HRESULT IMarkupServices_Remove(IMarkupServices* This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->Remove(This,pPointerStart,pPointerFinish);
}
static __WIDL_INLINE HRESULT IMarkupServices_Copy(IMarkupServices* This,IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget) {
    return This->lpVtbl->Copy(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget);
}
static __WIDL_INLINE HRESULT IMarkupServices_Move(IMarkupServices* This,IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget) {
    return This->lpVtbl->Move(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget);
}
static __WIDL_INLINE HRESULT IMarkupServices_InsertText(IMarkupServices* This,OLECHAR *pchText,LONG cch,IMarkupPointer *pPointerTarget) {
    return This->lpVtbl->InsertText(This,pchText,cch,pPointerTarget);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMarkupServices_IsScopedElement(IMarkupServices* This,IHTMLElement *pElement,WINBOOL *pfScoped) {
    return This->lpVtbl->IsScopedElement(This,pElement,pfScoped);
}
static __WIDL_INLINE HRESULT IMarkupServices_GetElementTagId(IMarkupServices* This,IHTMLElement *pElement,ELEMENT_TAG_ID *ptagId) {
    return This->lpVtbl->GetElementTagId(This,pElement,ptagId);
}
static __WIDL_INLINE HRESULT IMarkupServices_GetTagIDForName(IMarkupServices* This,BSTR bstrName,ELEMENT_TAG_ID *ptagId) {
    return This->lpVtbl->GetTagIDForName(This,bstrName,ptagId);
}
static __WIDL_INLINE HRESULT IMarkupServices_GetNameForTagID(IMarkupServices* This,ELEMENT_TAG_ID tagId,BSTR *pbstrName) {
    return This->lpVtbl->GetNameForTagID(This,tagId,pbstrName);
}
static __WIDL_INLINE HRESULT IMarkupServices_MovePointersToRange(IMarkupServices* This,IHTMLTxtRange *pIRange,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->MovePointersToRange(This,pIRange,pPointerStart,pPointerFinish);
}
static __WIDL_INLINE HRESULT IMarkupServices_MoveRangeToPointers(IMarkupServices* This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish,IHTMLTxtRange *pIRange) {
    return This->lpVtbl->MoveRangeToPointers(This,pPointerStart,pPointerFinish,pIRange);
}
static __WIDL_INLINE HRESULT IMarkupServices_BeginUndoUnit(IMarkupServices* This,OLECHAR *pchTitle) {
    return This->lpVtbl->BeginUndoUnit(This,pchTitle);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMarkupServices2_QueryInterface(IMarkupServices2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMarkupServices2_AddRef(IMarkupServices2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMarkupServices2_Release(IMarkupServices2* This) {
    return This->lpVtbl->Release(This);
}
/*** IMarkupServices methods ***/
static __WIDL_INLINE HRESULT IMarkupServices2_CreateMarkupPointer(IMarkupServices2* This,IMarkupPointer **ppPointer) {
    return This->lpVtbl->CreateMarkupPointer(This,ppPointer);
}
static __WIDL_INLINE HRESULT IMarkupServices2_CreateMarkupContainer(IMarkupServices2* This,IMarkupContainer **ppMarkupContainer) {
    return This->lpVtbl->CreateMarkupContainer(This,ppMarkupContainer);
}
static __WIDL_INLINE HRESULT IMarkupServices2_CreateElement(IMarkupServices2* This,ELEMENT_TAG_ID tagID,OLECHAR *pchAttributes,IHTMLElement **ppElement) {
    return This->lpVtbl->CreateElement(This,tagID,pchAttributes,ppElement);
}
static __WIDL_INLINE HRESULT IMarkupServices2_CloneElement(IMarkupServices2* This,IHTMLElement *pElemCloneThis,IHTMLElement **ppElementTheClone) {
    return This->lpVtbl->CloneElement(This,pElemCloneThis,ppElementTheClone);
}
static __WIDL_INLINE HRESULT IMarkupServices2_InsertElement(IMarkupServices2* This,IHTMLElement *pElementInsert,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->InsertElement(This,pElementInsert,pPointerStart,pPointerFinish);
}
static __WIDL_INLINE HRESULT IMarkupServices2_RemoveElement(IMarkupServices2* This,IHTMLElement *pElementRemove) {
    return This->lpVtbl->RemoveElement(This,pElementRemove);
}
static __WIDL_INLINE HRESULT IMarkupServices2_Remove(IMarkupServices2* This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->Remove(This,pPointerStart,pPointerFinish);
}
static __WIDL_INLINE HRESULT IMarkupServices2_Copy(IMarkupServices2* This,IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget) {
    return This->lpVtbl->Copy(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget);
}
static __WIDL_INLINE HRESULT IMarkupServices2_Move(IMarkupServices2* This,IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget) {
    return This->lpVtbl->Move(This,pPointerSourceStart,pPointerSourceFinish,pPointerTarget);
}
static __WIDL_INLINE HRESULT IMarkupServices2_InsertText(IMarkupServices2* This,OLECHAR *pchText,LONG cch,IMarkupPointer *pPointerTarget) {
    return This->lpVtbl->InsertText(This,pchText,cch,pPointerTarget);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMarkupServices2_IsScopedElement(IMarkupServices2* This,IHTMLElement *pElement,WINBOOL *pfScoped) {
    return This->lpVtbl->IsScopedElement(This,pElement,pfScoped);
}
static __WIDL_INLINE HRESULT IMarkupServices2_GetElementTagId(IMarkupServices2* This,IHTMLElement *pElement,ELEMENT_TAG_ID *ptagId) {
    return This->lpVtbl->GetElementTagId(This,pElement,ptagId);
}
static __WIDL_INLINE HRESULT IMarkupServices2_GetTagIDForName(IMarkupServices2* This,BSTR bstrName,ELEMENT_TAG_ID *ptagId) {
    return This->lpVtbl->GetTagIDForName(This,bstrName,ptagId);
}
static __WIDL_INLINE HRESULT IMarkupServices2_GetNameForTagID(IMarkupServices2* This,ELEMENT_TAG_ID tagId,BSTR *pbstrName) {
    return This->lpVtbl->GetNameForTagID(This,tagId,pbstrName);
}
static __WIDL_INLINE HRESULT IMarkupServices2_MovePointersToRange(IMarkupServices2* This,IHTMLTxtRange *pIRange,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) {
    return This->lpVtbl->MovePointersToRange(This,pIRange,pPointerStart,pPointerFinish);
}
static __WIDL_INLINE HRESULT IMarkupServices2_MoveRangeToPointers(IMarkupServices2* This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish,IHTMLTxtRange *pIRange) {
    return This->lpVtbl->MoveRangeToPointers(This,pPointerStart,pPointerFinish,pIRange);
}
static __WIDL_INLINE HRESULT IMarkupServices2_BeginUndoUnit(IMarkupServices2* This,OLECHAR *pchTitle) {
    return This->lpVtbl->BeginUndoUnit(This,pchTitle);
}
static __WIDL_INLINE HRESULT IMarkupServices2_EndUndoUnit(IMarkupServices2* This) {
    return This->lpVtbl->EndUndoUnit(This);
}
/*** IMarkupServices2 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMarkupContainer_QueryInterface(IMarkupContainer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMarkupContainer_AddRef(IMarkupContainer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMarkupContainer_Release(IMarkupContainer* This) {
    return This->lpVtbl->Release(This);
}
/*** IMarkupContainer methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMarkupContainer2_QueryInterface(IMarkupContainer2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMarkupContainer2_AddRef(IMarkupContainer2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMarkupContainer2_Release(IMarkupContainer2* This) {
    return This->lpVtbl->Release(This);
}
/*** IMarkupContainer methods ***/
static __WIDL_INLINE HRESULT IMarkupContainer2_OwningDoc(IMarkupContainer2* This,IHTMLDocument2 **ppDoc) {
    return This->lpVtbl->OwningDoc(This,ppDoc);
}
/*** IMarkupContainer2 methods ***/
static __WIDL_INLINE HRESULT IMarkupContainer2_CreateChangeLog(IMarkupContainer2* This,IHTMLChangeSink *pChangeSink,IHTMLChangeLog **ppChangeLog,WINBOOL fForward,WINBOOL fBackward) {
    return This->lpVtbl->CreateChangeLog(This,pChangeSink,ppChangeLog,fForward,fBackward);
}
static __WIDL_INLINE HRESULT IMarkupContainer2_RegisterForDirtyRange(IMarkupContainer2* This,IHTMLChangeSink *pChangeSink,DWORD *pdwCookie) {
    return This->lpVtbl->RegisterForDirtyRange(This,pChangeSink,pdwCookie);
}
static __WIDL_INLINE HRESULT IMarkupContainer2_UnRegisterForDirtyRange(IMarkupContainer2* This,DWORD dwCookie) {
    return This->lpVtbl->UnRegisterForDirtyRange(This,dwCookie);
}
static __WIDL_INLINE HRESULT IMarkupContainer2_GetAndClearDirtyRange(IMarkupContainer2* This,DWORD dwCookie,IMarkupPointer *pIPointerBegin,IMarkupPointer *pIPointerEnd) {
    return This->lpVtbl->GetAndClearDirtyRange(This,dwCookie,pIPointerBegin,pIPointerEnd);
}
static __WIDL_INLINE LONG IMarkupContainer2_GetVersionNumber(IMarkupContainer2* This) {
    return This->lpVtbl->GetVersionNumber(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLChangePlayback_QueryInterface(IHTMLChangePlayback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLChangePlayback_AddRef(IHTMLChangePlayback* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLChangePlayback_Release(IHTMLChangePlayback* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLChangePlayback methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMarkupPointer_QueryInterface(IMarkupPointer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMarkupPointer_AddRef(IMarkupPointer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMarkupPointer_Release(IMarkupPointer* This) {
    return This->lpVtbl->Release(This);
}
/*** IMarkupPointer methods ***/
static __WIDL_INLINE HRESULT IMarkupPointer_OwningDoc(IMarkupPointer* This,IHTMLDocument2 **ppDoc) {
    return This->lpVtbl->OwningDoc(This,ppDoc);
}
static __WIDL_INLINE HRESULT IMarkupPointer_Gravity(IMarkupPointer* This,POINTER_GRAVITY *pGravity) {
    return This->lpVtbl->Gravity(This,pGravity);
}
static __WIDL_INLINE HRESULT IMarkupPointer_SetGravity(IMarkupPointer* This,POINTER_GRAVITY Gravity) {
    return This->lpVtbl->SetGravity(This,Gravity);
}
static __WIDL_INLINE HRESULT IMarkupPointer_Cling(IMarkupPointer* This,WINBOOL *pfCling) {
    return This->lpVtbl->Cling(This,pfCling);
}
static __WIDL_INLINE HRESULT IMarkupPointer_SetCling(IMarkupPointer* This,WINBOOL fCLing) {
    return This->lpVtbl->SetCling(This,fCLing);
}
static __WIDL_INLINE HRESULT IMarkupPointer_Unposition(IMarkupPointer* This) {
    return This->lpVtbl->Unposition(This);
}
static __WIDL_INLINE HRESULT IMarkupPointer_IsPositioned(IMarkupPointer* This,WINBOOL *pfPositioned) {
    return This->lpVtbl->IsPositioned(This,pfPositioned);
}
static __WIDL_INLINE HRESULT IMarkupPointer_GetContainer(IMarkupPointer* This,IMarkupContainer **ppContainer) {
    return This->lpVtbl->GetContainer(This,ppContainer);
}
static __WIDL_INLINE HRESULT IMarkupPointer_MoveAdjacentToElement(IMarkupPointer* This,IHTMLElement *pElement,ELEMENT_ADJACENCY eAdj) {
    return This->lpVtbl->MoveAdjacentToElement(This,pElement,eAdj);
}
static __WIDL_INLINE HRESULT IMarkupPointer_MoveToPointer(IMarkupPointer* This,IMarkupPointer *pPointer) {
    return This->lpVtbl->MoveToPointer(This,pPointer);
}
static __WIDL_INLINE HRESULT IMarkupPointer_MoveToContainer(IMarkupPointer* This,IMarkupContainer *pContainer,WINBOOL fAtStart) {
    return This->lpVtbl->MoveToContainer(This,pContainer,fAtStart);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMarkupPointer_CurrentScope(IMarkupPointer* This,IHTMLElement **ppElemCurrent) {
    return This->lpVtbl->CurrentScope(This,ppElemCurrent);
}
static __WIDL_INLINE HRESULT IMarkupPointer_IsLeftOf(IMarkupPointer* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsLeftOf(This,pPointerThat,pfResult);
}
static __WIDL_INLINE HRESULT IMarkupPointer_IsLeftOfOrEqualTo(IMarkupPointer* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsLeftOfOrEqualTo(This,pPointerThat,pfResult);
}
static __WIDL_INLINE HRESULT IMarkupPointer_IsRightOf(IMarkupPointer* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsRightOf(This,pPointerThat,pfResult);
}
static __WIDL_INLINE HRESULT IMarkupPointer_IsRightOfOrEqualTo(IMarkupPointer* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsRightOfOrEqualTo(This,pPointerThat,pfResult);
}
static __WIDL_INLINE HRESULT IMarkupPointer_IsEqualTo(IMarkupPointer* This,IMarkupPointer *pPointerThat,WINBOOL *pfAreEqual) {
    return This->lpVtbl->IsEqualTo(This,pPointerThat,pfAreEqual);
}
static __WIDL_INLINE HRESULT IMarkupPointer_MoveUnit(IMarkupPointer* This,MOVEUNIT_ACTION muAction) {
    return This->lpVtbl->MoveUnit(This,muAction);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMarkupPointer2_QueryInterface(IMarkupPointer2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMarkupPointer2_AddRef(IMarkupPointer2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMarkupPointer2_Release(IMarkupPointer2* This) {
    return This->lpVtbl->Release(This);
}
/*** IMarkupPointer methods ***/
static __WIDL_INLINE HRESULT IMarkupPointer2_OwningDoc(IMarkupPointer2* This,IHTMLDocument2 **ppDoc) {
    return This->lpVtbl->OwningDoc(This,ppDoc);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_Gravity(IMarkupPointer2* This,POINTER_GRAVITY *pGravity) {
    return This->lpVtbl->Gravity(This,pGravity);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_SetGravity(IMarkupPointer2* This,POINTER_GRAVITY Gravity) {
    return This->lpVtbl->SetGravity(This,Gravity);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_Cling(IMarkupPointer2* This,WINBOOL *pfCling) {
    return This->lpVtbl->Cling(This,pfCling);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_SetCling(IMarkupPointer2* This,WINBOOL fCLing) {
    return This->lpVtbl->SetCling(This,fCLing);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_Unposition(IMarkupPointer2* This) {
    return This->lpVtbl->Unposition(This);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_IsPositioned(IMarkupPointer2* This,WINBOOL *pfPositioned) {
    return This->lpVtbl->IsPositioned(This,pfPositioned);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_GetContainer(IMarkupPointer2* This,IMarkupContainer **ppContainer) {
    return This->lpVtbl->GetContainer(This,ppContainer);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_MoveAdjacentToElement(IMarkupPointer2* This,IHTMLElement *pElement,ELEMENT_ADJACENCY eAdj) {
    return This->lpVtbl->MoveAdjacentToElement(This,pElement,eAdj);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_MoveToPointer(IMarkupPointer2* This,IMarkupPointer *pPointer) {
    return This->lpVtbl->MoveToPointer(This,pPointer);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_MoveToContainer(IMarkupPointer2* This,IMarkupContainer *pContainer,WINBOOL fAtStart) {
    return This->lpVtbl->MoveToContainer(This,pContainer,fAtStart);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMarkupPointer2_CurrentScope(IMarkupPointer2* This,IHTMLElement **ppElemCurrent) {
    return This->lpVtbl->CurrentScope(This,ppElemCurrent);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_IsLeftOf(IMarkupPointer2* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsLeftOf(This,pPointerThat,pfResult);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_IsLeftOfOrEqualTo(IMarkupPointer2* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsLeftOfOrEqualTo(This,pPointerThat,pfResult);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_IsRightOf(IMarkupPointer2* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsRightOf(This,pPointerThat,pfResult);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_IsRightOfOrEqualTo(IMarkupPointer2* This,IMarkupPointer *pPointerThat,WINBOOL *pfResult) {
    return This->lpVtbl->IsRightOfOrEqualTo(This,pPointerThat,pfResult);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_IsEqualTo(IMarkupPointer2* This,IMarkupPointer *pPointerThat,WINBOOL *pfAreEqual) {
    return This->lpVtbl->IsEqualTo(This,pPointerThat,pfAreEqual);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_MoveUnit(IMarkupPointer2* This,MOVEUNIT_ACTION muAction) {
    return This->lpVtbl->MoveUnit(This,muAction);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMarkupPointer2_IsAtWordBreak(IMarkupPointer2* This,WINBOOL *pfAtBreak) {
    return This->lpVtbl->IsAtWordBreak(This,pfAtBreak);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_GetMarkupPosition(IMarkupPointer2* This,LONG *plMP) {
    return This->lpVtbl->GetMarkupPosition(This,plMP);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_MoveToMarkupPosition(IMarkupPointer2* This,IMarkupContainer *pContainer,LONG lMP) {
    return This->lpVtbl->MoveToMarkupPosition(This,pContainer,lMP);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_MoveUnitBounded(IMarkupPointer2* This,MOVEUNIT_ACTION muAction,IMarkupPointer *pIBoundary) {
    return This->lpVtbl->MoveUnitBounded(This,muAction,pIBoundary);
}
static __WIDL_INLINE HRESULT IMarkupPointer2_IsInsideURL(IMarkupPointer2* This,IMarkupPointer *pRight,WINBOOL *pfResult) {
    return This->lpVtbl->IsInsideURL(This,pRight,pfResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IMarkupTextFrags_QueryInterface(IMarkupTextFrags* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMarkupTextFrags_AddRef(IMarkupTextFrags* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMarkupTextFrags_Release(IMarkupTextFrags* This) {
    return This->lpVtbl->Release(This);
}
/*** IMarkupTextFrags methods ***/
static __WIDL_INLINE HRESULT IMarkupTextFrags_GetTextFragCount(IMarkupTextFrags* This,LONG *pcFrags) {
    return This->lpVtbl->GetTextFragCount(This,pcFrags);
}
static __WIDL_INLINE HRESULT IMarkupTextFrags_GetTextFrag(IMarkupTextFrags* This,LONG iFrag,BSTR *pbstrFrag,IMarkupPointer *pPointerFrag) {
    return This->lpVtbl->GetTextFrag(This,iFrag,pbstrFrag,pPointerFrag);
}
static __WIDL_INLINE HRESULT IMarkupTextFrags_RemoveTextFrag(IMarkupTextFrags* This,LONG iFrag) {
    return This->lpVtbl->RemoveTextFrag(This,iFrag);
}
static __WIDL_INLINE HRESULT IMarkupTextFrags_InsertTextFrag(IMarkupTextFrags* This,LONG iFrag,BSTR bstrInsert,IMarkupPointer *pPointerInsert) {
    return This->lpVtbl->InsertTextFrag(This,iFrag,bstrInsert,pPointerInsert);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLChangeLog_QueryInterface(IHTMLChangeLog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLChangeLog_AddRef(IHTMLChangeLog* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLChangeLog_Release(IHTMLChangeLog* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLChangeLog methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLChangeSink_QueryInterface(IHTMLChangeSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLChangeSink_AddRef(IHTMLChangeSink* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLChangeSink_Release(IHTMLChangeSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLChangeSink methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IXMLGenericParse_QueryInterface(IXMLGenericParse* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLGenericParse_AddRef(IXMLGenericParse* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLGenericParse_Release(IXMLGenericParse* This) {
    return This->lpVtbl->Release(This);
}
/*** IXMLGenericParse methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEditHost_QueryInterface(IHTMLEditHost* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLEditHost_AddRef(IHTMLEditHost* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLEditHost_Release(IHTMLEditHost* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLEditHost methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEditHost2_QueryInterface(IHTMLEditHost2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLEditHost2_AddRef(IHTMLEditHost2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLEditHost2_Release(IHTMLEditHost2* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLEditHost methods ***/
static __WIDL_INLINE HRESULT IHTMLEditHost2_SnapRect(IHTMLEditHost2* This,IHTMLElement *pIElement,RECT *prcNew,ELEMENT_CORNER eHandle) {
    return This->lpVtbl->SnapRect(This,pIElement,prcNew,eHandle);
}
/*** IHTMLEditHost2 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISegment_QueryInterface(ISegment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISegment_AddRef(ISegment* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISegment_Release(ISegment* This) {
    return This->lpVtbl->Release(This);
}
/*** ISegment methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISegmentListIterator_QueryInterface(ISegmentListIterator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISegmentListIterator_AddRef(ISegmentListIterator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISegmentListIterator_Release(ISegmentListIterator* This) {
    return This->lpVtbl->Release(This);
}
/*** ISegmentListIterator methods ***/
static __WIDL_INLINE HRESULT ISegmentListIterator_Current(ISegmentListIterator* This,ISegment **ppISegment) {
    return This->lpVtbl->Current(This,ppISegment);
}
static __WIDL_INLINE HRESULT ISegmentListIterator_First(ISegmentListIterator* This) {
    return This->lpVtbl->First(This);
}
static __WIDL_INLINE HRESULT ISegmentListIterator_IsDone(ISegmentListIterator* This) {
    return This->lpVtbl->IsDone(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISegmentList_QueryInterface(ISegmentList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISegmentList_AddRef(ISegmentList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISegmentList_Release(ISegmentList* This) {
    return This->lpVtbl->Release(This);
}
/*** ISegmentList methods ***/
static __WIDL_INLINE HRESULT ISegmentList_CreateIterator(ISegmentList* This,ISegmentListIterator **ppIIter) {
    return This->lpVtbl->CreateIterator(This,ppIIter);
}
static __WIDL_INLINE HRESULT ISegmentList_GetType(ISegmentList* This,SELECTION_TYPE *peType) {
    return This->lpVtbl->GetType(This,peType);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISequenceNumber_QueryInterface(ISequenceNumber* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISequenceNumber_AddRef(ISequenceNumber* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISequenceNumber_Release(ISequenceNumber* This) {
    return This->lpVtbl->Release(This);
}
/*** ISequenceNumber methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IIMEServices_QueryInterface(IIMEServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IIMEServices_AddRef(IIMEServices* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IIMEServices_Release(IIMEServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IIMEServices methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLCaret_QueryInterface(IHTMLCaret* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLCaret_AddRef(IHTMLCaret* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLCaret_Release(IHTMLCaret* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLCaret methods ***/
static __WIDL_INLINE HRESULT IHTMLCaret_MoveCaretToPointer(IHTMLCaret* This,IDisplayPointer *pDispPointer,WINBOOL fScrollIntoView,CARET_DIRECTION eDir) {
    return This->lpVtbl->MoveCaretToPointer(This,pDispPointer,fScrollIntoView,eDir);
}
static __WIDL_INLINE HRESULT IHTMLCaret_MoveCaretToPointerEx(IHTMLCaret* This,IDisplayPointer *pDispPointer,WINBOOL fVisible,WINBOOL fScrollIntoView,CARET_DIRECTION eDir) {
    return This->lpVtbl->MoveCaretToPointerEx(This,pDispPointer,fVisible,fScrollIntoView,eDir);
}
static __WIDL_INLINE HRESULT IHTMLCaret_MoveMarkupPointerToCaret(IHTMLCaret* This,IMarkupPointer *pIMarkupPointer) {
    return This->lpVtbl->MoveMarkupPointerToCaret(This,pIMarkupPointer);
}
static __WIDL_INLINE HRESULT IHTMLCaret_MoveDisplayPointerToCaret(IHTMLCaret* This,IDisplayPointer *pDispPointer) {
    return This->lpVtbl->MoveDisplayPointerToCaret(This,pDispPointer);
}
static __WIDL_INLINE HRESULT IHTMLCaret_IsVisible(IHTMLCaret* This,WINBOOL *pIsVisible) {
    return This->lpVtbl->IsVisible(This,pIsVisible);
}
static __WIDL_INLINE HRESULT IHTMLCaret_Show(IHTMLCaret* This,WINBOOL fScrollIntoView) {
    return This->lpVtbl->Show(This,fScrollIntoView);
}
static __WIDL_INLINE HRESULT IHTMLCaret_Hide(IHTMLCaret* This) {
    return This->lpVtbl->Hide(This);
}
static __WIDL_INLINE HRESULT IHTMLCaret_InsertText(IHTMLCaret* This,OLECHAR *pText,LONG lLen) {
    return This->lpVtbl->InsertText(This,pText,lLen);
}
static __WIDL_INLINE HRESULT IHTMLCaret_ScrollIntoView(IHTMLCaret* This) {
    return This->lpVtbl->ScrollIntoView(This);
}
static __WIDL_INLINE HRESULT IHTMLCaret_GetLocation(IHTMLCaret* This,POINT *pPoint,WINBOOL fTranslate) {
    return This->lpVtbl->GetLocation(This,pPoint,fTranslate);
}
static __WIDL_INLINE HRESULT IHTMLCaret_GetCaretDirection(IHTMLCaret* This,CARET_DIRECTION *peDir) {
    return This->lpVtbl->GetCaretDirection(This,peDir);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHighlightRenderingServices_QueryInterface(IHighlightRenderingServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHighlightRenderingServices_AddRef(IHighlightRenderingServices* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHighlightRenderingServices_Release(IHighlightRenderingServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IHighlightRenderingServices methods ***/
static __WIDL_INLINE HRESULT IHighlightRenderingServices_AddSegment(IHighlightRenderingServices* This,IDisplayPointer *pDispPointerStart,IDisplayPointer *pDispPointerEnd,IHTMLRenderStyle *pIRenderStyle,IHighlightSegment **ppISegment) {
    return This->lpVtbl->AddSegment(This,pDispPointerStart,pDispPointerEnd,pIRenderStyle,ppISegment);
}
static __WIDL_INLINE HRESULT IHighlightRenderingServices_MoveSegmentToPointers(IHighlightRenderingServices* This,IHighlightSegment *pISegment,IDisplayPointer *pDispPointerStart,IDisplayPointer *pDispPointerEnd) {
    return This->lpVtbl->MoveSegmentToPointers(This,pISegment,pDispPointerStart,pDispPointerEnd);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISelectionServicesListener_QueryInterface(ISelectionServicesListener* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISelectionServicesListener_AddRef(ISelectionServicesListener* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISelectionServicesListener_Release(ISelectionServicesListener* This) {
    return This->lpVtbl->Release(This);
}
/*** ISelectionServicesListener methods ***/
static __WIDL_INLINE HRESULT ISelectionServicesListener_BeginSelectionUndo(ISelectionServicesListener* This) {
    return This->lpVtbl->BeginSelectionUndo(This);
}
static __WIDL_INLINE HRESULT ISelectionServicesListener_EndSelectionUndo(ISelectionServicesListener* This) {
    return This->lpVtbl->EndSelectionUndo(This);
}
static __WIDL_INLINE HRESULT ISelectionServicesListener_OnSelectedElementExit(ISelectionServicesListener* This,IMarkupPointer *pIElementStart,IMarkupPointer *pIElementEnd,IMarkupPointer *pIElementContentStart,IMarkupPointer *pIElementContentEnd) {
    return This->lpVtbl->OnSelectedElementExit(This,pIElementStart,pIElementEnd,pIElementContentStart,pIElementContentEnd);
}
static __WIDL_INLINE HRESULT ISelectionServicesListener_OnChangeType(ISelectionServicesListener* This,SELECTION_TYPE eType,ISelectionServicesListener *pIListener) {
    return This->lpVtbl->OnChangeType(This,eType,pIListener);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISelectionServices_QueryInterface(ISelectionServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISelectionServices_AddRef(ISelectionServices* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISelectionServices_Release(ISelectionServices* This) {
    return This->lpVtbl->Release(This);
}
/*** ISelectionServices methods ***/
static __WIDL_INLINE HRESULT ISelectionServices_SetSelectionType(ISelectionServices* This,SELECTION_TYPE eType,ISelectionServicesListener *pIListener) {
    return This->lpVtbl->SetSelectionType(This,eType,pIListener);
}
static __WIDL_INLINE HRESULT ISelectionServices_GetMarkupContainer(ISelectionServices* This,IMarkupContainer **ppIContainer) {
    return This->lpVtbl->GetMarkupContainer(This,ppIContainer);
}
static __WIDL_INLINE HRESULT ISelectionServices_AddSegment(ISelectionServices* This,IMarkupPointer *pIStart,IMarkupPointer *pIEnd,ISegment **ppISegmentAdded) {
    return This->lpVtbl->AddSegment(This,pIStart,pIEnd,ppISegmentAdded);
}
static __WIDL_INLINE HRESULT ISelectionServices_AddElementSegment(ISelectionServices* This,IHTMLElement *pIElement,IElementSegment **ppISegmentAdded) {
    return This->lpVtbl->AddElementSegment(This,pIElement,ppISegmentAdded);
}
static __WIDL_INLINE HRESULT ISelectionServices_RemoveSegment(ISelectionServices* This,ISegment *pISegment) {
    return This->lpVtbl->RemoveSegment(This,pISegment);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementSegment_QueryInterface(IElementSegment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementSegment_AddRef(IElementSegment* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementSegment_Release(IElementSegment* This) {
    return This->lpVtbl->Release(This);
}
/*** ISegment methods ***/
static __WIDL_INLINE HRESULT IElementSegment_GetPointers(IElementSegment* This,IMarkupPointer *pIStart,IMarkupPointer *pIEnd) {
    return This->lpVtbl->GetPointers(This,pIStart,pIEnd);
}
/*** IElementSegment methods ***/
static __WIDL_INLINE HRESULT IElementSegment_GetElement(IElementSegment* This,IHTMLElement **ppIElement) {
    return This->lpVtbl->GetElement(This,ppIElement);
}
static __WIDL_INLINE HRESULT IElementSegment_SetPrimary(IElementSegment* This,WINBOOL fPrimary) {
    return This->lpVtbl->SetPrimary(This,fPrimary);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHighlightSegment_QueryInterface(IHighlightSegment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHighlightSegment_AddRef(IHighlightSegment* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHighlightSegment_Release(IHighlightSegment* This) {
    return This->lpVtbl->Release(This);
}
/*** ISegment methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEditDesigner_QueryInterface(IHTMLEditDesigner* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLEditDesigner_AddRef(IHTMLEditDesigner* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLEditDesigner_Release(IHTMLEditDesigner* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLEditDesigner methods ***/
static __WIDL_INLINE HRESULT IHTMLEditDesigner_PreHandleEvent(IHTMLEditDesigner* This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj) {
    return This->lpVtbl->PreHandleEvent(This,inEvtDispId,pIEventObj);
}
static __WIDL_INLINE HRESULT IHTMLEditDesigner_PostHandleEvent(IHTMLEditDesigner* This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj) {
    return This->lpVtbl->PostHandleEvent(This,inEvtDispId,pIEventObj);
}
static __WIDL_INLINE HRESULT IHTMLEditDesigner_TranslateAccelerator(IHTMLEditDesigner* This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj) {
    return This->lpVtbl->TranslateAccelerator(This,inEvtDispId,pIEventObj);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEditServices_QueryInterface(IHTMLEditServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLEditServices_AddRef(IHTMLEditServices* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLEditServices_Release(IHTMLEditServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLEditServices methods ***/
static __WIDL_INLINE HRESULT IHTMLEditServices_AddDesigner(IHTMLEditServices* This,IHTMLEditDesigner *pIDesigner) {
    return This->lpVtbl->AddDesigner(This,pIDesigner);
}
static __WIDL_INLINE HRESULT IHTMLEditServices_RemoveDesigner(IHTMLEditServices* This,IHTMLEditDesigner *pIDesigner) {
    return This->lpVtbl->RemoveDesigner(This,pIDesigner);
}
static __WIDL_INLINE HRESULT IHTMLEditServices_GetSelectionServices(IHTMLEditServices* This,IMarkupContainer *pIContainer,ISelectionServices **ppSelSvc) {
    return This->lpVtbl->GetSelectionServices(This,pIContainer,ppSelSvc);
}
static __WIDL_INLINE HRESULT IHTMLEditServices_MoveToSelectionAnchor(IHTMLEditServices* This,IMarkupPointer *pIStartAnchor) {
    return This->lpVtbl->MoveToSelectionAnchor(This,pIStartAnchor);
}
static __WIDL_INLINE HRESULT IHTMLEditServices_MoveToSelectionEnd(IHTMLEditServices* This,IMarkupPointer *pIEndAnchor) {
    return This->lpVtbl->MoveToSelectionEnd(This,pIEndAnchor);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLEditServices2_QueryInterface(IHTMLEditServices2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLEditServices2_AddRef(IHTMLEditServices2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLEditServices2_Release(IHTMLEditServices2* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLEditServices methods ***/
static __WIDL_INLINE HRESULT IHTMLEditServices2_AddDesigner(IHTMLEditServices2* This,IHTMLEditDesigner *pIDesigner) {
    return This->lpVtbl->AddDesigner(This,pIDesigner);
}
static __WIDL_INLINE HRESULT IHTMLEditServices2_RemoveDesigner(IHTMLEditServices2* This,IHTMLEditDesigner *pIDesigner) {
    return This->lpVtbl->RemoveDesigner(This,pIDesigner);
}
static __WIDL_INLINE HRESULT IHTMLEditServices2_GetSelectionServices(IHTMLEditServices2* This,IMarkupContainer *pIContainer,ISelectionServices **ppSelSvc) {
    return This->lpVtbl->GetSelectionServices(This,pIContainer,ppSelSvc);
}
static __WIDL_INLINE HRESULT IHTMLEditServices2_MoveToSelectionAnchor(IHTMLEditServices2* This,IMarkupPointer *pIStartAnchor) {
    return This->lpVtbl->MoveToSelectionAnchor(This,pIStartAnchor);
}
static __WIDL_INLINE HRESULT IHTMLEditServices2_MoveToSelectionEnd(IHTMLEditServices2* This,IMarkupPointer *pIEndAnchor) {
    return This->lpVtbl->MoveToSelectionEnd(This,pIEndAnchor);
}
static __WIDL_INLINE HRESULT IHTMLEditServices2_SelectRange(IHTMLEditServices2* This,IMarkupPointer *pStart,IMarkupPointer *pEnd,SELECTION_TYPE eType) {
    return This->lpVtbl->SelectRange(This,pStart,pEnd,eType);
}
/*** IHTMLEditServices2 methods ***/
static __WIDL_INLINE HRESULT IHTMLEditServices2_MoveToSelectionAnchorEx(IHTMLEditServices2* This,IDisplayPointer *pIStartAnchor) {
    return This->lpVtbl->MoveToSelectionAnchorEx(This,pIStartAnchor);
}
static __WIDL_INLINE HRESULT IHTMLEditServices2_MoveToSelectionEndEx(IHTMLEditServices2* This,IDisplayPointer *pIEndAnchor) {
    return This->lpVtbl->MoveToSelectionEndEx(This,pIEndAnchor);
}
static __WIDL_INLINE HRESULT IHTMLEditServices2_FreezeVirtualCaretPos(IHTMLEditServices2* This,WINBOOL fReCompute) {
    return This->lpVtbl->FreezeVirtualCaretPos(This,fReCompute);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ILineInfo_QueryInterface(ILineInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ILineInfo_AddRef(ILineInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ILineInfo_Release(ILineInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** ILineInfo methods ***/
static __WIDL_INLINE HRESULT ILineInfo_get_x(ILineInfo* This,LONG *p) {
    return This->lpVtbl->get_x(This,p);
}
static __WIDL_INLINE HRESULT ILineInfo_get_baseLine(ILineInfo* This,LONG *p) {
    return This->lpVtbl->get_baseLine(This,p);
}
static __WIDL_INLINE HRESULT ILineInfo_get_textDescent(ILineInfo* This,LONG *p) {
    return This->lpVtbl->get_textDescent(This,p);
}
static __WIDL_INLINE HRESULT ILineInfo_get_textHeight(ILineInfo* This,LONG *p) {
    return This->lpVtbl->get_textHeight(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLComputedStyle_QueryInterface(IHTMLComputedStyle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLComputedStyle_AddRef(IHTMLComputedStyle* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLComputedStyle_Release(IHTMLComputedStyle* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLComputedStyle methods ***/
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_bold(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_bold(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_italic(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_italic(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_underline(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_underline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_overline(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_overline(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_strikeOut(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_strikeOut(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_subScript(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_subScript(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_superScript(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_superScript(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_explicitFace(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_explicitFace(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_fontWeight(IHTMLComputedStyle* This,LONG *p) {
    return This->lpVtbl->get_fontWeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_fontSize(IHTMLComputedStyle* This,LONG *p) {
    return This->lpVtbl->get_fontSize(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_fontName(IHTMLComputedStyle* This,TCHAR *p) {
    return This->lpVtbl->get_fontName(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_hasBgColor(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_hasBgColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_textColor(IHTMLComputedStyle* This,DWORD *p) {
    return This->lpVtbl->get_textColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_backgroundColor(IHTMLComputedStyle* This,DWORD *p) {
    return This->lpVtbl->get_backgroundColor(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_preFormatted(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_preFormatted(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_direction(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_direction(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_blockDirection(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_blockDirection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLComputedStyle_get_OL(IHTMLComputedStyle* This,VARIANT_BOOL *p) {
    return This->lpVtbl->get_OL(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDisplayPointer_QueryInterface(IDisplayPointer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDisplayPointer_AddRef(IDisplayPointer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDisplayPointer_Release(IDisplayPointer* This) {
    return This->lpVtbl->Release(This);
}
/*** IDisplayPointer methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDisplayPointer_MoveUnit(IDisplayPointer* This,DISPLAY_MOVEUNIT eMoveUnit,LONG lXPos) {
    return This->lpVtbl->MoveUnit(This,eMoveUnit,lXPos);
}
static __WIDL_INLINE HRESULT IDisplayPointer_PositionMarkupPointer(IDisplayPointer* This,IMarkupPointer *pMarkupPointer) {
    return This->lpVtbl->PositionMarkupPointer(This,pMarkupPointer);
}
static __WIDL_INLINE HRESULT IDisplayPointer_MoveToPointer(IDisplayPointer* This,IDisplayPointer *pDispPointer) {
    return This->lpVtbl->MoveToPointer(This,pDispPointer);
}
static __WIDL_INLINE HRESULT IDisplayPointer_SetPointerGravity(IDisplayPointer* This,POINTER_GRAVITY eGravity) {
    return This->lpVtbl->SetPointerGravity(This,eGravity);
}
static __WIDL_INLINE HRESULT IDisplayPointer_GetPointerGravity(IDisplayPointer* This,POINTER_GRAVITY *peGravity) {
    return This->lpVtbl->GetPointerGravity(This,peGravity);
}
static __WIDL_INLINE HRESULT IDisplayPointer_SetDisplayGravity(IDisplayPointer* This,DISPLAY_GRAVITY eGravity) {
    return This->lpVtbl->SetDisplayGravity(This,eGravity);
}
static __WIDL_INLINE HRESULT IDisplayPointer_GetDisplayGravity(IDisplayPointer* This,DISPLAY_GRAVITY *peGravity) {
    return This->lpVtbl->GetDisplayGravity(This,peGravity);
}
static __WIDL_INLINE HRESULT IDisplayPointer_IsPositioned(IDisplayPointer* This,WINBOOL *pfPositioned) {
    return This->lpVtbl->IsPositioned(This,pfPositioned);
}
static __WIDL_INLINE HRESULT IDisplayPointer_Unposition(IDisplayPointer* This) {
    return This->lpVtbl->Unposition(This);
}
static __WIDL_INLINE HRESULT IDisplayPointer_IsEqualTo(IDisplayPointer* This,IDisplayPointer *pDispPointer,WINBOOL *pfIsEqual) {
    return This->lpVtbl->IsEqualTo(This,pDispPointer,pfIsEqual);
}
static __WIDL_INLINE HRESULT IDisplayPointer_IsLeftOf(IDisplayPointer* This,IDisplayPointer *pDispPointer,WINBOOL *pfIsLeftOf) {
    return This->lpVtbl->IsLeftOf(This,pDispPointer,pfIsLeftOf);
}
static __WIDL_INLINE HRESULT IDisplayPointer_IsRightOf(IDisplayPointer* This,IDisplayPointer *pDispPointer,WINBOOL *pfIsRightOf) {
    return This->lpVtbl->IsRightOf(This,pDispPointer,pfIsRightOf);
}
static __WIDL_INLINE HRESULT IDisplayPointer_IsAtBOL(IDisplayPointer* This,WINBOOL *pfBOL) {
    return This->lpVtbl->IsAtBOL(This,pfBOL);
}
static __WIDL_INLINE HRESULT IDisplayPointer_MoveToMarkupPointer(IDisplayPointer* This,IMarkupPointer *pPointer,IDisplayPointer *pDispLineContext) {
    return This->lpVtbl->MoveToMarkupPointer(This,pPointer,pDispLineContext);
}
static __WIDL_INLINE HRESULT IDisplayPointer_ScrollIntoView(IDisplayPointer* This) {
    return This->lpVtbl->ScrollIntoView(This);
}
static __WIDL_INLINE HRESULT IDisplayPointer_GetLineInfo(IDisplayPointer* This,ILineInfo **ppLineInfo) {
    return This->lpVtbl->GetLineInfo(This,ppLineInfo);
}
static __WIDL_INLINE HRESULT IDisplayPointer_GetFlowElement(IDisplayPointer* This,IHTMLElement **ppLayoutElement) {
    return This->lpVtbl->GetFlowElement(This,ppLayoutElement);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDisplayServices_QueryInterface(IDisplayServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDisplayServices_AddRef(IDisplayServices* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDisplayServices_Release(IDisplayServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IDisplayServices methods ***/
static __WIDL_INLINE HRESULT IDisplayServices_CreateDisplayPointer(IDisplayServices* This,IDisplayPointer **ppDispPointer) {
    return This->lpVtbl->CreateDisplayPointer(This,ppDispPointer);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDisplayServices_GetCaret(IDisplayServices* This,IHTMLCaret **ppCaret) {
    return This->lpVtbl->GetCaret(This,ppCaret);
}
static __WIDL_INLINE HRESULT IDisplayServices_GetComputedStyle(IDisplayServices* This,IMarkupPointer *pPointer,IHTMLComputedStyle **ppComputedStyle) {
    return This->lpVtbl->GetComputedStyle(This,pPointer,ppComputedStyle);
}
static __WIDL_INLINE HRESULT IDisplayServices_ScrollRectIntoView(IDisplayServices* This,IHTMLElement *pIElement,RECT rect) {
    return This->lpVtbl->ScrollRectIntoView(This,pIElement,rect);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHtmlDlgSafeHelper_QueryInterface(IHtmlDlgSafeHelper* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHtmlDlgSafeHelper_AddRef(IHtmlDlgSafeHelper* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHtmlDlgSafeHelper_Release(IHtmlDlgSafeHelper* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHtmlDlgSafeHelper_GetTypeInfoCount(IHtmlDlgSafeHelper* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHtmlDlgSafeHelper_GetTypeInfo(IHtmlDlgSafeHelper* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHtmlDlgSafeHelper_choosecolordlg(IHtmlDlgSafeHelper* This,VARIANT initColor,VARIANT *rgbColor) {
    return This->lpVtbl->choosecolordlg(This,initColor,rgbColor);
}
static __WIDL_INLINE HRESULT IHtmlDlgSafeHelper_getCharset(IHtmlDlgSafeHelper* This,BSTR fontName,VARIANT *charset) {
    return This->lpVtbl->getCharset(This,fontName,charset);
}
static __WIDL_INLINE HRESULT IHtmlDlgSafeHelper_get_Fonts(IHtmlDlgSafeHelper* This,IDispatch **p) {
    return This->lpVtbl->get_Fonts(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IBlockFormats_QueryInterface(IBlockFormats* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IBlockFormats_AddRef(IBlockFormats* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IBlockFormats_Release(IBlockFormats* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IBlockFormats_GetTypeInfoCount(IBlockFormats* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IBlockFormats_GetTypeInfo(IBlockFormats* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IBlockFormats_get__NewEnum(IBlockFormats* This,IUnknown **p) {
    return This->lpVtbl->get__NewEnum(This,p);
}
static __WIDL_INLINE HRESULT IBlockFormats_get_Count(IBlockFormats* This,LONG *p) {
    return This->lpVtbl->get_Count(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IFontNames_QueryInterface(IFontNames* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IFontNames_AddRef(IFontNames* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IFontNames_Release(IFontNames* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IFontNames_GetTypeInfoCount(IFontNames* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IFontNames_GetTypeInfo(IFontNames* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IFontNames_get__NewEnum(IFontNames* This,IUnknown **p) {
    return This->lpVtbl->get__NewEnum(This,p);
}
static __WIDL_INLINE HRESULT IFontNames_get_Count(IFontNames* This,LONG *p) {
    return This->lpVtbl->get_Count(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDeveloperConsoleMessageReceiver_QueryInterface(IDeveloperConsoleMessageReceiver* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDeveloperConsoleMessageReceiver_AddRef(IDeveloperConsoleMessageReceiver* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDeveloperConsoleMessageReceiver_Release(IDeveloperConsoleMessageReceiver* This) {
    return This->lpVtbl->Release(This);
}
/*** IDeveloperConsoleMessageReceiver methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDebugCallbackNotificationHandler_QueryInterface(IDebugCallbackNotificationHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDebugCallbackNotificationHandler_AddRef(IDebugCallbackNotificationHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDebugCallbackNotificationHandler_Release(IDebugCallbackNotificationHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDebugCallbackNotificationHandler methods ***/
static __WIDL_INLINE HRESULT IDebugCallbackNotificationHandler_RequestedCallbackTypes(IDebugCallbackNotificationHandler* This,DWORD *pCallbackMask) {
    return This->lpVtbl->RequestedCallbackTypes(This,pCallbackMask);
}
static __WIDL_INLINE HRESULT IDebugCallbackNotificationHandler_BeforeDispatchEvent(IDebugCallbackNotificationHandler* This,IUnknown *pEvent) {
    return This->lpVtbl->BeforeDispatchEvent(This,pEvent);
}
static __WIDL_INLINE HRESULT IDebugCallbackNotificationHandler_DispatchEventComplete(IDebugCallbackNotificationHandler* This,IUnknown *pEvent,DWORD propagationStatus) {
    return This->lpVtbl->DispatchEventComplete(This,pEvent,propagationStatus);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IScriptEventHandler_QueryInterface(IScriptEventHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IScriptEventHandler_AddRef(IScriptEventHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IScriptEventHandler_Release(IScriptEventHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IScriptEventHandler methods ***/
static __WIDL_INLINE HRESULT IScriptEventHandler_FunctionName(IScriptEventHandler* This,BSTR *pbstrFunctionName) {
    return This->lpVtbl->FunctionName(This,pbstrFunctionName);
}
static __WIDL_INLINE HRESULT IScriptEventHandler_DebugDocumentContext(IScriptEventHandler* This,IUnknown **ppDebugDocumentContext) {
    return This->lpVtbl->DebugDocumentContext(This,ppDebugDocumentContext);
}
static __WIDL_INLINE HRESULT IScriptEventHandler_EventHandlerDispatch(IScriptEventHandler* This,IDispatch **ppDispHandler) {
    return This->lpVtbl->EventHandlerDispatch(This,ppDispHandler);
}
static __WIDL_INLINE HRESULT IScriptEventHandler_UsesCapture(IScriptEventHandler* This,WINBOOL *pfUsesCapture) {
    return This->lpVtbl->UsesCapture(This,pfUsesCapture);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IScriptEventHandlerSourceInfo_QueryInterface(IScriptEventHandlerSourceInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IScriptEventHandlerSourceInfo_AddRef(IScriptEventHandlerSourceInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IScriptEventHandlerSourceInfo_Release(IScriptEventHandlerSourceInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IScriptEventHandlerSourceInfo methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IDOMEventRegistrationCallback_QueryInterface(IDOMEventRegistrationCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDOMEventRegistrationCallback_AddRef(IDOMEventRegistrationCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDOMEventRegistrationCallback_Release(IDOMEventRegistrationCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IDOMEventRegistrationCallback methods ***/
static __WIDL_INLINE HRESULT IDOMEventRegistrationCallback_OnDOMEventListenerAdded(IDOMEventRegistrationCallback* This,LPCWSTR pszEventType,IScriptEventHandler *pHandler) {
    return This->lpVtbl->OnDOMEventListenerAdded(This,pszEventType,pHandler);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IEventTarget2_QueryInterface(IEventTarget2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEventTarget2_AddRef(IEventTarget2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEventTarget2_Release(IEventTarget2* This) {
    return This->lpVtbl->Release(This);
}
/*** IEventTarget2 methods ***/
static __WIDL_INLINE HRESULT IEventTarget2_GetRegisteredEventTypes(IEventTarget2* This,SAFEARRAY **ppEventTypeArray) {
    return This->lpVtbl->GetRegisteredEventTypes(This,ppEventTypeArray);
}
static __WIDL_INLINE HRESULT IEventTarget2_GetListenersForType(IEventTarget2* This,LPCWSTR pszEventType,SAFEARRAY **ppEventHandlerArray) {
    return This->lpVtbl->GetListenersForType(This,pszEventType,ppEventHandlerArray);
}
static __WIDL_INLINE HRESULT IEventTarget2_RegisterForDOMEventListeners(IEventTarget2* This,IDOMEventRegistrationCallback *pCallback) {
    return This->lpVtbl->RegisterForDOMEventListeners(This,pCallback);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT HTMLNamespaceEvents_QueryInterface(HTMLNamespaceEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG HTMLNamespaceEvents_AddRef(HTMLNamespaceEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG HTMLNamespaceEvents_Release(HTMLNamespaceEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT HTMLNamespaceEvents_GetTypeInfoCount(HTMLNamespaceEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT HTMLNamespaceEvents_GetTypeInfo(HTMLNamespaceEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLNamespace_QueryInterface(IHTMLNamespace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLNamespace_AddRef(IHTMLNamespace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLNamespace_Release(IHTMLNamespace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLNamespace_GetTypeInfoCount(IHTMLNamespace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLNamespace_GetTypeInfo(IHTMLNamespace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLNamespace_get_name(IHTMLNamespace* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IHTMLNamespace_get_urn(IHTMLNamespace* This,BSTR *p) {
    return This->lpVtbl->get_urn(This,p);
}
static __WIDL_INLINE HRESULT IHTMLNamespace_get_tagNames(IHTMLNamespace* This,IDispatch **p) {
    return This->lpVtbl->get_tagNames(This,p);
}
static __WIDL_INLINE HRESULT IHTMLNamespace_get_readyState(IHTMLNamespace* This,VARIANT *p) {
    return This->lpVtbl->get_readyState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLNamespace_put_onreadystatechange(IHTMLNamespace* This,VARIANT v) {
    return This->lpVtbl->put_onreadystatechange(This,v);
}
static __WIDL_INLINE HRESULT IHTMLNamespace_get_onreadystatechange(IHTMLNamespace* This,VARIANT *p) {
    return This->lpVtbl->get_onreadystatechange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLNamespace_doImport(IHTMLNamespace* This,BSTR bstrImplementationUrl) {
    return This->lpVtbl->doImport(This,bstrImplementationUrl);
}
static __WIDL_INLINE HRESULT IHTMLNamespace_attachEvent(IHTMLNamespace* This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult) {
    return This->lpVtbl->attachEvent(This,event,pDisp,pfResult);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLNamespaceCollection_QueryInterface(IHTMLNamespaceCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLNamespaceCollection_AddRef(IHTMLNamespaceCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLNamespaceCollection_Release(IHTMLNamespaceCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLNamespaceCollection_GetTypeInfoCount(IHTMLNamespaceCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLNamespaceCollection_GetTypeInfo(IHTMLNamespaceCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLNamespaceCollection_get_length(IHTMLNamespaceCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLNamespaceCollection_item(IHTMLNamespaceCollection* This,VARIANT index,IDispatch **ppNamespace) {
    return This->lpVtbl->item(This,index,ppNamespace);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLNamespace_QueryInterface(DispHTMLNamespace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLNamespace_AddRef(DispHTMLNamespace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLNamespace_Release(DispHTMLNamespace* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLNamespace_GetTypeInfoCount(DispHTMLNamespace* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLNamespace_GetTypeInfo(DispHTMLNamespace* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLNamespaceCollection_QueryInterface(DispHTMLNamespaceCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLNamespaceCollection_AddRef(DispHTMLNamespaceCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLNamespaceCollection_Release(DispHTMLNamespaceCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLNamespaceCollection_GetTypeInfoCount(DispHTMLNamespaceCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLNamespaceCollection_GetTypeInfo(DispHTMLNamespaceCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPainter_QueryInterface(IHTMLPainter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLPainter_AddRef(IHTMLPainter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLPainter_Release(IHTMLPainter* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLPainter methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPainter_OnResize(IHTMLPainter* This,SIZE size) {
    return This->lpVtbl->OnResize(This,size);
}
static __WIDL_INLINE HRESULT IHTMLPainter_GetPainterInfo(IHTMLPainter* This,HTML_PAINTER_INFO *pInfo) {
    return This->lpVtbl->GetPainterInfo(This,pInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPainterEventInfo_QueryInterface(IHTMLPainterEventInfo* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLPainterEventInfo_AddRef(IHTMLPainterEventInfo* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLPainterEventInfo_Release(IHTMLPainterEventInfo* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLPainterEventInfo methods ***/
static __WIDL_INLINE HRESULT IHTMLPainterEventInfo_GetEventInfoFlags(IHTMLPainterEventInfo* This,LONG *plEventInfoFlags) {
    return This->lpVtbl->GetEventInfoFlags(This,plEventInfoFlags);
}
static __WIDL_INLINE HRESULT IHTMLPainterEventInfo_GetEventTarget(IHTMLPainterEventInfo* This,IHTMLElement **ppElement) {
    return This->lpVtbl->GetEventTarget(This,ppElement);
}
static __WIDL_INLINE HRESULT IHTMLPainterEventInfo_SetCursor(IHTMLPainterEventInfo* This,LONG lPartID) {
    return This->lpVtbl->SetCursor(This,lPartID);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPainterOverlay_QueryInterface(IHTMLPainterOverlay* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLPainterOverlay_AddRef(IHTMLPainterOverlay* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLPainterOverlay_Release(IHTMLPainterOverlay* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLPainterOverlay methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPaintSite_QueryInterface(IHTMLPaintSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLPaintSite_AddRef(IHTMLPaintSite* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLPaintSite_Release(IHTMLPaintSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IHTMLPaintSite methods ***/
static __WIDL_INLINE HRESULT IHTMLPaintSite_InvalidatePainterInfo(IHTMLPaintSite* This) {
    return This->lpVtbl->InvalidatePainterInfo(This);
}
static __WIDL_INLINE HRESULT IHTMLPaintSite_InvalidateRect(IHTMLPaintSite* This,RECT *prcInvalid) {
    return This->lpVtbl->InvalidateRect(This,prcInvalid);
}
static __WIDL_INLINE HRESULT IHTMLPaintSite_InvalidateRegion(IHTMLPaintSite* This,HRGN rgnInvalid) {
    return This->lpVtbl->InvalidateRegion(This,rgnInvalid);
}
static __WIDL_INLINE HRESULT IHTMLPaintSite_GetDrawInfo(IHTMLPaintSite* This,LONG lFlags,HTML_PAINT_DRAW_INFO *pDrawInfo) {
    return This->lpVtbl->GetDrawInfo(This,lFlags,pDrawInfo);
}
static __WIDL_INLINE HRESULT IHTMLPaintSite_TransformGlobalToLocal(IHTMLPaintSite* This,POINT ptGlobal,POINT *pptLocal) {
    return This->lpVtbl->TransformGlobalToLocal(This,ptGlobal,pptLocal);
}
static __WIDL_INLINE HRESULT IHTMLPaintSite_TransformLocalToGlobal(IHTMLPaintSite* This,POINT ptLocal,POINT *pptGlobal) {
    return This->lpVtbl->TransformLocalToGlobal(This,ptLocal,pptGlobal);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLIPrintCollection_QueryInterface(IHTMLIPrintCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLIPrintCollection_AddRef(IHTMLIPrintCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLIPrintCollection_Release(IHTMLIPrintCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLIPrintCollection_GetTypeInfoCount(IHTMLIPrintCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLIPrintCollection_GetTypeInfo(IHTMLIPrintCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLIPrintCollection_get_length(IHTMLIPrintCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IHTMLIPrintCollection_get__newEnum(IHTMLIPrintCollection* This,IUnknown **p) {
    return This->lpVtbl->get__newEnum(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IEnumPrivacyRecords_QueryInterface(IEnumPrivacyRecords* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IEnumPrivacyRecords_AddRef(IEnumPrivacyRecords* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IEnumPrivacyRecords_Release(IEnumPrivacyRecords* This) {
    return This->lpVtbl->Release(This);
}
/*** IEnumPrivacyRecords methods ***/
static __WIDL_INLINE HRESULT IEnumPrivacyRecords_Reset(IEnumPrivacyRecords* This) {
    return This->lpVtbl->Reset(This);
}
static __WIDL_INLINE HRESULT IEnumPrivacyRecords_GetSize(IEnumPrivacyRecords* This,ULONG *pSize) {
    return This->lpVtbl->GetSize(This,pSize);
}
static __WIDL_INLINE HRESULT IEnumPrivacyRecords_GetPrivacyImpacted(IEnumPrivacyRecords* This,WINBOOL *pState) {
    return This->lpVtbl->GetPrivacyImpacted(This,pState);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IWPCBlockedUrls_QueryInterface(IWPCBlockedUrls* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IWPCBlockedUrls_AddRef(IWPCBlockedUrls* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IWPCBlockedUrls_Release(IWPCBlockedUrls* This) {
    return This->lpVtbl->Release(This);
}
/*** IWPCBlockedUrls methods ***/
static __WIDL_INLINE HRESULT IWPCBlockedUrls_GetCount(IWPCBlockedUrls* This,DWORD *pdwCount) {
    return This->lpVtbl->GetCount(This,pdwCount);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_QueryInterface(IHTMLDOMConstructorCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDOMConstructorCollection_AddRef(IHTMLDOMConstructorCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDOMConstructorCollection_Release(IHTMLDOMConstructorCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_GetTypeInfoCount(IHTMLDOMConstructorCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_GetTypeInfo(IHTMLDOMConstructorCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_Attr(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Attr(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_BehaviorUrnsCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_BehaviorUrnsCollection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_BookmarkCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_BookmarkCollection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_CompatibleInfo(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CompatibleInfo(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_CompatibleInfoCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CompatibleInfoCollection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_ControlRangeCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_ControlRangeCollection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_CSSCurrentStyleDeclaration(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CSSCurrentStyleDeclaration(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_CSSRuleList(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CSSRuleList(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_CSSRuleStyleDeclaration(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CSSRuleStyleDeclaration(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_CSSStyleDeclaration(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CSSStyleDeclaration(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_CSSStyleRule(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CSSStyleRule(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_CSSStyleSheet(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_CSSStyleSheet(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_DataTransfer(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_DataTransfer(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_DOMImplementation(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_DOMImplementation(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_Element(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Element(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_Event(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Event(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_History(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_History(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTCElementBehaviorDefaults(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTCElementBehaviorDefaults(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLAnchorElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLAnchorElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLAreaElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLAreaElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLAreasCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLAreasCollection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLBaseElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLBaseElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLBaseFontElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLBaseFontElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLBGSoundElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLBGSoundElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLBlockElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLBlockElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLBodyElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLBodyElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLBRElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLBRElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLButtonElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLButtonElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLCollection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLCommentElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLCommentElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLDDElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLDDElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLDivElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLDivElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLDocument(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLDocument(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLDListElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLDListElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLDTElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLDTElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLEmbedElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLEmbedElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLFieldSetElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLFieldSetElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLFontElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLFontElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLFormElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLFormElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLFrameElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLFrameElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLFrameSetElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLFrameSetElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLGenericElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLGenericElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLHeadElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLHeadElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLHeadingElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLHeadingElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLHRElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLHRElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLHtmlElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLHtmlElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLIFrameElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLIFrameElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLImageElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLImageElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLInputElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLInputElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLIsIndexElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLIsIndexElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLLabelElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLLabelElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLLegendElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLLegendElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLLIElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLLIElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLLinkElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLLinkElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLMapElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLMapElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLMarqueeElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLMarqueeElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLMetaElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLMetaElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLModelessDialog(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLModelessDialog(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLNamespaceInfo(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLNamespaceInfo(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLNamespaceInfoCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLNamespaceInfoCollection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLNextIdElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLNextIdElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLNoShowElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLNoShowElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLObjectElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLObjectElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLOListElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLOListElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLOptionElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLOptionElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLParagraphElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLParagraphElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLParamElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLParamElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLPhraseElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLPhraseElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLPluginsCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLPluginsCollection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLPopup(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLPopup(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLScriptElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLScriptElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLSelectElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLSelectElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLSpanElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLSpanElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLStyleElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLStyleElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTableCaptionElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTableCaptionElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTableCellElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTableCellElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTableColElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTableColElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTableElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTableElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTableRowElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTableRowElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTableSectionElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTableSectionElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTextAreaElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTextAreaElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTextElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTextElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLTitleElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLTitleElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLUListElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLUListElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_HTMLUnknownElement(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_HTMLUnknownElement(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_Image(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Image(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_Location(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Location(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_NamedNodeMap(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_NamedNodeMap(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_Navigator(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Navigator(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_NodeList(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_NodeList(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_Option(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Option(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_Screen(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Screen(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_Selection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Selection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_StaticNodeList(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_StaticNodeList(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_Storage(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Storage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_StyleSheetList(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_StyleSheetList(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_StyleSheetPage(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_StyleSheetPage(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_StyleSheetPageList(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_StyleSheetPageList(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_Text(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Text(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_TextRange(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_TextRange(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_TextRangeCollection(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_TextRangeCollection(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_TextRectangle(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_TextRectangle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_TextRectangleList(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_TextRectangleList(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_Window(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_Window(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDOMConstructorCollection_get_XDomainRequest(IHTMLDOMConstructorCollection* This,IDispatch **p) {
    return This->lpVtbl->get_XDomainRequest(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDialog_QueryInterface(IHTMLDialog* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDialog_AddRef(IHTMLDialog* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDialog_Release(IHTMLDialog* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDialog_GetTypeInfoCount(IHTMLDialog* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDialog_GetTypeInfo(IHTMLDialog* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDialog_put_dialogTop(IHTMLDialog* This,VARIANT v) {
    return This->lpVtbl->put_dialogTop(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDialog_get_dialogTop(IHTMLDialog* This,VARIANT *p) {
    return This->lpVtbl->get_dialogTop(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDialog_put_dialogLeft(IHTMLDialog* This,VARIANT v) {
    return This->lpVtbl->put_dialogLeft(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDialog_get_dialogLeft(IHTMLDialog* This,VARIANT *p) {
    return This->lpVtbl->get_dialogLeft(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDialog_put_dialogWidth(IHTMLDialog* This,VARIANT v) {
    return This->lpVtbl->put_dialogWidth(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDialog_get_dialogWidth(IHTMLDialog* This,VARIANT *p) {
    return This->lpVtbl->get_dialogWidth(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDialog_put_dialogHeight(IHTMLDialog* This,VARIANT v) {
    return This->lpVtbl->put_dialogHeight(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDialog_get_dialogHeight(IHTMLDialog* This,VARIANT *p) {
    return This->lpVtbl->get_dialogHeight(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDialog_get_dialogArguments(IHTMLDialog* This,VARIANT *p) {
    return This->lpVtbl->get_dialogArguments(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDialog_get_menuArguments(IHTMLDialog* This,VARIANT *p) {
    return This->lpVtbl->get_menuArguments(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDialog_put_returnValue(IHTMLDialog* This,VARIANT v) {
    return This->lpVtbl->put_returnValue(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDialog_get_returnValue(IHTMLDialog* This,VARIANT *p) {
    return This->lpVtbl->get_returnValue(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDialog_close(IHTMLDialog* This) {
    return This->lpVtbl->close(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDialog2_QueryInterface(IHTMLDialog2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDialog2_AddRef(IHTMLDialog2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDialog2_Release(IHTMLDialog2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDialog2_GetTypeInfoCount(IHTMLDialog2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDialog2_GetTypeInfo(IHTMLDialog2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDialog2_put_status(IHTMLDialog2* This,BSTR v) {
    return This->lpVtbl->put_status(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDialog2_get_status(IHTMLDialog2* This,BSTR *p) {
    return This->lpVtbl->get_status(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDialog2_put_resizable(IHTMLDialog2* This,BSTR v) {
    return This->lpVtbl->put_resizable(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDialog3_QueryInterface(IHTMLDialog3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLDialog3_AddRef(IHTMLDialog3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLDialog3_Release(IHTMLDialog3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLDialog3_GetTypeInfoCount(IHTMLDialog3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLDialog3_GetTypeInfo(IHTMLDialog3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLDialog3_put_unadorned(IHTMLDialog3* This,BSTR v) {
    return This->lpVtbl->put_unadorned(This,v);
}
static __WIDL_INLINE HRESULT IHTMLDialog3_get_unadorned(IHTMLDialog3* This,BSTR *p) {
    return This->lpVtbl->get_unadorned(This,p);
}
static __WIDL_INLINE HRESULT IHTMLDialog3_put_dialogHide(IHTMLDialog3* This,BSTR v) {
    return This->lpVtbl->put_dialogHide(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLModelessInit_QueryInterface(IHTMLModelessInit* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLModelessInit_AddRef(IHTMLModelessInit* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLModelessInit_Release(IHTMLModelessInit* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLModelessInit_GetTypeInfoCount(IHTMLModelessInit* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLModelessInit_GetTypeInfo(IHTMLModelessInit* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLModelessInit_get_parameters(IHTMLModelessInit* This,VARIANT *p) {
    return This->lpVtbl->get_parameters(This,p);
}
static __WIDL_INLINE HRESULT IHTMLModelessInit_get_optionString(IHTMLModelessInit* This,VARIANT *p) {
    return This->lpVtbl->get_optionString(This,p);
}
static __WIDL_INLINE HRESULT IHTMLModelessInit_get_moniker(IHTMLModelessInit* This,IUnknown **p) {
    return This->lpVtbl->get_moniker(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPopup_QueryInterface(IHTMLPopup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLPopup_AddRef(IHTMLPopup* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLPopup_Release(IHTMLPopup* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLPopup_GetTypeInfoCount(IHTMLPopup* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLPopup_GetTypeInfo(IHTMLPopup* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLPopup_hide(IHTMLPopup* This) {
    return This->lpVtbl->hide(This);
}
static __WIDL_INLINE HRESULT IHTMLPopup_get_document(IHTMLPopup* This,IHTMLDocument **p) {
    return This->lpVtbl->get_document(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLPopup_QueryInterface(DispHTMLPopup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLPopup_AddRef(DispHTMLPopup* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLPopup_Release(DispHTMLPopup* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLPopup_GetTypeInfoCount(DispHTMLPopup* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLPopup_GetTypeInfo(DispHTMLPopup* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAppBehavior_QueryInterface(IHTMLAppBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAppBehavior_AddRef(IHTMLAppBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAppBehavior_Release(IHTMLAppBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAppBehavior_GetTypeInfoCount(IHTMLAppBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_GetTypeInfo(IHTMLAppBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAppBehavior_put_applicationName(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_applicationName(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_get_applicationName(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_applicationName(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_put_version(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_version(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_get_version(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_version(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_put_icon(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_icon(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_get_icon(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_icon(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_put_singleInstance(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_singleInstance(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_get_singleInstance(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_singleInstance(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_put_minimizeButton(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_minimizeButton(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_get_minimizeButton(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_minimizeButton(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_put_maximizeButton(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_maximizeButton(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_get_maximizeButton(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_maximizeButton(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_put_border(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_border(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_get_border(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_border(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_put_borderStyle(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_borderStyle(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_get_borderStyle(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_borderStyle(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_put_sysMenu(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_sysMenu(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_get_sysMenu(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_sysMenu(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_put_caption(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_caption(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_get_caption(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_caption(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_put_windowState(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_windowState(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_get_windowState(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_windowState(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_put_showInTaskBar(IHTMLAppBehavior* This,BSTR v) {
    return This->lpVtbl->put_showInTaskBar(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior_get_showInTaskBar(IHTMLAppBehavior* This,BSTR *p) {
    return This->lpVtbl->get_showInTaskBar(This,p);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAppBehavior2_QueryInterface(IHTMLAppBehavior2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAppBehavior2_AddRef(IHTMLAppBehavior2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAppBehavior2_Release(IHTMLAppBehavior2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAppBehavior2_GetTypeInfoCount(IHTMLAppBehavior2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior2_GetTypeInfo(IHTMLAppBehavior2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAppBehavior2_put_contextMenu(IHTMLAppBehavior2* This,BSTR v) {
    return This->lpVtbl->put_contextMenu(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior2_get_contextMenu(IHTMLAppBehavior2* This,BSTR *p) {
    return This->lpVtbl->get_contextMenu(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior2_put_innerBorder(IHTMLAppBehavior2* This,BSTR v) {
    return This->lpVtbl->put_innerBorder(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior2_get_innerBorder(IHTMLAppBehavior2* This,BSTR *p) {
    return This->lpVtbl->get_innerBorder(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior2_put_scroll(IHTMLAppBehavior2* This,BSTR v) {
    return This->lpVtbl->put_scroll(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior2_get_scroll(IHTMLAppBehavior2* This,BSTR *p) {
    return This->lpVtbl->get_scroll(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior2_put_scrollFlat(IHTMLAppBehavior2* This,BSTR v) {
    return This->lpVtbl->put_scrollFlat(This,v);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior2_get_scrollFlat(IHTMLAppBehavior2* This,BSTR *p) {
    return This->lpVtbl->get_scrollFlat(This,p);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior2_put_selection(IHTMLAppBehavior2* This,BSTR v) {
    return This->lpVtbl->put_selection(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAppBehavior3_QueryInterface(IHTMLAppBehavior3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHTMLAppBehavior3_AddRef(IHTMLAppBehavior3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHTMLAppBehavior3_Release(IHTMLAppBehavior3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IHTMLAppBehavior3_GetTypeInfoCount(IHTMLAppBehavior3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IHTMLAppBehavior3_GetTypeInfo(IHTMLAppBehavior3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHTMLAppBehavior3_put_navigable(IHTMLAppBehavior3* This,BSTR v) {
    return This->lpVtbl->put_navigable(This,v);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispHTMLAppBehavior_QueryInterface(DispHTMLAppBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispHTMLAppBehavior_AddRef(DispHTMLAppBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispHTMLAppBehavior_Release(DispHTMLAppBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispHTMLAppBehavior_GetTypeInfoCount(DispHTMLAppBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispHTMLAppBehavior_GetTypeInfo(DispHTMLAppBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispIHTMLInputButtonElement_QueryInterface(DispIHTMLInputButtonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispIHTMLInputButtonElement_AddRef(DispIHTMLInputButtonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispIHTMLInputButtonElement_Release(DispIHTMLInputButtonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispIHTMLInputButtonElement_GetTypeInfoCount(DispIHTMLInputButtonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispIHTMLInputButtonElement_GetTypeInfo(DispIHTMLInputButtonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispIHTMLInputTextElement_QueryInterface(DispIHTMLInputTextElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispIHTMLInputTextElement_AddRef(DispIHTMLInputTextElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispIHTMLInputTextElement_Release(DispIHTMLInputTextElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispIHTMLInputTextElement_GetTypeInfoCount(DispIHTMLInputTextElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispIHTMLInputTextElement_GetTypeInfo(DispIHTMLInputTextElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispIHTMLInputFileElement_QueryInterface(DispIHTMLInputFileElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispIHTMLInputFileElement_AddRef(DispIHTMLInputFileElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispIHTMLInputFileElement_Release(DispIHTMLInputFileElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispIHTMLInputFileElement_GetTypeInfoCount(DispIHTMLInputFileElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispIHTMLInputFileElement_GetTypeInfo(DispIHTMLInputFileElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispIHTMLOptionButtonElement_QueryInterface(DispIHTMLOptionButtonElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispIHTMLOptionButtonElement_AddRef(DispIHTMLOptionButtonElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispIHTMLOptionButtonElement_Release(DispIHTMLOptionButtonElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispIHTMLOptionButtonElement_GetTypeInfoCount(DispIHTMLOptionButtonElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispIHTMLOptionButtonElement_GetTypeInfo(DispIHTMLOptionButtonElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT DispIHTMLInputImage_QueryInterface(DispIHTMLInputImage* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG DispIHTMLInputImage_AddRef(DispIHTMLInputImage* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG DispIHTMLInputImage_Release(DispIHTMLInputImage* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT DispIHTMLInputImage_GetTypeInfoCount(DispIHTMLInputImage* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT DispIHTMLInputImage_GetTypeInfo(DispIHTMLInputImage* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorFactory_QueryInterface(IElementBehaviorFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehaviorFactory_AddRef(IElementBehaviorFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehaviorFactory_Release(IElementBehaviorFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorFactory methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementNamespace_QueryInterface(IElementNamespace* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementNamespace_AddRef(IElementNamespace* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementNamespace_Release(IElementNamespace* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementNamespace methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementNamespaceTable_QueryInterface(IElementNamespaceTable* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementNamespaceTable_AddRef(IElementNamespaceTable* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementNamespaceTable_Release(IElementNamespaceTable* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementNamespaceTable methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementNamespaceFactory_QueryInterface(IElementNamespaceFactory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementNamespaceFactory_AddRef(IElementNamespaceFactory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementNamespaceFactory_Release(IElementNamespaceFactory* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementNamespaceFactory methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementNamespaceFactory2_QueryInterface(IElementNamespaceFactory2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementNamespaceFactory2_AddRef(IElementNamespaceFactory2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementNamespaceFactory2_Release(IElementNamespaceFactory2* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementNamespaceFactory methods ***/
static __WIDL_INLINE HRESULT IElementNamespaceFactory2_Create(IElementNamespaceFactory2* This,IElementNamespace *pNamespace) {
    return This->lpVtbl->Create(This,pNamespace);
}
/*** IElementNamespaceFactory2 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementNamespaceFactoryCallback_QueryInterface(IElementNamespaceFactoryCallback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementNamespaceFactoryCallback_AddRef(IElementNamespaceFactoryCallback* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementNamespaceFactoryCallback_Release(IElementNamespaceFactoryCallback* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementNamespaceFactoryCallback methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehavior_QueryInterface(IElementBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehavior_AddRef(IElementBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehavior_Release(IElementBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehavior methods ***/
static __WIDL_INLINE HRESULT IElementBehavior_Init(IElementBehavior* This,IElementBehaviorSite *pBehaviorSite) {
    return This->lpVtbl->Init(This,pBehaviorSite);
}
static __WIDL_INLINE HRESULT IElementBehavior_Notify(IElementBehavior* This,LONG lEvent,VARIANT *pVar) {
    return This->lpVtbl->Notify(This,lEvent,pVar);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorSite_QueryInterface(IElementBehaviorSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehaviorSite_AddRef(IElementBehaviorSite* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehaviorSite_Release(IElementBehaviorSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSite methods ***/
static __WIDL_INLINE HRESULT IElementBehaviorSite_GetElement(IElementBehaviorSite* This,IHTMLElement **ppElement) {
    return This->lpVtbl->GetElement(This,ppElement);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorSiteOM_QueryInterface(IElementBehaviorSiteOM* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehaviorSiteOM_AddRef(IElementBehaviorSiteOM* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehaviorSiteOM_Release(IElementBehaviorSiteOM* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSiteOM methods ***/
static __WIDL_INLINE HRESULT IElementBehaviorSiteOM_RegisterEvent(IElementBehaviorSiteOM* This,LPOLESTR pchEvent,LONG lFlags,LONG *plCookie) {
    return This->lpVtbl->RegisterEvent(This,pchEvent,lFlags,plCookie);
}
static __WIDL_INLINE HRESULT IElementBehaviorSiteOM_GetEventCookie(IElementBehaviorSiteOM* This,LPOLESTR pchEvent,LONG *plCookie) {
    return This->lpVtbl->GetEventCookie(This,pchEvent,plCookie);
}
static __WIDL_INLINE HRESULT IElementBehaviorSiteOM_FireEvent(IElementBehaviorSiteOM* This,LONG lCookie,IHTMLEventObj *pEventObject) {
    return This->lpVtbl->FireEvent(This,lCookie,pEventObject);
}
static __WIDL_INLINE HRESULT IElementBehaviorSiteOM_CreateEventObject(IElementBehaviorSiteOM* This,IHTMLEventObj **ppEventObject) {
    return This->lpVtbl->CreateEventObject(This,ppEventObject);
}
static __WIDL_INLINE HRESULT IElementBehaviorSiteOM_RegisterName(IElementBehaviorSiteOM* This,LPOLESTR pchName) {
    return This->lpVtbl->RegisterName(This,pchName);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorSiteOM2_QueryInterface(IElementBehaviorSiteOM2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehaviorSiteOM2_AddRef(IElementBehaviorSiteOM2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehaviorSiteOM2_Release(IElementBehaviorSiteOM2* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSiteOM methods ***/
static __WIDL_INLINE HRESULT IElementBehaviorSiteOM2_RegisterEvent(IElementBehaviorSiteOM2* This,LPOLESTR pchEvent,LONG lFlags,LONG *plCookie) {
    return This->lpVtbl->RegisterEvent(This,pchEvent,lFlags,plCookie);
}
static __WIDL_INLINE HRESULT IElementBehaviorSiteOM2_GetEventCookie(IElementBehaviorSiteOM2* This,LPOLESTR pchEvent,LONG *plCookie) {
    return This->lpVtbl->GetEventCookie(This,pchEvent,plCookie);
}
static __WIDL_INLINE HRESULT IElementBehaviorSiteOM2_FireEvent(IElementBehaviorSiteOM2* This,LONG lCookie,IHTMLEventObj *pEventObject) {
    return This->lpVtbl->FireEvent(This,lCookie,pEventObject);
}
static __WIDL_INLINE HRESULT IElementBehaviorSiteOM2_CreateEventObject(IElementBehaviorSiteOM2* This,IHTMLEventObj **ppEventObject) {
    return This->lpVtbl->CreateEventObject(This,ppEventObject);
}
static __WIDL_INLINE HRESULT IElementBehaviorSiteOM2_RegisterName(IElementBehaviorSiteOM2* This,LPOLESTR pchName) {
    return This->lpVtbl->RegisterName(This,pchName);
}
static __WIDL_INLINE HRESULT IElementBehaviorSiteOM2_RegisterUrn(IElementBehaviorSiteOM2* This,LPOLESTR pchUrn) {
    return This->lpVtbl->RegisterUrn(This,pchUrn);
}
/*** IElementBehaviorSiteOM2 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorRender_QueryInterface(IElementBehaviorRender* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehaviorRender_AddRef(IElementBehaviorRender* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehaviorRender_Release(IElementBehaviorRender* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorRender methods ***/
static __WIDL_INLINE HRESULT IElementBehaviorRender_Draw(IElementBehaviorRender* This,HDC hdc,LONG lLayer,RECT *pRect,IUnknown *pReserved) {
    return This->lpVtbl->Draw(This,hdc,lLayer,pRect,pReserved);
}
static __WIDL_INLINE HRESULT IElementBehaviorRender_GetRenderInfo(IElementBehaviorRender* This,LONG *plRenderInfo) {
    return This->lpVtbl->GetRenderInfo(This,plRenderInfo);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorSiteRender_QueryInterface(IElementBehaviorSiteRender* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehaviorSiteRender_AddRef(IElementBehaviorSiteRender* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehaviorSiteRender_Release(IElementBehaviorSiteRender* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSiteRender methods ***/
static __WIDL_INLINE HRESULT IElementBehaviorSiteRender_Invalidate(IElementBehaviorSiteRender* This,RECT *pRect) {
    return This->lpVtbl->Invalidate(This,pRect);
}
static __WIDL_INLINE HRESULT IElementBehaviorSiteRender_InvalidateRenderInfo(IElementBehaviorSiteRender* This) {
    return This->lpVtbl->InvalidateRenderInfo(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorCategory_QueryInterface(IElementBehaviorCategory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehaviorCategory_AddRef(IElementBehaviorCategory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehaviorCategory_Release(IElementBehaviorCategory* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorCategory methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorSiteCategory_QueryInterface(IElementBehaviorSiteCategory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehaviorSiteCategory_AddRef(IElementBehaviorSiteCategory* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehaviorSiteCategory_Release(IElementBehaviorSiteCategory* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSiteCategory methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorSubmit_QueryInterface(IElementBehaviorSubmit* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehaviorSubmit_AddRef(IElementBehaviorSubmit* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehaviorSubmit_Release(IElementBehaviorSubmit* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSubmit methods ***/
static __WIDL_INLINE HRESULT IElementBehaviorSubmit_GetSubmitInfo(IElementBehaviorSubmit* This,IHTMLSubmitData *pSubmitData) {
    return This->lpVtbl->GetSubmitInfo(This,pSubmitData);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorFocus_QueryInterface(IElementBehaviorFocus* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehaviorFocus_AddRef(IElementBehaviorFocus* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehaviorFocus_Release(IElementBehaviorFocus* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorFocus methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorLayout_QueryInterface(IElementBehaviorLayout* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehaviorLayout_AddRef(IElementBehaviorLayout* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehaviorLayout_Release(IElementBehaviorLayout* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorLayout methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorLayout_GetLayoutInfo(IElementBehaviorLayout* This,LONG *plLayoutInfo) {
    return This->lpVtbl->GetLayoutInfo(This,plLayoutInfo);
}
static __WIDL_INLINE HRESULT IElementBehaviorLayout_GetPosition(IElementBehaviorLayout* This,LONG lFlags,POINT *pptTopLeft) {
    return This->lpVtbl->GetPosition(This,lFlags,pptTopLeft);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorLayout2_QueryInterface(IElementBehaviorLayout2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehaviorLayout2_AddRef(IElementBehaviorLayout2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehaviorLayout2_Release(IElementBehaviorLayout2* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorLayout2 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorSiteLayout_QueryInterface(IElementBehaviorSiteLayout* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehaviorSiteLayout_AddRef(IElementBehaviorSiteLayout* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehaviorSiteLayout_Release(IElementBehaviorSiteLayout* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSiteLayout methods ***/
static __WIDL_INLINE HRESULT IElementBehaviorSiteLayout_InvalidateLayoutInfo(IElementBehaviorSiteLayout* This) {
    return This->lpVtbl->InvalidateLayoutInfo(This);
}
static __WIDL_INLINE HRESULT IElementBehaviorSiteLayout_InvalidateSize(IElementBehaviorSiteLayout* This) {
    return This->lpVtbl->InvalidateSize(This);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IElementBehaviorSiteLayout2_QueryInterface(IElementBehaviorSiteLayout2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IElementBehaviorSiteLayout2_AddRef(IElementBehaviorSiteLayout2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IElementBehaviorSiteLayout2_Release(IElementBehaviorSiteLayout2* This) {
    return This->lpVtbl->Release(This);
}
/*** IElementBehaviorSiteLayout2 methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IHostBehaviorInit_QueryInterface(IHostBehaviorInit* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IHostBehaviorInit_AddRef(IHostBehaviorInit* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IHostBehaviorInit_Release(IHostBehaviorInit* This) {
    return This->lpVtbl->Release(This);
}
/*** IHostBehaviorInit methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IViewObjectPresentSite_QueryInterface(IViewObjectPresentSite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IViewObjectPresentSite_AddRef(IViewObjectPresentSite* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IViewObjectPresentSite_Release(IViewObjectPresentSite* This) {
    return This->lpVtbl->Release(This);
}
/*** IViewObjectPresentSite methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IViewObjectPresentSite_IsHardwareComposition(IViewObjectPresentSite* This,WINBOOL *pIsHardwareComposition) {
    return This->lpVtbl->IsHardwareComposition(This,pIsHardwareComposition);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ISurfacePresenter_QueryInterface(ISurfacePresenter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISurfacePresenter_AddRef(ISurfacePresenter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISurfacePresenter_Release(ISurfacePresenter* This) {
    return This->lpVtbl->Release(This);
}
/*** ISurfacePresenter methods ***/
static __WIDL_INLINE HRESULT ISurfacePresenter_Present(ISurfacePresenter* This,UINT uBuffer,RECT *pDirty) {
    return This->lpVtbl->Present(This,uBuffer,pDirty);
}
static __WIDL_INLINE HRESULT ISurfacePresenter_GetBuffer(ISurfacePresenter* This,UINT backBufferIndex,REFIID riid,void **ppBuffer) {
    return This->lpVtbl->GetBuffer(This,backBufferIndex,riid,ppBuffer);
}
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ICanvasPixelArrayData_QueryInterface(ICanvasPixelArrayData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ICanvasPixelArrayData_AddRef(ICanvasPixelArrayData* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ICanvasPixelArrayData_Release(ICanvasPixelArrayData* This) {
    return This->lpVtbl->Release(This);
}
/*** ICanvasPixelArrayData methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IViewObjectPrint_QueryInterface(IViewObjectPrint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IViewObjectPrint_AddRef(IViewObjectPrint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IViewObjectPrint_Release(IViewObjectPrint* This) {
    return This->lpVtbl->Release(This);
}
/*** IViewObjectPrint methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IViewObjectPresentNotifySite_QueryInterface(IViewObjectPresentNotifySite* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IViewObjectPresentNotifySite_AddRef(IViewObjectPresentNotifySite* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IViewObjectPresentNotifySite_Release(IViewObjectPresentNotifySite* This) {
    return This->lpVtbl->Release(This);
}
/*** IViewObjectPresentSite methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IViewObjectPresentNotifySite_IsHardwareComposition(IViewObjectPresentNotifySite* This,WINBOOL *pIsHardwareComposition) {
    return This->lpVtbl->IsHardwareComposition(This,pIsHardwareComposition);
}
static __WIDL_INLINE HRESULT IViewObjectPresentNotifySite_SetCompositionMode(IViewObjectPresentNotifySite* This,VIEW_OBJECT_COMPOSITION_MODE mode) {
    return This->lpVtbl->SetCompositionMode(This,mode);
}
/*** IViewObjectPresentNotifySite methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT IViewObjectPresentNotify_QueryInterface(IViewObjectPresentNotify* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IViewObjectPresentNotify_AddRef(IViewObjectPresentNotify* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IViewObjectPresentNotify_Release(IViewObjectPresentNotify* This) {
    return This->lpVtbl->Release(This);
}
/*** IViewObjectPresentNotify methods ***/
static __WIDL_INLINE 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 __WIDL_INLINE HRESULT ITrackingProtection_QueryInterface(ITrackingProtection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ITrackingProtection_AddRef(ITrackingProtection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ITrackingProtection_Release(ITrackingProtection* This) {
    return This->lpVtbl->Release(This);
}
/*** ITrackingProtection methods ***/
static __WIDL_INLINE HRESULT ITrackingProtection_EvaluateUrl(ITrackingProtection* This,BSTR bstrUrl,WINBOOL *pfAllowed) {
    return This->lpVtbl->EvaluateUrl(This,bstrUrl,pfAllowed);
}
static __WIDL_INLINE 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__ */
