/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the w64 mingw-runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 440
#endif

#include "rpc.h"
#include "rpcndr.h"

#ifndef __RPCNDR_H_VERSION__
#error This stub requires an updated version of <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include "windows.h"
#include "ole2.h"
#endif

#ifndef __mshtml_h__
#define __mshtml_h__

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

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

#ifndef __IElementBehaviorSite_FWD_DEFINED__
#define __IElementBehaviorSite_FWD_DEFINED__
typedef interface IElementBehaviorSite IElementBehaviorSite;
#endif

#ifndef __IElementBehavior_FWD_DEFINED__
#define __IElementBehavior_FWD_DEFINED__
typedef interface IElementBehavior IElementBehavior;
#endif

#ifndef __IElementBehaviorFactory_FWD_DEFINED__
#define __IElementBehaviorFactory_FWD_DEFINED__
typedef interface IElementBehaviorFactory IElementBehaviorFactory;
#endif

#ifndef __IElementBehaviorSiteOM_FWD_DEFINED__
#define __IElementBehaviorSiteOM_FWD_DEFINED__
typedef interface IElementBehaviorSiteOM IElementBehaviorSiteOM;
#endif

#ifndef __IElementBehaviorRender_FWD_DEFINED__
#define __IElementBehaviorRender_FWD_DEFINED__
typedef interface IElementBehaviorRender IElementBehaviorRender;
#endif

#ifndef __IElementBehaviorSiteRender_FWD_DEFINED__
#define __IElementBehaviorSiteRender_FWD_DEFINED__
typedef interface IElementBehaviorSiteRender IElementBehaviorSiteRender;
#endif

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#ifndef __ICSSFilterSite_FWD_DEFINED__
#define __ICSSFilterSite_FWD_DEFINED__
typedef interface ICSSFilterSite ICSSFilterSite;
#endif

#ifndef __IMarkupPointer_FWD_DEFINED__
#define __IMarkupPointer_FWD_DEFINED__
typedef interface IMarkupPointer IMarkupPointer;
#endif

#ifndef __IMarkupContainer_FWD_DEFINED__
#define __IMarkupContainer_FWD_DEFINED__
typedef interface IMarkupContainer IMarkupContainer;
#endif

#ifndef __IMarkupContainer2_FWD_DEFINED__
#define __IMarkupContainer2_FWD_DEFINED__
typedef interface IMarkupContainer2 IMarkupContainer2;
#endif

#ifndef __IHTMLChangeLog_FWD_DEFINED__
#define __IHTMLChangeLog_FWD_DEFINED__
typedef interface IHTMLChangeLog IHTMLChangeLog;
#endif

#ifndef __IHTMLChangeSink_FWD_DEFINED__
#define __IHTMLChangeSink_FWD_DEFINED__
typedef interface IHTMLChangeSink IHTMLChangeSink;
#endif

#ifndef __IActiveIMMApp_FWD_DEFINED__
#define __IActiveIMMApp_FWD_DEFINED__
typedef interface IActiveIMMApp IActiveIMMApp;
#endif

#ifndef __ISegmentList_FWD_DEFINED__
#define __ISegmentList_FWD_DEFINED__
typedef interface ISegmentList ISegmentList;
#endif

#ifndef __ISegmentListIterator_FWD_DEFINED__
#define __ISegmentListIterator_FWD_DEFINED__
typedef interface ISegmentListIterator ISegmentListIterator;
#endif

#ifndef __IHTMLCaret_FWD_DEFINED__
#define __IHTMLCaret_FWD_DEFINED__
typedef interface IHTMLCaret IHTMLCaret;
#endif

#ifndef __ISegment_FWD_DEFINED__
#define __ISegment_FWD_DEFINED__
typedef interface ISegment ISegment;
#endif

#ifndef __IElementSegment_FWD_DEFINED__
#define __IElementSegment_FWD_DEFINED__
typedef interface IElementSegment IElementSegment;
#endif

#ifndef __IHighlightSegment_FWD_DEFINED__
#define __IHighlightSegment_FWD_DEFINED__
typedef interface IHighlightSegment IHighlightSegment;
#endif

#ifndef __IHighlightRenderingServices_FWD_DEFINED__
#define __IHighlightRenderingServices_FWD_DEFINED__
typedef interface IHighlightRenderingServices IHighlightRenderingServices;
#endif

#ifndef __ILineInfo_FWD_DEFINED__
#define __ILineInfo_FWD_DEFINED__
typedef interface ILineInfo ILineInfo;
#endif

#ifndef __IDisplayPointer_FWD_DEFINED__
#define __IDisplayPointer_FWD_DEFINED__
typedef interface IDisplayPointer IDisplayPointer;
#endif

#ifndef __IDisplayServices_FWD_DEFINED__
#define __IDisplayServices_FWD_DEFINED__
typedef interface IDisplayServices IDisplayServices;
#endif

#ifndef __IHtmlDlgSafeHelper_FWD_DEFINED__
#define __IHtmlDlgSafeHelper_FWD_DEFINED__
typedef interface IHtmlDlgSafeHelper IHtmlDlgSafeHelper;
#endif

#ifndef __IBlockFormats_FWD_DEFINED__
#define __IBlockFormats_FWD_DEFINED__
typedef interface IBlockFormats IBlockFormats;
#endif

#ifndef __IFontNames_FWD_DEFINED__
#define __IFontNames_FWD_DEFINED__
typedef interface IFontNames IFontNames;
#endif

#ifndef __ICSSFilter_FWD_DEFINED__
#define __ICSSFilter_FWD_DEFINED__
typedef interface ICSSFilter ICSSFilter;
#endif

#ifndef __ISecureUrlHost_FWD_DEFINED__
#define __ISecureUrlHost_FWD_DEFINED__
typedef interface ISecureUrlHost ISecureUrlHost;
#endif

#ifndef __IMarkupServices_FWD_DEFINED__
#define __IMarkupServices_FWD_DEFINED__
typedef interface IMarkupServices IMarkupServices;
#endif

#ifndef __IMarkupServices2_FWD_DEFINED__
#define __IMarkupServices2_FWD_DEFINED__
typedef interface IMarkupServices2 IMarkupServices2;
#endif

#ifndef __IHTMLChangePlayback_FWD_DEFINED__
#define __IHTMLChangePlayback_FWD_DEFINED__
typedef interface IHTMLChangePlayback IHTMLChangePlayback;
#endif

#ifndef __IMarkupPointer2_FWD_DEFINED__
#define __IMarkupPointer2_FWD_DEFINED__
typedef interface IMarkupPointer2 IMarkupPointer2;
#endif

#ifndef __IMarkupTextFrags_FWD_DEFINED__
#define __IMarkupTextFrags_FWD_DEFINED__
typedef interface IMarkupTextFrags IMarkupTextFrags;
#endif

#ifndef __IXMLGenericParse_FWD_DEFINED__
#define __IXMLGenericParse_FWD_DEFINED__
typedef interface IXMLGenericParse IXMLGenericParse;
#endif

#ifndef __IHTMLEditHost_FWD_DEFINED__
#define __IHTMLEditHost_FWD_DEFINED__
typedef interface IHTMLEditHost IHTMLEditHost;
#endif

#ifndef __IHTMLEditHost2_FWD_DEFINED__
#define __IHTMLEditHost2_FWD_DEFINED__
typedef interface IHTMLEditHost2 IHTMLEditHost2;
#endif

#ifndef __ISequenceNumber_FWD_DEFINED__
#define __ISequenceNumber_FWD_DEFINED__
typedef interface ISequenceNumber ISequenceNumber;
#endif

#ifndef __IIMEServices_FWD_DEFINED__
#define __IIMEServices_FWD_DEFINED__
typedef interface IIMEServices IIMEServices;
#endif

#ifndef __ISelectionServicesListener_FWD_DEFINED__
#define __ISelectionServicesListener_FWD_DEFINED__
typedef interface ISelectionServicesListener ISelectionServicesListener;
#endif

#ifndef __ISelectionServices_FWD_DEFINED__
#define __ISelectionServices_FWD_DEFINED__
typedef interface ISelectionServices ISelectionServices;
#endif

#ifndef __IHTMLEditDesigner_FWD_DEFINED__
#define __IHTMLEditDesigner_FWD_DEFINED__
typedef interface IHTMLEditDesigner IHTMLEditDesigner;
#endif

#ifndef __IHTMLEditServices_FWD_DEFINED__
#define __IHTMLEditServices_FWD_DEFINED__
typedef interface IHTMLEditServices IHTMLEditServices;
#endif

#ifndef __IHTMLEditServices2_FWD_DEFINED__
#define __IHTMLEditServices2_FWD_DEFINED__
typedef interface IHTMLEditServices2 IHTMLEditServices2;
#endif

#ifndef __IHTMLComputedStyle_FWD_DEFINED__
#define __IHTMLComputedStyle_FWD_DEFINED__
typedef interface IHTMLComputedStyle IHTMLComputedStyle;
#endif

#ifndef __HtmlDlgSafeHelper_FWD_DEFINED__
#define __HtmlDlgSafeHelper_FWD_DEFINED__
#ifdef __cplusplus
typedef class HtmlDlgSafeHelper HtmlDlgSafeHelper;
#else
typedef struct HtmlDlgSafeHelper HtmlDlgSafeHelper;
#endif
#endif

#ifndef __BlockFormats_FWD_DEFINED__
#define __BlockFormats_FWD_DEFINED__
#ifdef __cplusplus
typedef class BlockFormats BlockFormats;
#else
typedef struct BlockFormats BlockFormats;
#endif
#endif

#ifndef __FontNames_FWD_DEFINED__
#define __FontNames_FWD_DEFINED__
#ifdef __cplusplus
typedef class FontNames FontNames;
#else
typedef struct FontNames FontNames;
#endif
#endif

#ifndef __HTMLNamespaceEvents_FWD_DEFINED__
#define __HTMLNamespaceEvents_FWD_DEFINED__
typedef interface HTMLNamespaceEvents HTMLNamespaceEvents;
#endif

#ifndef __IHTMLNamespace_FWD_DEFINED__
#define __IHTMLNamespace_FWD_DEFINED__
typedef interface IHTMLNamespace IHTMLNamespace;
#endif

#ifndef __IHTMLNamespaceCollection_FWD_DEFINED__
#define __IHTMLNamespaceCollection_FWD_DEFINED__
typedef interface IHTMLNamespaceCollection IHTMLNamespaceCollection;
#endif

#ifndef __HTMLNamespace_FWD_DEFINED__
#define __HTMLNamespace_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLNamespace HTMLNamespace;
#else
typedef struct HTMLNamespace HTMLNamespace;
#endif
#endif

#ifndef __HTMLNamespaceCollection_FWD_DEFINED__
#define __HTMLNamespaceCollection_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLNamespaceCollection HTMLNamespaceCollection;
#else
typedef struct HTMLNamespaceCollection HTMLNamespaceCollection;
#endif
#endif

#ifndef __IHTMLPainter_FWD_DEFINED__
#define __IHTMLPainter_FWD_DEFINED__
typedef interface IHTMLPainter IHTMLPainter;
#endif

#ifndef __IHTMLPaintSite_FWD_DEFINED__
#define __IHTMLPaintSite_FWD_DEFINED__
typedef interface IHTMLPaintSite IHTMLPaintSite;
#endif

#ifndef __IHTMLPainterEventInfo_FWD_DEFINED__
#define __IHTMLPainterEventInfo_FWD_DEFINED__
typedef interface IHTMLPainterEventInfo IHTMLPainterEventInfo;
#endif

#ifndef __IHTMLPainterOverlay_FWD_DEFINED__
#define __IHTMLPainterOverlay_FWD_DEFINED__
typedef interface IHTMLPainterOverlay IHTMLPainterOverlay;
#endif

#ifndef __IHTMLIPrintCollection_FWD_DEFINED__
#define __IHTMLIPrintCollection_FWD_DEFINED__
typedef interface IHTMLIPrintCollection IHTMLIPrintCollection;
#endif

#ifndef __IEnumPrivacyRecords_FWD_DEFINED__
#define __IEnumPrivacyRecords_FWD_DEFINED__
typedef interface IEnumPrivacyRecords IEnumPrivacyRecords;
#endif

#ifndef __IHTMLDialog_FWD_DEFINED__
#define __IHTMLDialog_FWD_DEFINED__
typedef interface IHTMLDialog IHTMLDialog;
#endif

#ifndef __IHTMLDialog2_FWD_DEFINED__
#define __IHTMLDialog2_FWD_DEFINED__
typedef interface IHTMLDialog2 IHTMLDialog2;
#endif

#ifndef __IHTMLDialog3_FWD_DEFINED__
#define __IHTMLDialog3_FWD_DEFINED__
typedef interface IHTMLDialog3 IHTMLDialog3;
#endif

#ifndef __IHTMLModelessInit_FWD_DEFINED__
#define __IHTMLModelessInit_FWD_DEFINED__
typedef interface IHTMLModelessInit IHTMLModelessInit;
#endif

#ifndef __ThreadDialogProcParam_FWD_DEFINED__
#define __ThreadDialogProcParam_FWD_DEFINED__
#ifdef __cplusplus
typedef class ThreadDialogProcParam ThreadDialogProcParam;
#else
typedef struct ThreadDialogProcParam ThreadDialogProcParam;
#endif
#endif

#ifndef __HTMLDialog_FWD_DEFINED__
#define __HTMLDialog_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLDialog HTMLDialog;
#else
typedef struct HTMLDialog HTMLDialog;
#endif
#endif

#ifndef __IHTMLPopup_FWD_DEFINED__
#define __IHTMLPopup_FWD_DEFINED__
typedef interface IHTMLPopup IHTMLPopup;
#endif

#ifndef __DispHTMLPopup_FWD_DEFINED__
#define __DispHTMLPopup_FWD_DEFINED__
typedef interface DispHTMLPopup DispHTMLPopup;
#endif

#ifndef __HTMLPopup_FWD_DEFINED__
#define __HTMLPopup_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLPopup HTMLPopup;
#else
typedef struct HTMLPopup HTMLPopup;
#endif
#endif

#ifndef __IHTMLAppBehavior_FWD_DEFINED__
#define __IHTMLAppBehavior_FWD_DEFINED__
typedef interface IHTMLAppBehavior IHTMLAppBehavior;
#endif

#ifndef __IHTMLAppBehavior2_FWD_DEFINED__
#define __IHTMLAppBehavior2_FWD_DEFINED__
typedef interface IHTMLAppBehavior2 IHTMLAppBehavior2;
#endif

#ifndef __IHTMLAppBehavior3_FWD_DEFINED__
#define __IHTMLAppBehavior3_FWD_DEFINED__
typedef interface IHTMLAppBehavior3 IHTMLAppBehavior3;
#endif

#ifndef __DispHTMLAppBehavior_FWD_DEFINED__
#define __DispHTMLAppBehavior_FWD_DEFINED__
typedef interface DispHTMLAppBehavior DispHTMLAppBehavior;
#endif

#ifndef __HTMLAppBehavior_FWD_DEFINED__
#define __HTMLAppBehavior_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLAppBehavior HTMLAppBehavior;
#else
typedef struct HTMLAppBehavior HTMLAppBehavior;
#endif
#endif

#ifndef __OldHTMLDocument_FWD_DEFINED__
#define __OldHTMLDocument_FWD_DEFINED__
#ifdef __cplusplus
typedef class OldHTMLDocument OldHTMLDocument;
#else
typedef struct OldHTMLDocument OldHTMLDocument;
#endif
#endif

#ifndef __OldHTMLFormElement_FWD_DEFINED__
#define __OldHTMLFormElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class OldHTMLFormElement OldHTMLFormElement;
#else
typedef struct OldHTMLFormElement OldHTMLFormElement;
#endif
#endif

#ifndef __DispIHTMLInputButtonElement_FWD_DEFINED__
#define __DispIHTMLInputButtonElement_FWD_DEFINED__
typedef interface DispIHTMLInputButtonElement DispIHTMLInputButtonElement;
#endif

#ifndef __HTMLInputButtonElement_FWD_DEFINED__
#define __HTMLInputButtonElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLInputButtonElement HTMLInputButtonElement;
#else
typedef struct HTMLInputButtonElement HTMLInputButtonElement;
#endif
#endif

#ifndef __DispIHTMLInputTextElement_FWD_DEFINED__
#define __DispIHTMLInputTextElement_FWD_DEFINED__
typedef interface DispIHTMLInputTextElement DispIHTMLInputTextElement;
#endif

#ifndef __HTMLInputTextElement_FWD_DEFINED__
#define __HTMLInputTextElement_FWD_DEFINED__
#ifdef __cplusplus
typedef class HTMLInputTextElement HTMLInputTextElement;
#else
typedef struct HTMLInputTextElement HTMLInputTextElement;
#endif
#endif

#ifndef __DispIHTMLInputFileElement_FWD_DEFINED__
#define __DispIHTMLInputFileElement_FWD_DEFINED__
typedef interface DispIHTMLInputFileElement DispIHTMLInputFileElement;
#endif

#ifndef __HTMLInputFileElement_FWD_DEFINED__
#define __HTMLInputFileElement_FWD_DEFINED__

#ifdef __cplusplus
typedef class HTMLInputFileElement HTMLInputFileElement;
#else
typedef struct HTMLInputFileElement HTMLInputFileElement;
#endif
#endif

#ifndef __DispIHTMLOptionButtonElement_FWD_DEFINED__
#define __DispIHTMLOptionButtonElement_FWD_DEFINED__
typedef interface DispIHTMLOptionButtonElement DispIHTMLOptionButtonElement;
#endif

#ifndef __HTMLOptionButtonElement_FWD_DEFINED__
#define __HTMLOptionButtonElement_FWD_DEFINED__

#ifdef __cplusplus
typedef class HTMLOptionButtonElement HTMLOptionButtonElement;
#else
typedef struct HTMLOptionButtonElement HTMLOptionButtonElement;
#endif
#endif

#ifndef __DispIHTMLInputImage_FWD_DEFINED__
#define __DispIHTMLInputImage_FWD_DEFINED__
typedef interface DispIHTMLInputImage DispIHTMLInputImage;
#endif

#ifndef __HTMLInputImage_FWD_DEFINED__
#define __HTMLInputImage_FWD_DEFINED__

#ifdef __cplusplus
typedef class HTMLInputImage HTMLInputImage;
#else
typedef struct HTMLInputImage HTMLInputImage;
#endif
#endif

#ifndef __IElementNamespace_FWD_DEFINED__
#define __IElementNamespace_FWD_DEFINED__
typedef interface IElementNamespace IElementNamespace;
#endif

#ifndef __IElementNamespaceTable_FWD_DEFINED__
#define __IElementNamespaceTable_FWD_DEFINED__
typedef interface IElementNamespaceTable IElementNamespaceTable;
#endif

#ifndef __IElementNamespaceFactory_FWD_DEFINED__
#define __IElementNamespaceFactory_FWD_DEFINED__
typedef interface IElementNamespaceFactory IElementNamespaceFactory;
#endif

#ifndef __IElementNamespaceFactory2_FWD_DEFINED__
#define __IElementNamespaceFactory2_FWD_DEFINED__
typedef interface IElementNamespaceFactory2 IElementNamespaceFactory2;
#endif

#ifndef __IElementNamespaceFactoryCallback_FWD_DEFINED__
#define __IElementNamespaceFactoryCallback_FWD_DEFINED__
typedef interface IElementNamespaceFactoryCallback IElementNamespaceFactoryCallback;
#endif

#ifndef __IElementBehaviorSiteOM2_FWD_DEFINED__
#define __IElementBehaviorSiteOM2_FWD_DEFINED__
typedef interface IElementBehaviorSiteOM2 IElementBehaviorSiteOM2;
#endif

#ifndef __IElementBehaviorCategory_FWD_DEFINED__
#define __IElementBehaviorCategory_FWD_DEFINED__
typedef interface IElementBehaviorCategory IElementBehaviorCategory;
#endif

#ifndef __IElementBehaviorSiteCategory_FWD_DEFINED__
#define __IElementBehaviorSiteCategory_FWD_DEFINED__
typedef interface IElementBehaviorSiteCategory IElementBehaviorSiteCategory;
#endif

#ifndef __IElementBehaviorSubmit_FWD_DEFINED__
#define __IElementBehaviorSubmit_FWD_DEFINED__
typedef interface IElementBehaviorSubmit IElementBehaviorSubmit;
#endif

#ifndef __IElementBehaviorFocus_FWD_DEFINED__
#define __IElementBehaviorFocus_FWD_DEFINED__
typedef interface IElementBehaviorFocus IElementBehaviorFocus;
#endif

#ifndef __IElementBehaviorLayout_FWD_DEFINED__
#define __IElementBehaviorLayout_FWD_DEFINED__
typedef interface IElementBehaviorLayout IElementBehaviorLayout;
#endif

#ifndef __IElementBehaviorLayout2_FWD_DEFINED__
#define __IElementBehaviorLayout2_FWD_DEFINED__
typedef interface IElementBehaviorLayout2 IElementBehaviorLayout2;
#endif

#ifndef __IElementBehaviorSiteLayout_FWD_DEFINED__
#define __IElementBehaviorSiteLayout_FWD_DEFINED__
typedef interface IElementBehaviorSiteLayout IElementBehaviorSiteLayout;
#endif

#ifndef __IElementBehaviorSiteLayout2_FWD_DEFINED__
#define __IElementBehaviorSiteLayout2_FWD_DEFINED__
typedef interface IElementBehaviorSiteLayout2 IElementBehaviorSiteLayout2;
#endif

#ifndef __IHostBehaviorInit_FWD_DEFINED__
#define __IHostBehaviorInit_FWD_DEFINED__
typedef interface IHostBehaviorInit IHostBehaviorInit;
#endif

#include "ocidl.h"
#include "dimm.h"

#ifdef __cplusplus
extern "C"{
#endif

  void *__RPC_API MIDL_user_allocate(size_t);
  void __RPC_API MIDL_user_free(void *);

#include <olectl.h>
  EXTERN_C const GUID CMDSETID_Forms3;
  EXTERN_C const GUID CLSID_MHTMLDocument;
  EXTERN_C const GUID CLSID_HTADocument;
  EXTERN_C const GUID CLSID_HTMLApplication;
  EXTERN_C const GUID CLSID_HTMLPluginDocument;
  DEFINE_GUID(SID_SEditCommandTarget,0x3050f4b5,0x98b5,0x11cf,0xbb,0x82,0x00,0xaa,0x00,0xbd,0xce,0x0b);
  DEFINE_GUID(CGID_EditStateCommands,0x3050f4b6,0x98b5,0x11cf,0xbb,0x82,0x00,0xaa,0x00,0xbd,0xce,0x0b);
  DEFINE_GUID(SID_SHTMLEditHost,0x3050f6a0,0x98b5,0x11cf,0xbb,0x82,0x00,0xaa,0x00,0xbd,0xce,0x0b);
  DEFINE_GUID(SID_SHTMLEditServices,0x3050f7f9,0x98b5,0x11cf,0xbb,0x82,0x00,0xaa,0x00,0xbd,0xce,0x0b);
#define SID_SHTMLWindow IID_IHTMLWindow2
#define SID_SElementBehaviorFactory IID_IElementBehaviorFactory
#define COOKIEACTION_NONE 0x00000000
#define COOKIEACTION_ACCEPT 0x00000001
#define COOKIEACTION_REJECT 0x00000002
#define COOKIEACTION_DOWNGRADE 0x00000004
#define COOKIEACTION_LEASH 0x00000008
#define COOKIEACTION_SUPPRESS 0x00000010
#define COOKIEACTION_READ 0x00000020
#define PRIVACY_URLISTOPLEVEL 0x00010000
#define PRIVACY_URLHASCOMPACTPOLICY 0x00020000
#define PRIVACY_URLHASPOSTDATA 0x00080000
#define PRIVACY_URLHASPOLICYREFLINK 0x00100000
#define PRIVACY_URLHASPOLICYREFHEADER 0x00200000
#define PRIVACY_URLHASP3PHEADER 0x00400000
#ifndef _WINGDI_
  typedef struct tagLOGFONTA {
    LONG lfHeight;
    LONG lfWidth;
    LONG lfEscapement;
    LONG lfOrientation;
    LONG lfWeight;
    BYTE lfItalic;
    BYTE lfUnderline;
    BYTE lfStrikeOut;
    BYTE lfCharSet;
    BYTE lfOutPrecision;
    BYTE lfClipPrecision;
    BYTE lfQuality;
    BYTE lfPitchAndFamily;
    CHAR lfFaceName[32 ];
  } LOGFONTA;

  typedef struct tagLOGFONTW {
    LONG lfHeight;
    LONG lfWidth;
    LONG lfEscapement;
    LONG lfOrientation;
    LONG lfWeight;
    BYTE lfItalic;
    BYTE lfUnderline;
    BYTE lfStrikeOut;
    BYTE lfCharSet;
    BYTE lfOutPrecision;
    BYTE lfClipPrecision;
    BYTE lfQuality;
    BYTE lfPitchAndFamily;
    WCHAR lfFaceName[32 ];
  } LOGFONTW;

  typedef LOGFONTA LOGFONT;
#endif

  extern RPC_IF_HANDLE __MIDL_itf_mshtml_0000_v0_0_c_ifspec;
  extern RPC_IF_HANDLE __MIDL_itf_mshtml_0000_v0_0_s_ifspec;

#ifndef __IHTMLFiltersCollection_INTERFACE_DEFINED__
#define __IHTMLFiltersCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLFiltersCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLFiltersCollection : public IDispatch {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;
    virtual HRESULT WINAPI item(VARIANT *pvarIndex,VARIANT *pvarResult) = 0;
  };
#else
  typedef struct IHTMLFiltersCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLFiltersCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLFiltersCollection *This);
      ULONG (WINAPI *Release)(IHTMLFiltersCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFiltersCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLFiltersCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLFiltersCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLFiltersCollection *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_length)(IHTMLFiltersCollection *This,long *p);
      HRESULT (WINAPI *get__newEnum)(IHTMLFiltersCollection *This,IUnknown **p);
      HRESULT (WINAPI *item)(IHTMLFiltersCollection *This,VARIANT *pvarIndex,VARIANT *pvarResult);
    END_INTERFACE
  } IHTMLFiltersCollectionVtbl;
  interface IHTMLFiltersCollection {
    CONST_VTBL struct IHTMLFiltersCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLFiltersCollection_get_length_Proxy(IHTMLFiltersCollection *This,long *p);
  void __RPC_STUB IHTMLFiltersCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFiltersCollection_get__newEnum_Proxy(IHTMLFiltersCollection *This,IUnknown **p);
  void __RPC_STUB IHTMLFiltersCollection_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFiltersCollection_item_Proxy(IHTMLFiltersCollection *This,VARIANT *pvarIndex,VARIANT *pvarResult);
  void __RPC_STUB IHTMLFiltersCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __MSHTML_LIBRARY_DEFINED__
#define __MSHTML_LIBRARY_DEFINED__
  typedef enum _htmlDesignMode {
    htmlDesignModeInherit = -2,htmlDesignModeOn = -1,htmlDesignModeOff = 0,htmlDesignMode_Max = 2147483647L
  } htmlDesignMode;

  typedef enum _htmlZOrder {
    htmlZOrderFront = 0,htmlZOrderBack = 1,htmlZOrder_Max = 2147483647L
  } htmlZOrder;

  typedef enum _htmlClear {
    htmlClearNotSet = 0,htmlClearAll = 1,htmlClearLeft = 2,htmlClearRight = 3,htmlClearBoth = 4,htmlClearNone = 5,htmlClear_Max = 2147483647L
  } 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 = 2147483647L
  } htmlControlAlign;

  typedef enum _htmlBlockAlign {
    htmlBlockAlignNotSet = 0,htmlBlockAlignLeft = 1,htmlBlockAlignCenter = 2,htmlBlockAlignRight = 3,htmlBlockAlignJustify = 4,htmlBlockAlign_Max = 2147483647L
  } htmlBlockAlign;

  typedef enum _htmlReadyState {
    htmlReadyStateuninitialized = 0,htmlReadyStateloading = 1,htmlReadyStateloaded = 2,htmlReadyStateinteractive = 3,htmlReadyStatecomplete = 4,htmlReadyState_Max = 2147483647L
  } htmlReadyState;

  typedef enum _htmlLoop {
    htmlLoopLoopInfinite = -1,htmlLoop_Max = 2147483647L
  } 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 = 2147483647L
  } mediaType;

  typedef enum _styleTextTransform {
    styleTextTransformNotSet = 0,styleTextTransformCapitalize = 1,styleTextTransformLowercase = 2,styleTextTransformUppercase = 3,styleTextTransformNone = 4,styleTextTransform_Max = 2147483647L
  } styleTextTransform;

  typedef enum _styleDataRepeat {
    styleDataRepeatNone = 0,styleDataRepeatInner = 1,styleDataRepeat_Max = 2147483647L
  } styleDataRepeat;

  typedef enum _styleOverflow {
    styleOverflowNotSet = 0,styleOverflowAuto = 1,styleOverflowHidden = 2,styleOverflowVisible = 3,styleOverflowScroll = 4,styleOverflow_Max = 2147483647L
  } styleOverflow;

  typedef enum _styleTableLayout {
    styleTableLayoutNotSet = 0,styleTableLayoutAuto = 1,styleTableLayoutFixed = 2,styleTableLayout_Max = 2147483647L
  } styleTableLayout;

  typedef enum _styleBorderCollapse {
    styleBorderCollapseNotSet = 0,styleBorderCollapseSeparate = 1,styleBorderCollapseCollapse = 2,styleBorderCollapse_Max = 2147483647L
  } styleBorderCollapse;

  typedef enum _styleFontStyle {
    styleFontStyleNotSet = 0,styleFontStyleItalic = 1,styleFontStyleOblique = 2,styleFontStyleNormal = 3,styleFontStyle_Max = 2147483647L
  } styleFontStyle;

  typedef enum _styleFontVariant {
    styleFontVariantNotSet = 0,styleFontVariantSmallCaps = 1,styleFontVariantNormal = 2,styleFontVariant_Max = 2147483647L
  } styleFontVariant;

  typedef enum _styleBackgroundRepeat {
    styleBackgroundRepeatRepeat = 0,styleBackgroundRepeatRepeatX = 1,styleBackgroundRepeatRepeatY = 2,styleBackgroundRepeatNoRepeat = 3,styleBackgroundRepeatNotSet = 4,styleBackgroundRepeat_Max = 2147483647L
  } styleBackgroundRepeat;

  typedef enum _styleBackgroundAttachment {
    styleBackgroundAttachmentFixed = 0,styleBackgroundAttachmentScroll = 1,styleBackgroundAttachmentNotSet = 2,styleBackgroundAttachment_Max = 2147483647L
  } styleBackgroundAttachment;

  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 = 2147483647L
  } styleVerticalAlign;

  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 = 2147483647L
  } styleFontWeight;

  typedef enum _styleBackgroundPositionX {
    styleBackgroundPositionXNotSet = 0,styleBackgroundPositionXLeft = 1,styleBackgroundPositionXCenter = 2,styleBackgroundPositionXRight = 3,styleBackgroundPositionX_Max = 2147483647L
  } styleBackgroundPositionX;

  typedef enum _styleBackgroundPositionY {
    styleBackgroundPositionYNotSet = 0,styleBackgroundPositionYTop = 1,styleBackgroundPositionYCenter = 2,styleBackgroundPositionYBottom = 3,styleBackgroundPositionY_Max = 2147483647L
  } styleBackgroundPositionY;

  typedef enum _styleFontSize {
    styleFontSizeXXSmall = 0,styleFontSizeXSmall = 1,styleFontSizeSmall = 2,styleFontSizeMedium = 3,styleFontSizeLarge = 4,styleFontSizeXLarge = 5,styleFontSizeXXLarge = 6,styleFontSizeSmaller = 7,styleFontSizeLarger = 8,styleFontSize_Max = 2147483647L
  } styleFontSize;

  typedef enum _styleAuto {
    styleAutoAuto = 0,styleAuto_Max = 2147483647L
  } styleAuto;

  typedef enum _styleNormal {
    styleNormalNormal = 0,styleNormal_Max = 2147483647L
  } styleNormal;

  typedef enum _styleBorderWidth {
    styleBorderWidthThin = 0,styleBorderWidthMedium = 1,styleBorderWidthThick = 2,styleBorderWidth_Max = 2147483647L
  } styleBorderWidth;

  typedef enum _stylePosition {
    stylePositionNotSet = 0,stylePositionstatic = 1,stylePositionrelative = 2,stylePositionabsolute = 3,stylePositionfixed = 4,stylePosition_Max = 2147483647L
  } 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,styleBorderStyle_Max = 2147483647L
  } styleBorderStyle;

  typedef enum _styleStyleFloat {
    styleStyleFloatNotSet = 0,styleStyleFloatLeft = 1,styleStyleFloatRight = 2,styleStyleFloatNone = 3,styleStyleFloat_Max = 2147483647L
  } styleStyleFloat;

  typedef enum _styleDisplay {
    styleDisplayNotSet = 0,styleDisplayBlock = 1,styleDisplayInline = 2,styleDisplayListItem = 3,styleDisplayNone = 4,styleDisplayTableHeaderGroup = 5,styleDisplayTableFooterGroup = 6,styleDisplayInlineBlock = 7,styleDisplay_Max = 2147483647L
  } styleDisplay;

  typedef enum _styleVisibility {
    styleVisibilityNotSet = 0,styleVisibilityInherit = 1,styleVisibilityVisible = 2,styleVisibilityHidden = 3,styleVisibility_Max = 2147483647L
  } styleVisibility;

  typedef enum _styleListStyleType {
    styleListStyleTypeNotSet = 0,styleListStyleTypeDisc = 1,styleListStyleTypeCircle = 2,styleListStyleTypeSquare = 3,styleListStyleTypeDecimal = 4,styleListStyleTypeLowerRoman = 5,styleListStyleTypeUpperRoman = 6,styleListStyleTypeLowerAlpha = 7,styleListStyleTypeUpperAlpha = 8,styleListStyleTypeNone = 9,styleListStyleType_Max = 2147483647L
  } styleListStyleType;

  typedef enum _styleListStylePosition {
    styleListStylePositionNotSet = 0,styleListStylePositionInside = 1,styleListStylePositionOutSide = 2,styleListStylePosition_Max = 2147483647L
  } styleListStylePosition;

  typedef enum _styleWhiteSpace {
    styleWhiteSpaceNotSet = 0,styleWhiteSpaceNormal = 1,styleWhiteSpacePre = 2,styleWhiteSpaceNowrap = 3,styleWhiteSpace_Max = 2147483647L
  } styleWhiteSpace;

  typedef enum _stylePageBreak {
    stylePageBreakNotSet = 0,stylePageBreakAuto = 1,stylePageBreakAlways = 2,stylePageBreakLeft = 3,stylePageBreakRight = 4,stylePageBreak_Max = 2147483647L
  } stylePageBreak;

  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,styleCursorcustom = 24,styleCursorNotSet = 25,styleCursor_Max = 2147483647L
  } styleCursor;

  typedef enum _styleDir {
    styleDirNotSet = 0,styleDirLeftToRight = 1,styleDirRightToLeft = 2,styleDirInherit = 3,styleDir_Max = 2147483647L
  } styleDir;

  typedef enum _styleBidi {
    styleBidiNotSet = 0,styleBidiNormal = 1,styleBidiEmbed = 2,styleBidiOverride = 3,styleBidiInherit = 4,styleBidi_Max = 2147483647L
  } styleBidi;

  typedef enum _styleImeMode {
    styleImeModeAuto = 0,styleImeModeActive = 1,styleImeModeInactive = 2,styleImeModeDisabled = 3,styleImeModeNotSet = 4,styleImeMode_Max = 2147483647L
  } styleImeMode;

  typedef enum _styleRubyAlign {
    styleRubyAlignNotSet = 0,styleRubyAlignAuto = 1,styleRubyAlignLeft = 2,styleRubyAlignCenter = 3,styleRubyAlignRight = 4,styleRubyAlignDistributeLetter = 5,styleRubyAlignDistributeSpace = 6,styleRubyAlignLineEdge = 7,styleRubyAlign_Max = 2147483647L
  } styleRubyAlign;

  typedef enum _styleRubyPosition {
    styleRubyPositionNotSet = 0,styleRubyPositionAbove = 1,styleRubyPositionInline = 2,styleRubyPosition_Max = 2147483647L
  } styleRubyPosition;

  typedef enum _styleRubyOverhang {
    styleRubyOverhangNotSet = 0,styleRubyOverhangAuto = 1,styleRubyOverhangWhitespace = 2,styleRubyOverhangNone = 3,styleRubyOverhang_Max = 2147483647L
  } styleRubyOverhang;

  typedef enum _styleLayoutGridChar {
    styleLayoutGridCharNotSet = 0,styleLayoutGridCharAuto = 1,styleLayoutGridCharNone = 2,styleLayoutGridChar_Max = 2147483647L
  } styleLayoutGridChar;

  typedef enum _styleLayoutGridLine {
    styleLayoutGridLineNotSet = 0,styleLayoutGridLineAuto = 1,styleLayoutGridLineNone = 2,styleLayoutGridLine_Max = 2147483647L
  } styleLayoutGridLine;

  typedef enum _styleLayoutGridMode {
    styleLayoutGridModeNotSet = 0,styleLayoutGridModeChar = 1,styleLayoutGridModeLine = 2,styleLayoutGridModeBoth = 3,styleLayoutGridModeNone = 4,styleLayoutGridMode_Max = 2147483647L
  } styleLayoutGridMode;

  typedef enum _styleLayoutGridType {
    styleLayoutGridTypeNotSet = 0,styleLayoutGridTypeLoose = 1,styleLayoutGridTypeStrict = 2,styleLayoutGridTypeFixed = 3,styleLayoutGridType_Max = 2147483647L
  } styleLayoutGridType;

  typedef enum _styleLineBreak {
    styleLineBreakNotSet = 0,styleLineBreakNormal = 1,styleLineBreakStrict = 2,styleLineBreak_Max = 2147483647L
  } styleLineBreak;

  typedef enum _styleWordBreak {
    styleWordBreakNotSet = 0,styleWordBreakNormal = 1,styleWordBreakBreakAll = 2,styleWordBreakKeepAll = 3,styleWordBreak_Max = 2147483647L
  } styleWordBreak;

  typedef enum _styleWordWrap {
    styleWordWrapNotSet = 0,styleWordWrapOff = 1,styleWordWrapOn = 2,styleWordWrap_Max = 2147483647L
  } styleWordWrap;

  typedef enum _styleTextJustify {
    styleTextJustifyNotSet = 0,styleTextJustifyInterWord = 1,styleTextJustifyNewspaper = 2,styleTextJustifyDistribute = 3,styleTextJustifyDistributeAllLines = 4,styleTextJustifyInterIdeograph = 5,styleTextJustifyInterCluster = 6,styleTextJustifyKashida = 7,styleTextJustifyAuto = 8,styleTextJustify_Max = 2147483647L
  } styleTextJustify;

  typedef enum _styleTextAlignLast {
    styleTextAlignLastNotSet = 0,styleTextAlignLastLeft = 1,styleTextAlignLastCenter = 2,styleTextAlignLastRight = 3,styleTextAlignLastJustify = 4,styleTextAlignLastAuto = 5,styleTextAlignLast_Max = 2147483647L
  } styleTextAlignLast;

  typedef enum _styleTextJustifyTrim {
    styleTextJustifyTrimNotSet = 0,styleTextJustifyTrimNone = 1,styleTextJustifyTrimPunctuation = 2,styleTextJustifyTrimPunctAndKana = 3,styleTextJustifyTrim_Max = 2147483647L
  } styleTextJustifyTrim;

  typedef enum _styleAccelerator {
    styleAcceleratorFalse = 0,styleAcceleratorTrue = 1,styleAccelerator_Max = 2147483647L
  } styleAccelerator;

  typedef enum _styleLayoutFlow {
    styleLayoutFlowHorizontal = 0,styleLayoutFlowVerticalIdeographic = 1,styleLayoutFlowNotSet = 2,styleLayoutFlow_Max = 2147483647L
  } styleLayoutFlow;

  typedef enum _styleWritingMode {
    styleWritingModeLrtb = 0,styleWritingModeTbrl = 1,styleWritingModeNotSet = 2,styleWritingMode_Max = 2147483647L
  } styleWritingMode;

  typedef enum _styleBool {
    styleBoolFalse = 0,styleBoolTrue = 1,styleBool_Max = 2147483647L
  } styleBool;

  typedef enum _styleTextUnderlinePosition {
    styleTextUnderlinePositionBelow = 0,styleTextUnderlinePositionAbove = 1,styleTextUnderlinePositionAuto = 2,styleTextUnderlinePositionNotSet = 3,styleTextUnderlinePosition_Max = 2147483647L
  } styleTextUnderlinePosition;

  typedef enum _styleTextOverflow {
    styleTextOverflowClip = 0,styleTextOverflowEllipsis = 1,styleTextOverflowNotSet = 2,styleTextOverflow_Max = 2147483647L
  } styleTextOverflow;

  EXTERN_C const GUID CLSID_CStyle;
  EXTERN_C const GUID CLSID_CRuleStyle;

  typedef enum _styleTextLineThroughStyle {
    styleTextLineThroughStyleUndefined = 0,styleTextLineThroughStyleSingle = 1,styleTextLineThroughStyleDouble = 2,styleTextLineThroughStyle_Max = 2147483647L
  } 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 = 2147483647L
  } styleTextUnderlineStyle;

  typedef enum _styleTextEffect {
    styleTextEffectNone = 0,styleTextEffectEmboss = 1,styleTextEffectEngrave = 2,styleTextEffectOutline = 3,styleTextEffect_Max = 2147483647L
  } styleTextEffect;

  typedef enum _styleDefaultTextSelection {
    styleDefaultTextSelectionFalse = 0,styleDefaultTextSelectionTrue = 1,styleDefaultTextSelection_Max = 2147483647L
  } styleDefaultTextSelection;

  typedef enum _styleTextDecoration {
    styleTextDecorationNone = 0,styleTextDecorationUnderline = 1,styleTextDecorationOverline = 2,styleTextDecorationLineThrough = 3,styleTextDecorationBlink = 4,styleTextDecoration_Max = 2147483647L
  } styleTextDecoration;

  EXTERN_C const GUID CLSID_CRenderStyle;

  typedef enum _textDecoration {
    textDecorationNone = 0,textDecorationUnderline = 1,textDecorationOverline = 2,textDecorationLineThrough = 3,textDecorationBlink = 4,textDecoration_Max = 2147483647L
  } textDecoration;

  EXTERN_C const GUID CLSID_CCurrentStyle;
  EXTERN_C const GUID CLSID_CAttribute;
  EXTERN_C const GUID CLSID_CDOMTextNode;
  EXTERN_C const GUID CLSID_CDOMImplementation;
  EXTERN_C const GUID CLSID_CAttrCollectionator;
  EXTERN_C const GUID CLSID_CDOMChildrenCollection;

  typedef enum _htmlListType {
    htmlListTypeNotSet = 0,htmlListTypeLargeAlpha = 1,htmlListTypeSmallAlpha = 2,htmlListTypeLargeRoman = 3,htmlListTypeSmallRoman = 4,htmlListTypeNumbers = 5,htmlListTypeDisc = 6,htmlListTypeCircle = 7,htmlListTypeSquare = 8,htmlListType_Max = 2147483647L
  } htmlListType;

  typedef enum _htmlMethod {
    htmlMethodNotSet = 0,htmlMethodGet = 1,htmlMethodPost = 2,htmlMethod_Max = 2147483647L
  } htmlMethod;

  typedef enum _htmlWrap {
    htmlWrapOff = 1,htmlWrapSoft = 2,htmlWrapHard = 3,htmlWrap_Max = 2147483647L
  } htmlWrap;

  typedef enum _htmlDir {
    htmlDirNotSet = 0,htmlDirLeftToRight = 1,htmlDirRightToLeft = 2,htmlDir_Max = 2147483647L
  } htmlDir;

  typedef enum _htmlEditable {
    htmlEditableInherit = 0,htmlEditableTrue = 1,htmlEditableFalse = 2,htmlEditable_Max = 2147483647L
  } 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,htmlInput_Max = 2147483647L
  } htmlInput;

  typedef enum _htmlEncoding {
    htmlEncodingURL = 0,htmlEncodingMultipart = 1,htmlEncodingText = 2,htmlEncoding_Max = 2147483647L
  } htmlEncoding;

  typedef enum _htmlAdjacency {
    htmlAdjacencyBeforeBegin = 1,htmlAdjacencyAfterBegin = 2,htmlAdjacencyBeforeEnd = 3,htmlAdjacencyAfterEnd = 4,htmlAdjacency_Max = 2147483647L
  } htmlAdjacency;

  typedef enum _htmlTabIndex {
    htmlTabIndexNotSet = -32768,htmlTabIndex_Max = 2147483647L
  } 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 = 2147483647L
  } htmlComponent;

  typedef enum _htmlApplyLocation {
    htmlApplyLocationInside = 0,htmlApplyLocationOutside = 1,htmlApplyLocation_Max = 2147483647L
  } htmlApplyLocation;

  typedef enum _htmlGlyphMode {
    htmlGlyphModeNone = 0,htmlGlyphModeBegin = 1,htmlGlyphModeEnd = 2,htmlGlyphModeBoth = 3,htmlGlyphMode_Max = 2147483647L
  } htmlGlyphMode;

  EXTERN_C const GUID CLSID_CDefaults;
  EXTERN_C const GUID CLSID_CHtmlComponentDD;
  EXTERN_C const GUID CLSID_CHtmlComponentProperty;
  EXTERN_C const GUID CLSID_CHtmlComponentMethod;
  EXTERN_C const GUID CLSID_CHtmlComponentEvent;
  EXTERN_C const GUID CLSID_CHtmlComponentAttach;
  EXTERN_C const GUID CLSID_CHtmlComponentDesc;
  EXTERN_C const GUID CLSID_CPeerUrnCollection;
  EXTERN_C const GUID CLSID_CGenericElement;
  EXTERN_C const GUID CLSID_CStyleSheetRule;
  EXTERN_C const GUID CLSID_CStyleSheetRuleArray;
  EXTERN_C const GUID CLSID_CStyleSheetPage;
  EXTERN_C const GUID CLSID_CStyleSheetPageArray;
  EXTERN_C const GUID CLSID_CStyleSheet;
  EXTERN_C const GUID CLSID_CStyleSheetArray;
  EXTERN_C const GUID CLSID_CLinkElement;

  typedef enum _htmlUnit {
    htmlUnitCharacter = 1,htmlUnitWord = 2,htmlUnitSentence = 3,htmlUnitTextEdit = 6,htmlUnit_Max = 2147483647L
  } htmlUnit;

  typedef enum _htmlEndPoints {
    htmlEndPointsStartToStart = 1,htmlEndPointsStartToEnd = 2,htmlEndPointsEndToStart = 3,htmlEndPointsEndToEnd = 4,htmlEndPoints_Max = 2147483647L
  } htmlEndPoints;

  typedef enum _htmlDirection {
    htmlDirectionForward = 99999,htmlDirectionBackward = -99999,htmlDirection_Max = 2147483647L
  } htmlDirection;

  EXTERN_C const GUID CLSID_CFormElement;
  typedef enum _htmlStart {
    htmlStartfileopen = 0,htmlStartmouseover = 1,htmlStart_Max = 2147483647L
  } htmlStart;

  EXTERN_C const GUID CLSID_CTextElement;
  EXTERN_C const GUID CLSID_CImgElement;
  EXTERN_C const GUID CLSID_CImageElementFactory;

  typedef enum _bodyScroll {
    bodyScrollyes = 1,bodyScrollno = 2,bodyScrollauto = 4,bodyScrolldefault = 3,bodyScroll_Max = 2147483647L
  } bodyScroll;

  EXTERN_C const GUID CLSID_CBodyElement;
  EXTERN_C const GUID CLSID_CFontElement;
  EXTERN_C const GUID CLSID_CAnchorElement;
  EXTERN_C const GUID CLSID_CLabelElement;
  EXTERN_C const GUID CLSID_CListElement;
  EXTERN_C const GUID CLSID_CUListElement;
  EXTERN_C const GUID CLSID_COListElement;
  EXTERN_C const GUID CLSID_CLIElement;
  EXTERN_C const GUID CLSID_CBlockElement;
  EXTERN_C const GUID CLSID_CDivElement;
  EXTERN_C const GUID CLSID_CDDElement;
  EXTERN_C const GUID CLSID_CDTElement;
  EXTERN_C const GUID CLSID_CBRElement;
  EXTERN_C const GUID CLSID_CDListElement;
  EXTERN_C const GUID CLSID_CHRElement;
  EXTERN_C const GUID CLSID_CParaElement;
  EXTERN_C const GUID CLSID_CElementCollection;
  EXTERN_C const GUID CLSID_CHeaderElement;

  typedef enum _htmlSelectType {
    htmlSelectTypeSelectOne = 1,htmlSelectTypeSelectMultiple = 2,htmlSelectType_Max = 2147483647L
  } htmlSelectType;

  EXTERN_C const GUID CLSID_CSelectElement;

  typedef enum _htmlSelection {
    htmlSelectionNone = 0,htmlSelectionText = 1,htmlSelectionControl = 2,htmlSelectionTable = 3,htmlSelection_Max = 2147483647L
  } htmlSelection;

  EXTERN_C const GUID CLSID_COptionElement;
  EXTERN_C const GUID CLSID_COptionElementFactory;
  EXTERN_C const GUID CLSID_CInput;
  EXTERN_C const GUID CLSID_CTextArea;
  EXTERN_C const GUID CLSID_CRichtext;
  EXTERN_C const GUID CLSID_CButton;

  typedef enum _htmlMarqueeBehavior {
    htmlMarqueeBehaviorscroll = 1,htmlMarqueeBehaviorslide = 2,htmlMarqueeBehavioralternate = 3,htmlMarqueeBehavior_Max = 2147483647L
  } htmlMarqueeBehavior;

  typedef enum _htmlMarqueeDirection {
    htmlMarqueeDirectionleft = 1,htmlMarqueeDirectionright = 3,htmlMarqueeDirectionup = 5,htmlMarqueeDirectiondown = 7,htmlMarqueeDirection_Max = 2147483647L
  } htmlMarqueeDirection;

  EXTERN_C const GUID CLSID_CMarquee;
  EXTERN_C const GUID CLSID_CHtmlElement;
  EXTERN_C const GUID CLSID_CHeadElement;
  EXTERN_C const GUID CLSID_CTitleElement;
  EXTERN_C const GUID CLSID_CMetaElement;
  EXTERN_C const GUID CLSID_CBaseElement;
  EXTERN_C const GUID CLSID_CIsIndexElement;
  EXTERN_C const GUID CLSID_CNextIdElement;
  EXTERN_C const GUID CLSID_CBaseFontElement;
  EXTERN_C const GUID CLSID_CUnknownElement;
  EXTERN_C const GUID CLSID_COmHistory;
  EXTERN_C const GUID CLSID_CMimeTypes;
  EXTERN_C const GUID CLSID_CPlugins;
  EXTERN_C const GUID CLSID_COpsProfile;
  EXTERN_C const GUID CLSID_COmNavigator;
  EXTERN_C const GUID CLSID_COmLocation;

  typedef enum _htmlPersistState {
    htmlPersistStateNormal = 0,htmlPersistStateFavorite = 1,htmlPersistStateHistory = 2,htmlPersistStateSnapshot = 3,htmlPersistStateUserData = 4,htmlPersistState_Max = 2147483647L
  } htmlPersistState;

  typedef enum _htmlDropEffect {
    htmlDropEffectCopy = 0,htmlDropEffectLink = 1,htmlDropEffectMove = 2,htmlDropEffectNone = 3,htmlDropEffect_Max = 2147483647L
  } htmlDropEffect;

  typedef enum _htmlEffectAllowed {
    htmlEffectAllowedCopy = 0,htmlEffectAllowedLink = 1,htmlEffectAllowedMove = 2,htmlEffectAllowedCopyLink = 3,htmlEffectAllowedCopyMove = 4,htmlEffectAllowedLinkMove = 5,htmlEffectAllowedAll = 6,htmlEffectAllowedNone = 7,htmlEffectAllowedUninitialized = 8,htmlEffectAllowed_Max = 2147483647L
  } htmlEffectAllowed;

  EXTERN_C const GUID CLSID_CEventObj;
  EXTERN_C const GUID CLSID_CFramesCollection;
  EXTERN_C const GUID CLSID_CScreen;
  EXTERN_C const GUID CLSID_CWindow;
  EXTERN_C const GUID CLSID_COmWindowProxy;

  typedef enum _htmlCompatMode {
    htmlCompatModeBackCompat = 0,htmlCompatModeCSS1Compat = 1,htmlCompatMode_Max = 2147483647L
  } htmlCompatMode;

  EXTERN_C const GUID CLSID_CDocument;
  EXTERN_C const GUID CLSID_CScriptlet;

  typedef enum _BoolValue {
    True = 1,False = 0,BoolValue_Max = 2147483647L
  } BoolValue;

  EXTERN_C const GUID CLSID_CPluginSite;
  EXTERN_C const GUID CLSID_CAreasCollection;
  EXTERN_C const GUID CLSID_CMapElement;
  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 = 2147483647L
  } htmlCaptionAlign;

  typedef enum _htmlCaptionVAlign {
    htmlCaptionVAlignNotSet = 0,htmlCaptionVAlignTop = 1,htmlCaptionVAlignBottom = 2,htmlCaptionVAlign_Max = 2147483647L
  } htmlCaptionVAlign;

  EXTERN_C const GUID CLSID_CTableCaption;
  EXTERN_C const GUID CLSID_CCommentElement;
  EXTERN_C const GUID CLSID_CPhraseElement;
  EXTERN_C const GUID CLSID_CSpanElement;

  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 = 2147483647L
  } htmlFrame;

  typedef enum _htmlRules {
    htmlRulesNotSet = 0,htmlRulesnone = 1,htmlRulesgroups = 2,htmlRulesrows = 3,htmlRulescols = 4,htmlRulesall = 5,htmlRules_Max = 2147483647L
  } htmlRules;

  typedef enum _htmlCellAlign {
    htmlCellAlignNotSet = 0,htmlCellAlignLeft = 1,htmlCellAlignCenter = 2,htmlCellAlignRight = 3,htmlCellAlignMiddle = htmlCellAlignCenter,htmlCellAlign_Max = 2147483647L
  } htmlCellAlign;

  typedef enum _htmlCellVAlign {
    htmlCellVAlignNotSet = 0,htmlCellVAlignTop = 1,htmlCellVAlignMiddle = 2,htmlCellVAlignBottom = 3,htmlCellVAlignBaseline = 4,htmlCellVAlignCenter = htmlCellVAlignMiddle,htmlCellVAlign_Max = 2147483647L
  } htmlCellVAlign;

  EXTERN_C const GUID CLSID_CTable;
  EXTERN_C const GUID CLSID_CTableCol;
  EXTERN_C const GUID CLSID_CTableSection;
  EXTERN_C const GUID CLSID_CTableRow;
  EXTERN_C const GUID CLSID_CTableCell;
  EXTERN_C const GUID CLSID_CScriptElement;
  EXTERN_C const GUID CLSID_CNoShowElement;
  EXTERN_C const GUID CLSID_CObjectElement;
  EXTERN_C const GUID CLSID_CParamElement;

  typedef enum _frameScrolling {
    frameScrollingyes = 1,frameScrollingno = 2,frameScrollingauto = 4,frameScrolling_Max = 2147483647L
  } frameScrolling;

  EXTERN_C const GUID CLSID_CFrameSite;
  EXTERN_C const GUID CLSID_CFrameElement;
  EXTERN_C const GUID CLSID_CIFrameElement;
  EXTERN_C const GUID CLSID_C1DElement;
  EXTERN_C const GUID CLSID_CFieldSetElement;
  EXTERN_C const GUID CLSID_CLegendElement;
  EXTERN_C const GUID CLSID_CSpanSite;
  EXTERN_C const GUID CLSID_CFrameSetSite;
  EXTERN_C const GUID CLSID_CBGsound;
  EXTERN_C const GUID CLSID_CStyleElement;
  EXTERN_C const GUID CLSID_CFontFace;

  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 = 2147483647L
  } ELEMENT_CORNER;

  typedef enum _SECUREURLHOSTVALIDATE_FLAGS {
    SUHV_PROMPTBEFORENO = 0x1,SUHV_SILENTYES = 0x2,SUHV_UNSECURESOURCE = 0x4,SECUREURLHOSTVALIDATE_FLAGS_Max = 2147483647L
  } SECUREURLHOSTVALIDATE_FLAGS;

  typedef enum _POINTER_GRAVITY {
    POINTER_GRAVITY_Left = 0,POINTER_GRAVITY_Right = 1,POINTER_GRAVITY_Max = 2147483647L
  } 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 = 2147483647L
  } 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 = 2147483647L
  } MARKUP_CONTEXT_TYPE;

  typedef enum _FINDTEXT_FLAGS {
    FINDTEXT_BACKWARDS = 0x1,FINDTEXT_WHOLEWORD = 0x2,FINDTEXT_MATCHCASE = 0x4,FINDTEXT_RAW = 0x20000,FINDTEXT_MATCHDIAC = 0x20000000,FINDTEXT_MATCHKASHIDA = 0x40000000,FINDTEXT_MATCHALEFHAMZA = 0x80000000,FINDTEXT_FLAGS_Max = 2147483647L
  } 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 = 2147483647L
  } MOVEUNIT_ACTION;

  typedef enum _PARSE_FLAGS {
    PARSE_ABSOLUTIFYIE40URLS = 0x1,PARSE_FLAGS_Max = 2147483647L
  } 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_COUNT = 110,TAGID_LAST_PREDEFINED = 10000,ELEMENT_TAG_ID_Max = 2147483647L
  } 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 = 2147483647L
  } SELECTION_TYPE;

  typedef enum _SAVE_SEGMENTS_FLAGS {
    SAVE_SEGMENTS_NoIE4SelectionCompat = 0x1,SAVE_SEGMENTS_FLAGS_Max = 2147483647L
  } 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 = 2147483647L
  } CARET_DIRECTION;

  typedef enum _LINE_DIRECTION {
    LINE_DIRECTION_RightToLeft = 1,LINE_DIRECTION_LeftToRight = 2,LINE_DIRECTION_Max = 2147483647L
  } LINE_DIRECTION;

  typedef enum _HT_OPTIONS {
    HT_OPT_AllowAfterEOL = 0x1,HT_OPTIONS_Max = 2147483647L
  } HT_OPTIONS;

  typedef enum _HT_RESULTS {
    HT_RESULTS_Glyph = 0x1,HT_RESULTS_Max = 2147483647L
  } 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 = 2147483647L
  } DISPLAY_MOVEUNIT;

  typedef enum _DISPLAY_GRAVITY {
    DISPLAY_GRAVITY_PreviousLine = 1,DISPLAY_GRAVITY_NextLine = 2,DISPLAY_GRAVITY_Max = 2147483647L
  } DISPLAY_GRAVITY;

  typedef enum _DISPLAY_BREAK {
    DISPLAY_BREAK_None = 0,DISPLAY_BREAK_Block = 0x1,DISPLAY_BREAK_Break = 0x2,DISPLAY_BREAK_Max = 2147483647L
  } 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_Max = 2147483647L
  } COORD_SYSTEM;

  EXTERN_C const GUID CLSID_HtmlDlgSafeHelper;
  EXTERN_C const GUID CLSID_BlockFormats;
  EXTERN_C const GUID CLSID_FontNames;
  EXTERN_C const GUID CLSID_CHTMLNamespace;
  EXTERN_C const GUID CLSID_CHTMLNamespaceCollection;

  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 = 2147483647L
  } 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 = 2147483647L
  } HTML_PAINT_ZORDER;

  typedef enum _HTML_PAINT_DRAW_FLAGS {
    HTMLPAINT_DRAW_UPDATEREGION = 0x1,HTMLPAINT_DRAW_USE_XFORM = 0x2,HTML_PAINT_DRAW_FLAGS_Max = 2147483647L
  } HTML_PAINT_DRAW_FLAGS;

  typedef enum _HTML_PAINT_EVENT_FLAGS {
    HTMLPAINT_EVENT_TARGET = 0x1,HTMLPAINT_EVENT_SETCURSOR = 0x2,HTML_PAINT_EVENT_FLAGS_Max = 2147483647L
  } 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 = 2147483647L
  } 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;

  typedef enum _HTMLDlgFlag {
    HTMLDlgFlagNo = 0,HTMLDlgFlagOff = 0,HTMLDlgFlag0 = 0,HTMLDlgFlagYes = 1,HTMLDlgFlagOn = 1,HTMLDlgFlag1 = 1,HTMLDlgFlagNotSet = -1,HTMLDlgFlag_Max = 2147483647L
  } HTMLDlgFlag;

  typedef enum _HTMLDlgBorder {
    HTMLDlgBorderThin = 0,HTMLDlgBorderThick = 0x40000L,HTMLDlgBorder_Max = 2147483647L
  } HTMLDlgBorder;

  typedef enum _HTMLDlgEdge {
    HTMLDlgEdgeSunken = 0,HTMLDlgEdgeRaised = 16,HTMLDlgEdge_Max = 2147483647L
  } HTMLDlgEdge;

  typedef enum _HTMLDlgCenter {
    HTMLDlgCenterNo = 0,HTMLDlgCenterOff = 0,HTMLDlgCenter0 = 0,HTMLDlgCenterYes = 1,HTMLDlgCenterOn = 1,HTMLDlgCenter1 = 1,HTMLDlgCenterParent = 1,HTMLDlgCenterDesktop = 2,HTMLDlgCenter_Max = 2147483647L
  } HTMLDlgCenter;

  EXTERN_C const GUID CLSID_CThreadDialogProcParam;
  EXTERN_C const GUID CLSID_CHTMLDlg;
  EXTERN_C const GUID CLSID_CHTMLPopup;

  typedef enum _HTMLAppFlag {
    HTMLAppFlagNo = 0,HTMLAppFlagOff = 0,HTMLAppFlag0 = 0,HTMLAppFlagYes = 1,HTMLAppFlagOn = 1,HTMLAppFlag1 = 1,HTMLAppFlag_Max = 2147483647L
  } HTMLAppFlag;

  typedef enum _HTMLMinimizeFlag {
    HTMLMinimizeFlagNo = 0,HTMLMinimizeFlagYes = 0x20000L,HTMLMinimizeFlag_Max = 2147483647L
  } HTMLMinimizeFlag;

  typedef enum _HTMLMaximizeFlag {
    HTMLMaximizeFlagNo = 0,HTMLMaximizeFlagYes = 0x10000L,HTMLMaximizeFlag_Max = 2147483647L
  } HTMLMaximizeFlag;

  typedef enum _HTMLCaptionFlag {
    HTMLCaptionFlagNo = 0,HTMLCaptionFlagYes = 0xc00000L,HTMLCaptionFlag_Max = 2147483647L
  } HTMLCaptionFlag;

  typedef enum _HTMLSysMenuFlag {
    HTMLSysMenuFlagNo = 0,HTMLSysMenuFlagYes = 0x80000L,HTMLSysMenuFlag_Max = 2147483647L
  } HTMLSysMenuFlag;

  typedef enum _HTMLBorder {
    HTMLBorderNone = 0,HTMLBorderThick = 0x40000L,HTMLBorderDialog = 0x400000L,HTMLBorderThin = 0x800000L,HTMLBorder_Max = 2147483647L
  } HTMLBorder;

  typedef enum _HTMLBorderStyle {
    HTMLBorderStyleNormal = 0,HTMLBorderStyleRaised = 0x100L,HTMLBorderStyleSunken = 0x200L,HTMLBorderStylecombined = 0x300L,HTMLBorderStyleStatic = 0x20000L,HTMLBorderStyle_Max = 2147483647L
  } HTMLBorderStyle;

  typedef enum _HTMLWindowState {
    HTMLWindowStateNormal = 1,HTMLWindowStateMaximize = 3,HTMLWindowStateMinimize = 6,HTMLWindowState_Max = 2147483647L
  } HTMLWindowState;

  EXTERN_C const GUID CLSID_CAppBehavior;

  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 = 2147483647L
  } BEHAVIOR_EVENT;

  typedef enum _BEHAVIOR_EVENT_FLAGS {
    BEHAVIOREVENTFLAGS_BUBBLE = 1,BEHAVIOREVENTFLAGS_STANDARDADDITIVE = 2,BEHAVIOR_EVENT_FLAGS_Max = 2147483647L
  } 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 = 2147483647L
  } 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 = 2147483647L
  } BEHAVIOR_RELATION;

  typedef enum _BEHAVIOR_LAYOUT_INFO {
    BEHAVIORLAYOUTINFO_FULLDELEGATION = 0x1,BEHAVIORLAYOUTINFO_MODIFYNATURAL = 0x2,BEHAVIORLAYOUTINFO_MAPSIZE = 0x4,BEHAVIOR_LAYOUT_INFO_Max = 2147483647L
  } 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 = 2147483647L
  } BEHAVIOR_LAYOUT_MODE;

  typedef enum _ELEMENTDESCRIPTOR_FLAGS {
    ELEMENTDESCRIPTORFLAGS_LITERAL = 1,ELEMENTDESCRIPTORFLAGS_NESTED_LITERAL = 2,ELEMENTDESCRIPTOR_FLAGS_Max = 2147483647L
  } ELEMENTDESCRIPTOR_FLAGS;

  typedef enum _ELEMENTNAMESPACE_FLAGS {
    ELEMENTNAMESPACEFLAGS_ALLOWANYTAG = 0x1,ELEMENTNAMESPACEFLAGS_QUERYFORUNKNOWNTAGS = 0x2,ELEMENTNAMESPACE_FLAGS_Max = 2147483647L
  } ELEMENTNAMESPACE_FLAGS;

  EXTERN_C const IID LIBID_MSHTML;

#ifndef __IHTMLEventObj_INTERFACE_DEFINED__
#define __IHTMLEventObj_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLEventObj;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLEventObj : public IDispatch {
  public:
    virtual HRESULT WINAPI get_srcElement(IHTMLElement **p) = 0;
    virtual HRESULT WINAPI get_altKey(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_ctrlKey(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_shiftKey(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_returnValue(VARIANT v) = 0;
    virtual HRESULT WINAPI get_returnValue(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_cancelBubble(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_cancelBubble(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_fromElement(IHTMLElement **p) = 0;
    virtual HRESULT WINAPI get_toElement(IHTMLElement **p) = 0;
    virtual HRESULT WINAPI put_keyCode(long v) = 0;
    virtual HRESULT WINAPI get_keyCode(long *p) = 0;
    virtual HRESULT WINAPI get_button(long *p) = 0;
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI get_qualifier(BSTR *p) = 0;
    virtual HRESULT WINAPI get_reason(long *p) = 0;
    virtual HRESULT WINAPI get_x(long *p) = 0;
    virtual HRESULT WINAPI get_y(long *p) = 0;
    virtual HRESULT WINAPI get_clientX(long *p) = 0;
    virtual HRESULT WINAPI get_clientY(long *p) = 0;
    virtual HRESULT WINAPI get_offsetX(long *p) = 0;
    virtual HRESULT WINAPI get_offsetY(long *p) = 0;
    virtual HRESULT WINAPI get_screenX(long *p) = 0;
    virtual HRESULT WINAPI get_screenY(long *p) = 0;
    virtual HRESULT WINAPI get_srcFilter(IDispatch **p) = 0;
  };
#else
  typedef struct IHTMLEventObjVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLEventObj *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLEventObj *This);
      ULONG (WINAPI *Release)(IHTMLEventObj *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLEventObj *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLEventObj *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLEventObj *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLEventObj *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_srcElement)(IHTMLEventObj *This,IHTMLElement **p);
      HRESULT (WINAPI *get_altKey)(IHTMLEventObj *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_ctrlKey)(IHTMLEventObj *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_shiftKey)(IHTMLEventObj *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_returnValue)(IHTMLEventObj *This,VARIANT v);
      HRESULT (WINAPI *get_returnValue)(IHTMLEventObj *This,VARIANT *p);
      HRESULT (WINAPI *put_cancelBubble)(IHTMLEventObj *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_cancelBubble)(IHTMLEventObj *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_fromElement)(IHTMLEventObj *This,IHTMLElement **p);
      HRESULT (WINAPI *get_toElement)(IHTMLEventObj *This,IHTMLElement **p);
      HRESULT (WINAPI *put_keyCode)(IHTMLEventObj *This,long v);
      HRESULT (WINAPI *get_keyCode)(IHTMLEventObj *This,long *p);
      HRESULT (WINAPI *get_button)(IHTMLEventObj *This,long *p);
      HRESULT (WINAPI *get_type)(IHTMLEventObj *This,BSTR *p);
      HRESULT (WINAPI *get_qualifier)(IHTMLEventObj *This,BSTR *p);
      HRESULT (WINAPI *get_reason)(IHTMLEventObj *This,long *p);
      HRESULT (WINAPI *get_x)(IHTMLEventObj *This,long *p);
      HRESULT (WINAPI *get_y)(IHTMLEventObj *This,long *p);
      HRESULT (WINAPI *get_clientX)(IHTMLEventObj *This,long *p);
      HRESULT (WINAPI *get_clientY)(IHTMLEventObj *This,long *p);
      HRESULT (WINAPI *get_offsetX)(IHTMLEventObj *This,long *p);
      HRESULT (WINAPI *get_offsetY)(IHTMLEventObj *This,long *p);
      HRESULT (WINAPI *get_screenX)(IHTMLEventObj *This,long *p);
      HRESULT (WINAPI *get_screenY)(IHTMLEventObj *This,long *p);
      HRESULT (WINAPI *get_srcFilter)(IHTMLEventObj *This,IDispatch **p);
    END_INTERFACE
  } IHTMLEventObjVtbl;
  interface IHTMLEventObj {
    CONST_VTBL struct IHTMLEventObjVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLEventObj_get_srcElement_Proxy(IHTMLEventObj *This,IHTMLElement **p);
  void __RPC_STUB IHTMLEventObj_get_srcElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_altKey_Proxy(IHTMLEventObj *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLEventObj_get_altKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_ctrlKey_Proxy(IHTMLEventObj *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLEventObj_get_ctrlKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_shiftKey_Proxy(IHTMLEventObj *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLEventObj_get_shiftKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_put_returnValue_Proxy(IHTMLEventObj *This,VARIANT v);
  void __RPC_STUB IHTMLEventObj_put_returnValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_returnValue_Proxy(IHTMLEventObj *This,VARIANT *p);
  void __RPC_STUB IHTMLEventObj_get_returnValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_put_cancelBubble_Proxy(IHTMLEventObj *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLEventObj_put_cancelBubble_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_cancelBubble_Proxy(IHTMLEventObj *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLEventObj_get_cancelBubble_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_fromElement_Proxy(IHTMLEventObj *This,IHTMLElement **p);
  void __RPC_STUB IHTMLEventObj_get_fromElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_toElement_Proxy(IHTMLEventObj *This,IHTMLElement **p);
  void __RPC_STUB IHTMLEventObj_get_toElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_put_keyCode_Proxy(IHTMLEventObj *This,long v);
  void __RPC_STUB IHTMLEventObj_put_keyCode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_keyCode_Proxy(IHTMLEventObj *This,long *p);
  void __RPC_STUB IHTMLEventObj_get_keyCode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_button_Proxy(IHTMLEventObj *This,long *p);
  void __RPC_STUB IHTMLEventObj_get_button_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_type_Proxy(IHTMLEventObj *This,BSTR *p);
  void __RPC_STUB IHTMLEventObj_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_qualifier_Proxy(IHTMLEventObj *This,BSTR *p);
  void __RPC_STUB IHTMLEventObj_get_qualifier_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_reason_Proxy(IHTMLEventObj *This,long *p);
  void __RPC_STUB IHTMLEventObj_get_reason_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_x_Proxy(IHTMLEventObj *This,long *p);
  void __RPC_STUB IHTMLEventObj_get_x_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_y_Proxy(IHTMLEventObj *This,long *p);
  void __RPC_STUB IHTMLEventObj_get_y_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_clientX_Proxy(IHTMLEventObj *This,long *p);
  void __RPC_STUB IHTMLEventObj_get_clientX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_clientY_Proxy(IHTMLEventObj *This,long *p);
  void __RPC_STUB IHTMLEventObj_get_clientY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_offsetX_Proxy(IHTMLEventObj *This,long *p);
  void __RPC_STUB IHTMLEventObj_get_offsetX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_offsetY_Proxy(IHTMLEventObj *This,long *p);
  void __RPC_STUB IHTMLEventObj_get_offsetY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_screenX_Proxy(IHTMLEventObj *This,long *p);
  void __RPC_STUB IHTMLEventObj_get_screenX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_screenY_Proxy(IHTMLEventObj *This,long *p);
  void __RPC_STUB IHTMLEventObj_get_screenY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj_get_srcFilter_Proxy(IHTMLEventObj *This,IDispatch **p);
  void __RPC_STUB IHTMLEventObj_get_srcFilter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehaviorSite_INTERFACE_DEFINED__
#define __IElementBehaviorSite_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IElementBehaviorSite;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IElementBehaviorSite : public IUnknown {
  public:
    virtual HRESULT WINAPI GetElement(IHTMLElement **ppElement) = 0;
    virtual HRESULT WINAPI RegisterNotification(LONG lEvent) = 0;
  };
#else
  typedef struct IElementBehaviorSiteVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IElementBehaviorSite *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IElementBehaviorSite *This);
      ULONG (WINAPI *Release)(IElementBehaviorSite *This);
      HRESULT (WINAPI *GetElement)(IElementBehaviorSite *This,IHTMLElement **ppElement);
      HRESULT (WINAPI *RegisterNotification)(IElementBehaviorSite *This,LONG lEvent);
    END_INTERFACE
  } IElementBehaviorSiteVtbl;
  interface IElementBehaviorSite {
    CONST_VTBL struct IElementBehaviorSiteVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#define IElementBehaviorSite_GetElement(This,ppElement) (This)->lpVtbl->GetElement(This,ppElement)
#define IElementBehaviorSite_RegisterNotification(This,lEvent) (This)->lpVtbl->RegisterNotification(This,lEvent)
#endif
#endif
  HRESULT WINAPI IElementBehaviorSite_GetElement_Proxy(IElementBehaviorSite *This,IHTMLElement **ppElement);
  void __RPC_STUB IElementBehaviorSite_GetElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IElementBehaviorSite_RegisterNotification_Proxy(IElementBehaviorSite *This,LONG lEvent);
  void __RPC_STUB IElementBehaviorSite_RegisterNotification_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehavior_INTERFACE_DEFINED__
#define __IElementBehavior_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IElementBehavior;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IElementBehavior : public IUnknown {
  public:
    virtual HRESULT WINAPI Init(IElementBehaviorSite *pBehaviorSite) = 0;
    virtual HRESULT WINAPI Notify(LONG lEvent,VARIANT *pVar) = 0;
    virtual HRESULT WINAPI Detach(void) = 0;
  };
#else
  typedef struct IElementBehaviorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IElementBehavior *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IElementBehavior *This);
      ULONG (WINAPI *Release)(IElementBehavior *This);
      HRESULT (WINAPI *Init)(IElementBehavior *This,IElementBehaviorSite *pBehaviorSite);
      HRESULT (WINAPI *Notify)(IElementBehavior *This,LONG lEvent,VARIANT *pVar);
      HRESULT (WINAPI *Detach)(IElementBehavior *This);
    END_INTERFACE
  } IElementBehaviorVtbl;
  interface IElementBehavior {
    CONST_VTBL struct IElementBehaviorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
  HRESULT WINAPI IElementBehavior_Init_Proxy(IElementBehavior *This,IElementBehaviorSite *pBehaviorSite);
  void __RPC_STUB IElementBehavior_Init_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IElementBehavior_Notify_Proxy(IElementBehavior *This,LONG lEvent,VARIANT *pVar);
  void __RPC_STUB IElementBehavior_Notify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IElementBehavior_Detach_Proxy(IElementBehavior *This);
  void __RPC_STUB IElementBehavior_Detach_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehaviorFactory_INTERFACE_DEFINED__
#define __IElementBehaviorFactory_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IElementBehaviorFactory;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IElementBehaviorFactory : public IUnknown {
  public:
    virtual HRESULT WINAPI FindBehavior(BSTR bstrBehavior,BSTR bstrBehaviorUrl,IElementBehaviorSite *pSite,IElementBehavior **ppBehavior) = 0;
  };
#else
  typedef struct IElementBehaviorFactoryVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IElementBehaviorFactory *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IElementBehaviorFactory *This);
      ULONG (WINAPI *Release)(IElementBehaviorFactory *This);
      HRESULT (WINAPI *FindBehavior)(IElementBehaviorFactory *This,BSTR bstrBehavior,BSTR bstrBehaviorUrl,IElementBehaviorSite *pSite,IElementBehavior **ppBehavior);
    END_INTERFACE
  } IElementBehaviorFactoryVtbl;
  interface IElementBehaviorFactory {
    CONST_VTBL struct IElementBehaviorFactoryVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#define IElementBehaviorFactory_FindBehavior(This,bstrBehavior,bstrBehaviorUrl,pSite,ppBehavior) (This)->lpVtbl->FindBehavior(This,bstrBehavior,bstrBehaviorUrl,pSite,ppBehavior)
#endif
#endif
  HRESULT WINAPI IElementBehaviorFactory_FindBehavior_Proxy(IElementBehaviorFactory *This,BSTR bstrBehavior,BSTR bstrBehaviorUrl,IElementBehaviorSite *pSite,IElementBehavior **ppBehavior);
  void __RPC_STUB IElementBehaviorFactory_FindBehavior_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehaviorSiteOM_INTERFACE_DEFINED__
#define __IElementBehaviorSiteOM_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IElementBehaviorSiteOM;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IElementBehaviorSiteOM : public IUnknown {
  public:
    virtual HRESULT WINAPI RegisterEvent(LPOLESTR pchEvent,LONG lFlags,LONG *plCookie) = 0;
    virtual HRESULT WINAPI GetEventCookie(LPOLESTR pchEvent,LONG *plCookie) = 0;
    virtual HRESULT WINAPI FireEvent(LONG lCookie,IHTMLEventObj *pEventObject) = 0;
    virtual HRESULT WINAPI CreateEventObject(IHTMLEventObj **ppEventObject) = 0;
    virtual HRESULT WINAPI RegisterName(LPOLESTR pchName) = 0;
    virtual HRESULT WINAPI RegisterUrn(LPOLESTR pchUrn) = 0;
  };
#else
  typedef struct IElementBehaviorSiteOMVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IElementBehaviorSiteOM *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IElementBehaviorSiteOM *This);
      ULONG (WINAPI *Release)(IElementBehaviorSiteOM *This);
      HRESULT (WINAPI *RegisterEvent)(IElementBehaviorSiteOM *This,LPOLESTR pchEvent,LONG lFlags,LONG *plCookie);
      HRESULT (WINAPI *GetEventCookie)(IElementBehaviorSiteOM *This,LPOLESTR pchEvent,LONG *plCookie);
      HRESULT (WINAPI *FireEvent)(IElementBehaviorSiteOM *This,LONG lCookie,IHTMLEventObj *pEventObject);
      HRESULT (WINAPI *CreateEventObject)(IElementBehaviorSiteOM *This,IHTMLEventObj **ppEventObject);
      HRESULT (WINAPI *RegisterName)(IElementBehaviorSiteOM *This,LPOLESTR pchName);
      HRESULT (WINAPI *RegisterUrn)(IElementBehaviorSiteOM *This,LPOLESTR pchUrn);
    END_INTERFACE
  } IElementBehaviorSiteOMVtbl;
  interface IElementBehaviorSiteOM {
    CONST_VTBL struct IElementBehaviorSiteOMVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
  HRESULT WINAPI IElementBehaviorSiteOM_RegisterEvent_Proxy(IElementBehaviorSiteOM *This,LPOLESTR pchEvent,LONG lFlags,LONG *plCookie);
  void __RPC_STUB IElementBehaviorSiteOM_RegisterEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IElementBehaviorSiteOM_GetEventCookie_Proxy(IElementBehaviorSiteOM *This,LPOLESTR pchEvent,LONG *plCookie);
  void __RPC_STUB IElementBehaviorSiteOM_GetEventCookie_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IElementBehaviorSiteOM_FireEvent_Proxy(IElementBehaviorSiteOM *This,LONG lCookie,IHTMLEventObj *pEventObject);
  void __RPC_STUB IElementBehaviorSiteOM_FireEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IElementBehaviorSiteOM_CreateEventObject_Proxy(IElementBehaviorSiteOM *This,IHTMLEventObj **ppEventObject);
  void __RPC_STUB IElementBehaviorSiteOM_CreateEventObject_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IElementBehaviorSiteOM_RegisterName_Proxy(IElementBehaviorSiteOM *This,LPOLESTR pchName);
  void __RPC_STUB IElementBehaviorSiteOM_RegisterName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IElementBehaviorSiteOM_RegisterUrn_Proxy(IElementBehaviorSiteOM *This,LPOLESTR pchUrn);
  void __RPC_STUB IElementBehaviorSiteOM_RegisterUrn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehaviorRender_INTERFACE_DEFINED__
#define __IElementBehaviorRender_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IElementBehaviorRender;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IElementBehaviorRender : public IUnknown {
  public:
    virtual HRESULT WINAPI Draw(HDC hdc,LONG lLayer,RECT *pRect,IUnknown *pReserved) = 0;
    virtual HRESULT WINAPI GetRenderInfo(LONG *plRenderInfo) = 0;
    virtual HRESULT WINAPI HitTestPoint(POINT *pPoint,IUnknown *pReserved,WINBOOL *pbHit) = 0;
  };
#else
  typedef struct IElementBehaviorRenderVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IElementBehaviorRender *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IElementBehaviorRender *This);
      ULONG (WINAPI *Release)(IElementBehaviorRender *This);
      HRESULT (WINAPI *Draw)(IElementBehaviorRender *This,HDC hdc,LONG lLayer,RECT *pRect,IUnknown *pReserved);
      HRESULT (WINAPI *GetRenderInfo)(IElementBehaviorRender *This,LONG *plRenderInfo);
      HRESULT (WINAPI *HitTestPoint)(IElementBehaviorRender *This,POINT *pPoint,IUnknown *pReserved,WINBOOL *pbHit);
    END_INTERFACE
  } IElementBehaviorRenderVtbl;
  interface IElementBehaviorRender {
    CONST_VTBL struct IElementBehaviorRenderVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
  HRESULT WINAPI IElementBehaviorRender_Draw_Proxy(IElementBehaviorRender *This,HDC hdc,LONG lLayer,RECT *pRect,IUnknown *pReserved);
  void __RPC_STUB IElementBehaviorRender_Draw_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IElementBehaviorRender_GetRenderInfo_Proxy(IElementBehaviorRender *This,LONG *plRenderInfo);
  void __RPC_STUB IElementBehaviorRender_GetRenderInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IElementBehaviorRender_HitTestPoint_Proxy(IElementBehaviorRender *This,POINT *pPoint,IUnknown *pReserved,WINBOOL *pbHit);
  void __RPC_STUB IElementBehaviorRender_HitTestPoint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehaviorSiteRender_INTERFACE_DEFINED__
#define __IElementBehaviorSiteRender_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IElementBehaviorSiteRender;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IElementBehaviorSiteRender : public IUnknown {
  public:
    virtual HRESULT WINAPI Invalidate(RECT *pRect) = 0;
    virtual HRESULT WINAPI InvalidateRenderInfo(void) = 0;
    virtual HRESULT WINAPI InvalidateStyle(void) = 0;
  };
#else
  typedef struct IElementBehaviorSiteRenderVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IElementBehaviorSiteRender *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IElementBehaviorSiteRender *This);
      ULONG (WINAPI *Release)(IElementBehaviorSiteRender *This);
      HRESULT (WINAPI *Invalidate)(IElementBehaviorSiteRender *This,RECT *pRect);
      HRESULT (WINAPI *InvalidateRenderInfo)(IElementBehaviorSiteRender *This);
      HRESULT (WINAPI *InvalidateStyle)(IElementBehaviorSiteRender *This);
    END_INTERFACE
  } IElementBehaviorSiteRenderVtbl;
  interface IElementBehaviorSiteRender {
    CONST_VTBL struct IElementBehaviorSiteRenderVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
  HRESULT WINAPI IElementBehaviorSiteRender_Invalidate_Proxy(IElementBehaviorSiteRender *This,RECT *pRect);
  void __RPC_STUB IElementBehaviorSiteRender_Invalidate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IElementBehaviorSiteRender_InvalidateRenderInfo_Proxy(IElementBehaviorSiteRender *This);
  void __RPC_STUB IElementBehaviorSiteRender_InvalidateRenderInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IElementBehaviorSiteRender_InvalidateStyle_Proxy(IElementBehaviorSiteRender *This);
  void __RPC_STUB IElementBehaviorSiteRender_InvalidateStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLStyle_INTERFACE_DEFINED__
#define __IHTMLStyle_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLStyle;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct
IHTMLStyle : public IDispatch {
  public:
    virtual HRESULT WINAPI put_fontFamily(BSTR v) = 0;
    virtual HRESULT WINAPI get_fontFamily(BSTR *p) = 0;
    virtual HRESULT WINAPI put_fontStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_fontStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_fontVariant(BSTR v) = 0;
    virtual HRESULT WINAPI get_fontVariant(BSTR *p) = 0;
    virtual HRESULT WINAPI put_fontWeight(BSTR v) = 0;
    virtual HRESULT WINAPI get_fontWeight(BSTR *p) = 0;
    virtual HRESULT WINAPI put_fontSize(VARIANT v) = 0;
    virtual HRESULT WINAPI get_fontSize(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_font(BSTR v) = 0;
    virtual HRESULT WINAPI get_font(BSTR *p) = 0;
    virtual HRESULT WINAPI put_color(VARIANT v) = 0;
    virtual HRESULT WINAPI get_color(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_background(BSTR v) = 0;
    virtual HRESULT WINAPI get_background(BSTR *p) = 0;
    virtual HRESULT WINAPI put_backgroundColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_backgroundColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_backgroundImage(BSTR v) = 0;
    virtual HRESULT WINAPI get_backgroundImage(BSTR *p) = 0;
    virtual HRESULT WINAPI put_backgroundRepeat(BSTR v) = 0;
    virtual HRESULT WINAPI get_backgroundRepeat(BSTR *p) = 0;
    virtual HRESULT WINAPI put_backgroundAttachment(BSTR v) = 0;
    virtual HRESULT WINAPI get_backgroundAttachment(BSTR *p) = 0;
    virtual HRESULT WINAPI put_backgroundPosition(BSTR v) = 0;
    virtual HRESULT WINAPI get_backgroundPosition(BSTR *p) = 0;
    virtual HRESULT WINAPI put_backgroundPositionX(VARIANT v) = 0;
    virtual HRESULT WINAPI get_backgroundPositionX(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_backgroundPositionY(VARIANT v) = 0;
    virtual HRESULT WINAPI get_backgroundPositionY(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_wordSpacing(VARIANT v) = 0;
    virtual HRESULT WINAPI get_wordSpacing(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_letterSpacing(VARIANT v) = 0;
    virtual HRESULT WINAPI get_letterSpacing(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_textDecoration(BSTR v) = 0;
    virtual HRESULT WINAPI get_textDecoration(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textDecorationNone(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_textDecorationNone(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_textDecorationUnderline(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_textDecorationUnderline(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_textDecorationOverline(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_textDecorationOverline(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_textDecorationLineThrough(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_textDecorationLineThrough(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_textDecorationBlink(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_textDecorationBlink(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_verticalAlign(VARIANT v) = 0;
    virtual HRESULT WINAPI get_verticalAlign(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_textTransform(BSTR v) = 0;
    virtual HRESULT WINAPI get_textTransform(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textAlign(BSTR v) = 0;
    virtual HRESULT WINAPI get_textAlign(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textIndent(VARIANT v) = 0;
    virtual HRESULT WINAPI get_textIndent(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_lineHeight(VARIANT v) = 0;
    virtual HRESULT WINAPI get_lineHeight(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_marginTop(VARIANT v) = 0;
    virtual HRESULT WINAPI get_marginTop(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_marginRight(VARIANT v) = 0;
    virtual HRESULT WINAPI get_marginRight(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_marginBottom(VARIANT v) = 0;
    virtual HRESULT WINAPI get_marginBottom(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_marginLeft(VARIANT v) = 0;
    virtual HRESULT WINAPI get_marginLeft(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_margin(BSTR v) = 0;
    virtual HRESULT WINAPI get_margin(BSTR *p) = 0;
    virtual HRESULT WINAPI put_paddingTop(VARIANT v) = 0;
    virtual HRESULT WINAPI get_paddingTop(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_paddingRight(VARIANT v) = 0;
    virtual HRESULT WINAPI get_paddingRight(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_paddingBottom(VARIANT v) = 0;
    virtual HRESULT WINAPI get_paddingBottom(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_paddingLeft(VARIANT v) = 0;
    virtual HRESULT WINAPI get_paddingLeft(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_padding(BSTR v) = 0;
    virtual HRESULT WINAPI get_padding(BSTR *p) = 0;
    virtual HRESULT WINAPI put_border(BSTR v) = 0;
    virtual HRESULT WINAPI get_border(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderTop(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderTop(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderRight(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderRight(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderBottom(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderBottom(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderLeft(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderLeft(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderColor(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderColor(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderTopColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderTopColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderRightColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderRightColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderBottomColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderBottomColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderLeftColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderLeftColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderWidth(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderWidth(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderTopWidth(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderTopWidth(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderRightWidth(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderRightWidth(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderBottomWidth(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderBottomWidth(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderLeftWidth(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderLeftWidth(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderTopStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderTopStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderRightStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderRightStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderBottomStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderBottomStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderLeftStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderLeftStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_width(VARIANT v) = 0;
    virtual HRESULT WINAPI get_width(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_height(VARIANT v) = 0;
    virtual HRESULT WINAPI get_height(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_styleFloat(BSTR v) = 0;
    virtual HRESULT WINAPI get_styleFloat(BSTR *p) = 0;
    virtual HRESULT WINAPI put_clear(BSTR v) = 0;
    virtual HRESULT WINAPI get_clear(BSTR *p) = 0;
    virtual HRESULT WINAPI put_display(BSTR v) = 0;
    virtual HRESULT WINAPI get_display(BSTR *p) = 0;
    virtual HRESULT WINAPI put_visibility(BSTR v) = 0;
    virtual HRESULT WINAPI get_visibility(BSTR *p) = 0;
    virtual HRESULT WINAPI put_listStyleType(BSTR v) = 0;
    virtual HRESULT WINAPI get_listStyleType(BSTR *p) = 0;
    virtual HRESULT WINAPI put_listStylePosition(BSTR v) = 0;
    virtual HRESULT WINAPI get_listStylePosition(BSTR *p) = 0;
    virtual HRESULT WINAPI put_listStyleImage(BSTR v) = 0;
    virtual HRESULT WINAPI get_listStyleImage(BSTR *p) = 0;
    virtual HRESULT WINAPI put_listStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_listStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_whiteSpace(BSTR v) = 0;
    virtual HRESULT WINAPI get_whiteSpace(BSTR *p) = 0;
    virtual HRESULT WINAPI put_top(VARIANT v) = 0;
    virtual HRESULT WINAPI get_top(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_left(VARIANT v) = 0;
    virtual HRESULT WINAPI get_left(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_position(BSTR *p) = 0;
    virtual HRESULT WINAPI put_zIndex(VARIANT v) = 0;
    virtual HRESULT WINAPI get_zIndex(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_overflow(BSTR v) = 0;
    virtual HRESULT WINAPI get_overflow(BSTR *p) = 0;
    virtual HRESULT WINAPI put_pageBreakBefore(BSTR v) = 0;
    virtual HRESULT WINAPI get_pageBreakBefore(BSTR *p) = 0;
    virtual HRESULT WINAPI put_pageBreakAfter(BSTR v) = 0;
    virtual HRESULT WINAPI get_pageBreakAfter(BSTR *p) = 0;
    virtual HRESULT WINAPI put_cssText(BSTR v) = 0;
    virtual HRESULT WINAPI get_cssText(BSTR *p) = 0;
    virtual HRESULT WINAPI put_pixelTop(long v) = 0;
    virtual HRESULT WINAPI get_pixelTop(long *p) = 0;
    virtual HRESULT WINAPI put_pixelLeft(long v) = 0;
    virtual HRESULT WINAPI get_pixelLeft(long *p) = 0;
    virtual HRESULT WINAPI put_pixelWidth(long v) = 0;
    virtual HRESULT WINAPI get_pixelWidth(long *p) = 0;
    virtual HRESULT WINAPI put_pixelHeight(long v) = 0;
    virtual HRESULT WINAPI get_pixelHeight(long *p) = 0;
    virtual HRESULT WINAPI put_posTop(float v) = 0;
    virtual HRESULT WINAPI get_posTop(float *p) = 0;
    virtual HRESULT WINAPI put_posLeft(float v) = 0;
    virtual HRESULT WINAPI get_posLeft(float *p) = 0;
    virtual HRESULT WINAPI put_posWidth(float v) = 0;
    virtual HRESULT WINAPI get_posWidth(float *p) = 0;
    virtual HRESULT WINAPI put_posHeight(float v) = 0;
    virtual HRESULT WINAPI get_posHeight(float *p) = 0;
    virtual HRESULT WINAPI put_cursor(BSTR v) = 0;
    virtual HRESULT WINAPI get_cursor(BSTR *p) = 0;
    virtual HRESULT WINAPI put_clip(BSTR v) = 0;
    virtual HRESULT WINAPI get_clip(BSTR *p) = 0;
    virtual HRESULT WINAPI put_filter(BSTR v) = 0;
    virtual HRESULT WINAPI get_filter(BSTR *p) = 0;
    virtual HRESULT WINAPI setAttribute(BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags = 1) = 0;
    virtual HRESULT WINAPI getAttribute(BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) = 0;
    virtual HRESULT WINAPI removeAttribute(BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess) = 0;
    virtual HRESULT WINAPI toString(BSTR *String) = 0;
  };
#else
  typedef struct IHTMLStyleVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLStyle *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLStyle *This);
      ULONG (WINAPI *Release)(IHTMLStyle *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLStyle *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLStyle *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLStyle *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLStyle *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_fontFamily)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_fontFamily)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_fontStyle)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_fontStyle)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_fontVariant)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_fontVariant)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_fontWeight)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_fontWeight)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_fontSize)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_fontSize)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_font)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_font)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_color)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_color)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_background)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_background)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_backgroundColor)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_backgroundColor)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_backgroundImage)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_backgroundImage)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_backgroundRepeat)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_backgroundRepeat)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_backgroundAttachment)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_backgroundAttachment)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_backgroundPosition)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_backgroundPosition)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_backgroundPositionX)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_backgroundPositionX)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_backgroundPositionY)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_backgroundPositionY)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_wordSpacing)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_wordSpacing)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_letterSpacing)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_letterSpacing)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_textDecoration)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_textDecoration)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_textDecorationNone)(IHTMLStyle *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_textDecorationNone)(IHTMLStyle *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_textDecorationUnderline)(IHTMLStyle *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_textDecorationUnderline)(IHTMLStyle *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_textDecorationOverline)(IHTMLStyle *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_textDecorationOverline)(IHTMLStyle *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_textDecorationLineThrough)(IHTMLStyle *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_textDecorationLineThrough)(IHTMLStyle *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_textDecorationBlink)(IHTMLStyle *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_textDecorationBlink)(IHTMLStyle *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_verticalAlign)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_verticalAlign)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_textTransform)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_textTransform)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_textAlign)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_textAlign)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_textIndent)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_textIndent)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_lineHeight)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_lineHeight)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_marginTop)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_marginTop)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_marginRight)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_marginRight)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_marginBottom)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_marginBottom)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_marginLeft)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_marginLeft)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_margin)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_margin)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_paddingTop)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_paddingTop)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_paddingRight)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_paddingRight)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_paddingBottom)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_paddingBottom)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_paddingLeft)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_paddingLeft)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_padding)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_padding)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_border)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_border)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderTop)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderTop)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderRight)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderRight)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderBottom)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderBottom)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderLeft)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderLeft)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderColor)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderColor)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderTopColor)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderTopColor)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderRightColor)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderRightColor)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderBottomColor)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderBottomColor)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderLeftColor)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderLeftColor)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderWidth)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderWidth)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderTopWidth)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderTopWidth)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderRightWidth)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderRightWidth)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderBottomWidth)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderBottomWidth)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderLeftWidth)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderLeftWidth)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderStyle)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderStyle)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderTopStyle)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderTopStyle)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderRightStyle)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderRightStyle)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderBottomStyle)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderBottomStyle)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderLeftStyle)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderLeftStyle)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_width)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_width)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_height)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_height)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_styleFloat)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_styleFloat)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_clear)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_clear)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_display)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_display)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_visibility)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_visibility)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_listStyleType)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_listStyleType)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_listStylePosition)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_listStylePosition)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_listStyleImage)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_listStyleImage)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_listStyle)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_listStyle)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_whiteSpace)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_whiteSpace)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_top)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_top)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_left)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_left)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_position)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_zIndex)(IHTMLStyle *This,VARIANT v);
      HRESULT (WINAPI *get_zIndex)(IHTMLStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_overflow)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_overflow)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_pageBreakBefore)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_pageBreakBefore)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_pageBreakAfter)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_pageBreakAfter)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_cssText)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_cssText)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_pixelTop)(IHTMLStyle *This,long v);
      HRESULT (WINAPI *get_pixelTop)(IHTMLStyle *This,long *p);
      HRESULT (WINAPI *put_pixelLeft)(IHTMLStyle *This,long v);
      HRESULT (WINAPI *get_pixelLeft)(IHTMLStyle *This,long *p);
      HRESULT (WINAPI *put_pixelWidth)(IHTMLStyle *This,long v);
      HRESULT (WINAPI *get_pixelWidth)(IHTMLStyle *This,long *p);
      HRESULT (WINAPI *put_pixelHeight)(IHTMLStyle *This,long v);
      HRESULT (WINAPI *get_pixelHeight)(IHTMLStyle *This,long *p);
      HRESULT (WINAPI *put_posTop)(IHTMLStyle *This,float v);
      HRESULT (WINAPI *get_posTop)(IHTMLStyle *This,float *p);
      HRESULT (WINAPI *put_posLeft)(IHTMLStyle *This,float v);
      HRESULT (WINAPI *get_posLeft)(IHTMLStyle *This,float *p);
      HRESULT (WINAPI *put_posWidth)(IHTMLStyle *This,float v);
      HRESULT (WINAPI *get_posWidth)(IHTMLStyle *This,float *p);
      HRESULT (WINAPI *put_posHeight)(IHTMLStyle *This,float v);
      HRESULT (WINAPI *get_posHeight)(IHTMLStyle *This,float *p);
      HRESULT (WINAPI *put_cursor)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_cursor)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_clip)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_clip)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *put_filter)(IHTMLStyle *This,BSTR v);
      HRESULT (WINAPI *get_filter)(IHTMLStyle *This,BSTR *p);
      HRESULT (WINAPI *setAttribute)(IHTMLStyle *This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags);
      HRESULT (WINAPI *getAttribute)(IHTMLStyle *This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue);
      HRESULT (WINAPI *removeAttribute)(IHTMLStyle *This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess);
      HRESULT (WINAPI *toString)(IHTMLStyle *This,BSTR *String);
    END_INTERFACE
  } IHTMLStyleVtbl;
  interface IHTMLStyle {
    CONST_VTBL struct IHTMLStyleVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLStyle_put_fontFamily_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_fontFamily_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_fontFamily_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_fontFamily_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_fontStyle_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_fontStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_fontStyle_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_fontStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_fontVariant_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_fontVariant_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_fontVariant_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_fontVariant_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_fontWeight_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_fontWeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_fontWeight_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_fontWeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_fontSize_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_fontSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_fontSize_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_fontSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_font_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_font_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_font_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_font_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_color_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_color_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_color_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_color_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_background_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_background_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_background_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_background_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_backgroundColor_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_backgroundColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_backgroundColor_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_backgroundColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_backgroundImage_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_backgroundImage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_backgroundImage_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_backgroundImage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_backgroundRepeat_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_backgroundRepeat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_backgroundRepeat_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_backgroundRepeat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_backgroundAttachment_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_backgroundAttachment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_backgroundAttachment_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_backgroundAttachment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_backgroundPosition_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_backgroundPosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_backgroundPosition_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_backgroundPosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_backgroundPositionX_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_backgroundPositionX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_backgroundPositionX_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_backgroundPositionX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_backgroundPositionY_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_backgroundPositionY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_backgroundPositionY_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_backgroundPositionY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_wordSpacing_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_wordSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_wordSpacing_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_wordSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_letterSpacing_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_letterSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_letterSpacing_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_letterSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_textDecoration_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_textDecoration_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_textDecoration_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_textDecoration_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_textDecorationNone_Proxy(IHTMLStyle *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLStyle_put_textDecorationNone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_textDecorationNone_Proxy(IHTMLStyle *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLStyle_get_textDecorationNone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_textDecorationUnderline_Proxy(IHTMLStyle *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLStyle_put_textDecorationUnderline_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_textDecorationUnderline_Proxy(IHTMLStyle *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLStyle_get_textDecorationUnderline_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_textDecorationOverline_Proxy(IHTMLStyle *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLStyle_put_textDecorationOverline_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_textDecorationOverline_Proxy(IHTMLStyle *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLStyle_get_textDecorationOverline_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_textDecorationLineThrough_Proxy(IHTMLStyle *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLStyle_put_textDecorationLineThrough_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_textDecorationLineThrough_Proxy(IHTMLStyle *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLStyle_get_textDecorationLineThrough_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_textDecorationBlink_Proxy(IHTMLStyle *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLStyle_put_textDecorationBlink_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_textDecorationBlink_Proxy(IHTMLStyle *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLStyle_get_textDecorationBlink_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_verticalAlign_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_verticalAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_verticalAlign_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_verticalAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_textTransform_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_textTransform_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_textTransform_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_textTransform_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_textAlign_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_textAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_textAlign_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_textAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_textIndent_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_textIndent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_textIndent_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_textIndent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_lineHeight_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_lineHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_lineHeight_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_lineHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_marginTop_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_marginTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_marginTop_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_marginTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_marginRight_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_marginRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_marginRight_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_marginRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_marginBottom_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_marginBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_marginBottom_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_marginBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_marginLeft_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_marginLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_marginLeft_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_marginLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_margin_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_margin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_margin_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_margin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_paddingTop_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_paddingTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_paddingTop_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_paddingTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_paddingRight_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_paddingRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_paddingRight_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_paddingRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_paddingBottom_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_paddingBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_paddingBottom_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_paddingBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_paddingLeft_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_paddingLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_paddingLeft_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_paddingLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_padding_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_padding_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_padding_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_padding_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_border_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_border_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderTop_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_borderTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderTop_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_borderTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderRight_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_borderRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderRight_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_borderRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderBottom_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_borderBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderBottom_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_borderBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderLeft_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_borderLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderLeft_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_borderLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderColor_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderColor_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderTopColor_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_borderTopColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderTopColor_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_borderTopColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderRightColor_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_borderRightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderRightColor_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_borderRightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderBottomColor_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_borderBottomColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderBottomColor_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_borderBottomColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderLeftColor_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_borderLeftColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderLeftColor_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_borderLeftColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderWidth_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_borderWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderWidth_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_borderWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderTopWidth_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_borderTopWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderTopWidth_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_borderTopWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderRightWidth_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_borderRightWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderRightWidth_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_borderRightWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderBottomWidth_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_borderBottomWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderBottomWidth_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_borderBottomWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderLeftWidth_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_borderLeftWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderLeftWidth_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_borderLeftWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderStyle_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_borderStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderStyle_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_borderStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderTopStyle_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_borderTopStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderTopStyle_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_borderTopStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderRightStyle_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_borderRightStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderRightStyle_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_borderRightStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderBottomStyle_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_borderBottomStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderBottomStyle_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_borderBottomStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_borderLeftStyle_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_borderLeftStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_borderLeftStyle_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_borderLeftStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_width_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_width_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_height_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_height_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_styleFloat_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_styleFloat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_styleFloat_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_styleFloat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_clear_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_clear_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_clear_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_clear_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_display_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_display_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_display_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_display_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_visibility_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_visibility_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_visibility_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_visibility_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_listStyleType_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_listStyleType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_listStyleType_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_listStyleType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_listStylePosition_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_listStylePosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_listStylePosition_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_listStylePosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_listStyleImage_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_listStyleImage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_listStyleImage_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_listStyleImage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_listStyle_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_listStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_listStyle_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_listStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_whiteSpace_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_whiteSpace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_whiteSpace_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_whiteSpace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_top_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_top_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_top_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_top_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_left_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_left_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_left_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_left_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_position_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_position_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_zIndex_Proxy(IHTMLStyle *This,VARIANT v);
  void __RPC_STUB IHTMLStyle_put_zIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_zIndex_Proxy(IHTMLStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle_get_zIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_overflow_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_overflow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_overflow_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_overflow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_pageBreakBefore_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_pageBreakBefore_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_pageBreakBefore_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_pageBreakBefore_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_pageBreakAfter_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_pageBreakAfter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_pageBreakAfter_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_pageBreakAfter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_cssText_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_cssText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_cssText_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_cssText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_pixelTop_Proxy(IHTMLStyle *This,long v);
  void __RPC_STUB IHTMLStyle_put_pixelTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_pixelTop_Proxy(IHTMLStyle *This,long *p);
  void __RPC_STUB IHTMLStyle_get_pixelTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_pixelLeft_Proxy(IHTMLStyle *This,long v);
  void __RPC_STUB IHTMLStyle_put_pixelLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_pixelLeft_Proxy(IHTMLStyle *This,long *p);
  void __RPC_STUB IHTMLStyle_get_pixelLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_pixelWidth_Proxy(IHTMLStyle *This,long v);
  void __RPC_STUB IHTMLStyle_put_pixelWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_pixelWidth_Proxy(IHTMLStyle *This,long *p);
  void __RPC_STUB IHTMLStyle_get_pixelWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_pixelHeight_Proxy(IHTMLStyle *This,long v);
  void __RPC_STUB IHTMLStyle_put_pixelHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_pixelHeight_Proxy(IHTMLStyle *This,long *p);
  void __RPC_STUB IHTMLStyle_get_pixelHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_posTop_Proxy(IHTMLStyle *This,float v);
  void __RPC_STUB IHTMLStyle_put_posTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_posTop_Proxy(IHTMLStyle *This,float *p);
  void __RPC_STUB IHTMLStyle_get_posTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_posLeft_Proxy(IHTMLStyle *This,float v);
  void __RPC_STUB IHTMLStyle_put_posLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_posLeft_Proxy(IHTMLStyle *This,float *p);
  void __RPC_STUB IHTMLStyle_get_posLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_posWidth_Proxy(IHTMLStyle *This,float v);
  void __RPC_STUB IHTMLStyle_put_posWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_posWidth_Proxy(IHTMLStyle *This,float *p);
  void __RPC_STUB IHTMLStyle_get_posWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_posHeight_Proxy(IHTMLStyle *This,float v);
  void __RPC_STUB IHTMLStyle_put_posHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_posHeight_Proxy(IHTMLStyle *This,float *p);
  void __RPC_STUB IHTMLStyle_get_posHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_cursor_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_cursor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_cursor_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_cursor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_clip_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_clip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_clip_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_clip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_put_filter_Proxy(IHTMLStyle *This,BSTR v);
  void __RPC_STUB IHTMLStyle_put_filter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_get_filter_Proxy(IHTMLStyle *This,BSTR *p);
  void __RPC_STUB IHTMLStyle_get_filter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_setAttribute_Proxy(IHTMLStyle *This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags);
  void __RPC_STUB IHTMLStyle_setAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_getAttribute_Proxy(IHTMLStyle *This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue);
  void __RPC_STUB IHTMLStyle_getAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_removeAttribute_Proxy(IHTMLStyle *This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess);
  void __RPC_STUB IHTMLStyle_removeAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle_toString_Proxy(IHTMLStyle *This,BSTR *String);
  void __RPC_STUB IHTMLStyle_toString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLStyle2_INTERFACE_DEFINED__
#define __IHTMLStyle2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLStyle2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLStyle2 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_tableLayout(BSTR v) = 0;
    virtual HRESULT WINAPI get_tableLayout(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderCollapse(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderCollapse(BSTR *p) = 0;
    virtual HRESULT WINAPI put_direction(BSTR v) = 0;
    virtual HRESULT WINAPI get_direction(BSTR *p) = 0;
    virtual HRESULT WINAPI put_behavior(BSTR v) = 0;
    virtual HRESULT WINAPI get_behavior(BSTR *p) = 0;
    virtual HRESULT WINAPI setExpression(BSTR propname,BSTR expression,BSTR language = L"") = 0;
    virtual HRESULT WINAPI getExpression(BSTR propname,VARIANT *expression) = 0;
    virtual HRESULT WINAPI removeExpression(BSTR propname,VARIANT_BOOL *pfSuccess) = 0;
    virtual HRESULT WINAPI put_position(BSTR v) = 0;
    virtual HRESULT WINAPI get_position(BSTR *p) = 0;
    virtual HRESULT WINAPI put_unicodeBidi(BSTR v) = 0;
    virtual HRESULT WINAPI get_unicodeBidi(BSTR *p) = 0;
    virtual HRESULT WINAPI put_bottom(VARIANT v) = 0;
    virtual HRESULT WINAPI get_bottom(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_right(VARIANT v) = 0;
    virtual HRESULT WINAPI get_right(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_pixelBottom(long v) = 0;
    virtual HRESULT WINAPI get_pixelBottom(long *p) = 0;
    virtual HRESULT WINAPI put_pixelRight(long v) = 0;
    virtual HRESULT WINAPI get_pixelRight(long *p) = 0;
    virtual HRESULT WINAPI put_posBottom(float v) = 0;
    virtual HRESULT WINAPI get_posBottom(float *p) = 0;
    virtual HRESULT WINAPI put_posRight(float v) = 0;
    virtual HRESULT WINAPI get_posRight(float *p) = 0;
    virtual HRESULT WINAPI put_imeMode(BSTR v) = 0;
    virtual HRESULT WINAPI get_imeMode(BSTR *p) = 0;
    virtual HRESULT WINAPI put_rubyAlign(BSTR v) = 0;
    virtual HRESULT WINAPI get_rubyAlign(BSTR *p) = 0;
    virtual HRESULT WINAPI put_rubyPosition(BSTR v) = 0;
    virtual HRESULT WINAPI get_rubyPosition(BSTR *p) = 0;
    virtual HRESULT WINAPI put_rubyOverhang(BSTR v) = 0;
    virtual HRESULT WINAPI get_rubyOverhang(BSTR *p) = 0;
    virtual HRESULT WINAPI put_layoutGridChar(VARIANT v) = 0;
    virtual HRESULT WINAPI get_layoutGridChar(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_layoutGridLine(VARIANT v) = 0;
    virtual HRESULT WINAPI get_layoutGridLine(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_layoutGridMode(BSTR v) = 0;
    virtual HRESULT WINAPI get_layoutGridMode(BSTR *p) = 0;
    virtual HRESULT WINAPI put_layoutGridType(BSTR v) = 0;
    virtual HRESULT WINAPI get_layoutGridType(BSTR *p) = 0;
    virtual HRESULT WINAPI put_layoutGrid(BSTR v) = 0;
    virtual HRESULT WINAPI get_layoutGrid(BSTR *p) = 0;
    virtual HRESULT WINAPI put_wordBreak(BSTR v) = 0;
    virtual HRESULT WINAPI get_wordBreak(BSTR *p) = 0;
    virtual HRESULT WINAPI put_lineBreak(BSTR v) = 0;
    virtual HRESULT WINAPI get_lineBreak(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textJustify(BSTR v) = 0;
    virtual HRESULT WINAPI get_textJustify(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textJustifyTrim(BSTR v) = 0;
    virtual HRESULT WINAPI get_textJustifyTrim(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textKashida(VARIANT v) = 0;
    virtual HRESULT WINAPI get_textKashida(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_textAutospace(BSTR v) = 0;
    virtual HRESULT WINAPI get_textAutospace(BSTR *p) = 0;
    virtual HRESULT WINAPI put_overflowX(BSTR v) = 0;
    virtual HRESULT WINAPI get_overflowX(BSTR *p) = 0;
    virtual HRESULT WINAPI put_overflowY(BSTR v) = 0;
    virtual HRESULT WINAPI get_overflowY(BSTR *p) = 0;
    virtual HRESULT WINAPI put_accelerator(BSTR v) = 0;
    virtual HRESULT WINAPI get_accelerator(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLStyle2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLStyle2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLStyle2 *This);
      ULONG (WINAPI *Release)(IHTMLStyle2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLStyle2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLStyle2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLStyle2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLStyle2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_tableLayout)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_tableLayout)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_borderCollapse)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_borderCollapse)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_direction)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_direction)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_behavior)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_behavior)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *setExpression)(IHTMLStyle2 *This,BSTR propname,BSTR expression,BSTR language);
      HRESULT (WINAPI *getExpression)(IHTMLStyle2 *This,BSTR propname,VARIANT *expression);
      HRESULT (WINAPI *removeExpression)(IHTMLStyle2 *This,BSTR propname,VARIANT_BOOL *pfSuccess);
      HRESULT (WINAPI *put_position)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_position)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_unicodeBidi)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_unicodeBidi)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_bottom)(IHTMLStyle2 *This,VARIANT v);
      HRESULT (WINAPI *get_bottom)(IHTMLStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *put_right)(IHTMLStyle2 *This,VARIANT v);
      HRESULT (WINAPI *get_right)(IHTMLStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *put_pixelBottom)(IHTMLStyle2 *This,long v);
      HRESULT (WINAPI *get_pixelBottom)(IHTMLStyle2 *This,long *p);
      HRESULT (WINAPI *put_pixelRight)(IHTMLStyle2 *This,long v);
      HRESULT (WINAPI *get_pixelRight)(IHTMLStyle2 *This,long *p);
      HRESULT (WINAPI *put_posBottom)(IHTMLStyle2 *This,float v);
      HRESULT (WINAPI *get_posBottom)(IHTMLStyle2 *This,float *p);
      HRESULT (WINAPI *put_posRight)(IHTMLStyle2 *This,float v);
      HRESULT (WINAPI *get_posRight)(IHTMLStyle2 *This,float *p);
      HRESULT (WINAPI *put_imeMode)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_imeMode)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_rubyAlign)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_rubyAlign)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_rubyPosition)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_rubyPosition)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_rubyOverhang)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_rubyOverhang)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_layoutGridChar)(IHTMLStyle2 *This,VARIANT v);
      HRESULT (WINAPI *get_layoutGridChar)(IHTMLStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *put_layoutGridLine)(IHTMLStyle2 *This,VARIANT v);
      HRESULT (WINAPI *get_layoutGridLine)(IHTMLStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *put_layoutGridMode)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_layoutGridMode)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_layoutGridType)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_layoutGridType)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_layoutGrid)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_layoutGrid)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_wordBreak)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_wordBreak)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_lineBreak)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_lineBreak)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_textJustify)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_textJustify)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_textJustifyTrim)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_textJustifyTrim)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_textKashida)(IHTMLStyle2 *This,VARIANT v);
      HRESULT (WINAPI *get_textKashida)(IHTMLStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *put_textAutospace)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_textAutospace)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_overflowX)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_overflowX)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_overflowY)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_overflowY)(IHTMLStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_accelerator)(IHTMLStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_accelerator)(IHTMLStyle2 *This,BSTR *p);
    END_INTERFACE
  } IHTMLStyle2Vtbl;
  interface IHTMLStyle2 {
    CONST_VTBL struct IHTMLStyle2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLStyle2_put_tableLayout_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_tableLayout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_tableLayout_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_tableLayout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_borderCollapse_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_borderCollapse_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_borderCollapse_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_borderCollapse_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_direction_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_direction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_direction_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_direction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_behavior_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_behavior_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_behavior_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_behavior_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_setExpression_Proxy(IHTMLStyle2 *This,BSTR propname,BSTR expression,BSTR language);
  void __RPC_STUB IHTMLStyle2_setExpression_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_getExpression_Proxy(IHTMLStyle2 *This,BSTR propname,VARIANT *expression);
  void __RPC_STUB IHTMLStyle2_getExpression_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_removeExpression_Proxy(IHTMLStyle2 *This,BSTR propname,VARIANT_BOOL *pfSuccess);
  void __RPC_STUB IHTMLStyle2_removeExpression_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_position_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_position_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_position_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_position_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_unicodeBidi_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_unicodeBidi_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_unicodeBidi_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_unicodeBidi_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_bottom_Proxy(IHTMLStyle2 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle2_put_bottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_bottom_Proxy(IHTMLStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle2_get_bottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_right_Proxy(IHTMLStyle2 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle2_put_right_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_right_Proxy(IHTMLStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle2_get_right_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_pixelBottom_Proxy(IHTMLStyle2 *This,long v);
  void __RPC_STUB IHTMLStyle2_put_pixelBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_pixelBottom_Proxy(IHTMLStyle2 *This,long *p);
  void __RPC_STUB IHTMLStyle2_get_pixelBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_pixelRight_Proxy(IHTMLStyle2 *This,long v);
  void __RPC_STUB IHTMLStyle2_put_pixelRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_pixelRight_Proxy(IHTMLStyle2 *This,long *p);
  void __RPC_STUB IHTMLStyle2_get_pixelRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_posBottom_Proxy(IHTMLStyle2 *This,float v);
  void __RPC_STUB IHTMLStyle2_put_posBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_posBottom_Proxy(IHTMLStyle2 *This,float *p);
  void __RPC_STUB IHTMLStyle2_get_posBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_posRight_Proxy(IHTMLStyle2 *This,float v);
  void __RPC_STUB IHTMLStyle2_put_posRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_posRight_Proxy(IHTMLStyle2 *This,float *p);
  void __RPC_STUB IHTMLStyle2_get_posRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_imeMode_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_imeMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_imeMode_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_imeMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_rubyAlign_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_rubyAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_rubyAlign_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_rubyAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_rubyPosition_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_rubyPosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_rubyPosition_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_rubyPosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_rubyOverhang_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_rubyOverhang_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_rubyOverhang_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_rubyOverhang_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_layoutGridChar_Proxy(IHTMLStyle2 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle2_put_layoutGridChar_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_layoutGridChar_Proxy(IHTMLStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle2_get_layoutGridChar_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_layoutGridLine_Proxy(IHTMLStyle2 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle2_put_layoutGridLine_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_layoutGridLine_Proxy(IHTMLStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle2_get_layoutGridLine_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_layoutGridMode_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_layoutGridMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_layoutGridMode_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_layoutGridMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_layoutGridType_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_layoutGridType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_layoutGridType_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_layoutGridType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_layoutGrid_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_layoutGrid_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_layoutGrid_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_layoutGrid_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_wordBreak_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_wordBreak_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_wordBreak_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_wordBreak_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_lineBreak_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_lineBreak_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_lineBreak_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_lineBreak_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_textJustify_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_textJustify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_textJustify_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_textJustify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_textJustifyTrim_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_textJustifyTrim_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_textJustifyTrim_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_textJustifyTrim_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_textKashida_Proxy(IHTMLStyle2 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle2_put_textKashida_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_textKashida_Proxy(IHTMLStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle2_get_textKashida_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_textAutospace_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_textAutospace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_textAutospace_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_textAutospace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_overflowX_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_overflowX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_overflowX_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_overflowX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_overflowY_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_overflowY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_overflowY_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_overflowY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_put_accelerator_Proxy(IHTMLStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLStyle2_put_accelerator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle2_get_accelerator_Proxy(IHTMLStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle2_get_accelerator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLStyle3_INTERFACE_DEFINED__
#define __IHTMLStyle3_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLStyle3;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLStyle3 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_layoutFlow(BSTR v) = 0;
    virtual HRESULT WINAPI get_layoutFlow(BSTR *p) = 0;
    virtual HRESULT WINAPI put_zoom(VARIANT v) = 0;
    virtual HRESULT WINAPI get_zoom(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_wordWrap(BSTR v) = 0;
    virtual HRESULT WINAPI get_wordWrap(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textUnderlinePosition(BSTR v) = 0;
    virtual HRESULT WINAPI get_textUnderlinePosition(BSTR *p) = 0;
    virtual HRESULT WINAPI put_scrollbarBaseColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbarBaseColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollbarFaceColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbarFaceColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollbar3dLightColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbar3dLightColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollbarShadowColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbarShadowColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollbarHighlightColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbarHighlightColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollbarDarkShadowColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbarDarkShadowColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollbarArrowColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbarArrowColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollbarTrackColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbarTrackColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_writingMode(BSTR v) = 0;
    virtual HRESULT WINAPI get_writingMode(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textAlignLast(BSTR v) = 0;
    virtual HRESULT WINAPI get_textAlignLast(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textKashidaSpace(VARIANT v) = 0;
    virtual HRESULT WINAPI get_textKashidaSpace(VARIANT *p) = 0;
  };
#else
  typedef struct IHTMLStyle3Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLStyle3 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLStyle3 *This);
      ULONG (WINAPI *Release)(IHTMLStyle3 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLStyle3 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLStyle3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLStyle3 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLStyle3 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_layoutFlow)(IHTMLStyle3 *This,BSTR v);
      HRESULT (WINAPI *get_layoutFlow)(IHTMLStyle3 *This,BSTR *p);
      HRESULT (WINAPI *put_zoom)(IHTMLStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_zoom)(IHTMLStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_wordWrap)(IHTMLStyle3 *This,BSTR v);
      HRESULT (WINAPI *get_wordWrap)(IHTMLStyle3 *This,BSTR *p);
      HRESULT (WINAPI *put_textUnderlinePosition)(IHTMLStyle3 *This,BSTR v);
      HRESULT (WINAPI *get_textUnderlinePosition)(IHTMLStyle3 *This,BSTR *p);
      HRESULT (WINAPI *put_scrollbarBaseColor)(IHTMLStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbarBaseColor)(IHTMLStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollbarFaceColor)(IHTMLStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbarFaceColor)(IHTMLStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollbar3dLightColor)(IHTMLStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbar3dLightColor)(IHTMLStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollbarShadowColor)(IHTMLStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbarShadowColor)(IHTMLStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollbarHighlightColor)(IHTMLStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbarHighlightColor)(IHTMLStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollbarDarkShadowColor)(IHTMLStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbarDarkShadowColor)(IHTMLStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollbarArrowColor)(IHTMLStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbarArrowColor)(IHTMLStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollbarTrackColor)(IHTMLStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbarTrackColor)(IHTMLStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_writingMode)(IHTMLStyle3 *This,BSTR v);
      HRESULT (WINAPI *get_writingMode)(IHTMLStyle3 *This,BSTR *p);
      HRESULT (WINAPI *put_textAlignLast)(IHTMLStyle3 *This,BSTR v);
      HRESULT (WINAPI *get_textAlignLast)(IHTMLStyle3 *This,BSTR *p);
      HRESULT (WINAPI *put_textKashidaSpace)(IHTMLStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_textKashidaSpace)(IHTMLStyle3 *This,VARIANT *p);
    END_INTERFACE
  } IHTMLStyle3Vtbl;
  interface IHTMLStyle3 {
    CONST_VTBL struct IHTMLStyle3Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLStyle3_put_layoutFlow_Proxy(IHTMLStyle3 *This,BSTR v);
  void __RPC_STUB IHTMLStyle3_put_layoutFlow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_layoutFlow_Proxy(IHTMLStyle3 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle3_get_layoutFlow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_put_zoom_Proxy(IHTMLStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle3_put_zoom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_zoom_Proxy(IHTMLStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle3_get_zoom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_put_wordWrap_Proxy(IHTMLStyle3 *This,BSTR v);
  void __RPC_STUB IHTMLStyle3_put_wordWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_wordWrap_Proxy(IHTMLStyle3 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle3_get_wordWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_put_textUnderlinePosition_Proxy(IHTMLStyle3 *This,BSTR v);
  void __RPC_STUB IHTMLStyle3_put_textUnderlinePosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_textUnderlinePosition_Proxy(IHTMLStyle3 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle3_get_textUnderlinePosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_put_scrollbarBaseColor_Proxy(IHTMLStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle3_put_scrollbarBaseColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_scrollbarBaseColor_Proxy(IHTMLStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle3_get_scrollbarBaseColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_put_scrollbarFaceColor_Proxy(IHTMLStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle3_put_scrollbarFaceColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_scrollbarFaceColor_Proxy(IHTMLStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle3_get_scrollbarFaceColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_put_scrollbar3dLightColor_Proxy(IHTMLStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle3_put_scrollbar3dLightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_scrollbar3dLightColor_Proxy(IHTMLStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle3_get_scrollbar3dLightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_put_scrollbarShadowColor_Proxy(IHTMLStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle3_put_scrollbarShadowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_scrollbarShadowColor_Proxy(IHTMLStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle3_get_scrollbarShadowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_put_scrollbarHighlightColor_Proxy(IHTMLStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle3_put_scrollbarHighlightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_scrollbarHighlightColor_Proxy(IHTMLStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle3_get_scrollbarHighlightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_put_scrollbarDarkShadowColor_Proxy(IHTMLStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle3_put_scrollbarDarkShadowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_scrollbarDarkShadowColor_Proxy(IHTMLStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle3_get_scrollbarDarkShadowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_put_scrollbarArrowColor_Proxy(IHTMLStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle3_put_scrollbarArrowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_scrollbarArrowColor_Proxy(IHTMLStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle3_get_scrollbarArrowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_put_scrollbarTrackColor_Proxy(IHTMLStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle3_put_scrollbarTrackColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_scrollbarTrackColor_Proxy(IHTMLStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle3_get_scrollbarTrackColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_put_writingMode_Proxy(IHTMLStyle3 *This,BSTR v);
  void __RPC_STUB IHTMLStyle3_put_writingMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_writingMode_Proxy(IHTMLStyle3 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle3_get_writingMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_put_textAlignLast_Proxy(IHTMLStyle3 *This,BSTR v);
  void __RPC_STUB IHTMLStyle3_put_textAlignLast_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_textAlignLast_Proxy(IHTMLStyle3 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle3_get_textAlignLast_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_put_textKashidaSpace_Proxy(IHTMLStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle3_put_textKashidaSpace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle3_get_textKashidaSpace_Proxy(IHTMLStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle3_get_textKashidaSpace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLStyle4_INTERFACE_DEFINED__
#define __IHTMLStyle4_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLStyle4;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLStyle4 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_textOverflow(BSTR v) = 0;
    virtual HRESULT WINAPI get_textOverflow(BSTR *p) = 0;
    virtual HRESULT WINAPI put_minHeight(VARIANT v) = 0;
    virtual HRESULT WINAPI get_minHeight(VARIANT *p) = 0;
  };
#else
  typedef struct IHTMLStyle4Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLStyle4 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLStyle4 *This);
      ULONG (WINAPI *Release)(IHTMLStyle4 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLStyle4 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLStyle4 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLStyle4 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLStyle4 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_textOverflow)(IHTMLStyle4 *This,BSTR v);
      HRESULT (WINAPI *get_textOverflow)(IHTMLStyle4 *This,BSTR *p);
      HRESULT (WINAPI *put_minHeight)(IHTMLStyle4 *This,VARIANT v);
      HRESULT (WINAPI *get_minHeight)(IHTMLStyle4 *This,VARIANT *p);
    END_INTERFACE
  } IHTMLStyle4Vtbl;
  interface IHTMLStyle4 {
    CONST_VTBL struct IHTMLStyle4Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLStyle4_put_textOverflow_Proxy(IHTMLStyle4 *This,BSTR v);
  void __RPC_STUB IHTMLStyle4_put_textOverflow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle4_get_textOverflow_Proxy(IHTMLStyle4 *This,BSTR *p);
  void __RPC_STUB IHTMLStyle4_get_textOverflow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle4_put_minHeight_Proxy(IHTMLStyle4 *This,VARIANT v);
  void __RPC_STUB IHTMLStyle4_put_minHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyle4_get_minHeight_Proxy(IHTMLStyle4 *This,VARIANT *p);
  void __RPC_STUB IHTMLStyle4_get_minHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLRuleStyle_INTERFACE_DEFINED__
#define __IHTMLRuleStyle_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLRuleStyle;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLRuleStyle : public IDispatch {
  public:
    virtual HRESULT WINAPI put_fontFamily(BSTR v) = 0;
    virtual HRESULT WINAPI get_fontFamily(BSTR *p) = 0;
    virtual HRESULT WINAPI put_fontStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_fontStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_fontVariant(BSTR v) = 0;
    virtual HRESULT WINAPI get_fontVariant(BSTR *p) = 0;
    virtual HRESULT WINAPI put_fontWeight(BSTR v) = 0;
    virtual HRESULT WINAPI get_fontWeight(BSTR *p) = 0;
    virtual HRESULT WINAPI put_fontSize(VARIANT v) = 0;
    virtual HRESULT WINAPI get_fontSize(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_font(BSTR v) = 0;
    virtual HRESULT WINAPI get_font(BSTR *p) = 0;
    virtual HRESULT WINAPI put_color(VARIANT v) = 0;
    virtual HRESULT WINAPI get_color(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_background(BSTR v) = 0;
    virtual HRESULT WINAPI get_background(BSTR *p) = 0;
    virtual HRESULT WINAPI put_backgroundColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_backgroundColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_backgroundImage(BSTR v) = 0;
    virtual HRESULT WINAPI get_backgroundImage(BSTR *p) = 0;
    virtual HRESULT WINAPI put_backgroundRepeat(BSTR v) = 0;
    virtual HRESULT WINAPI get_backgroundRepeat(BSTR *p) = 0;
    virtual HRESULT WINAPI put_backgroundAttachment(BSTR v) = 0;
    virtual HRESULT WINAPI get_backgroundAttachment(BSTR *p) = 0;
    virtual HRESULT WINAPI put_backgroundPosition(BSTR v) = 0;
    virtual HRESULT WINAPI get_backgroundPosition(BSTR *p) = 0;
    virtual HRESULT WINAPI put_backgroundPositionX(VARIANT v) = 0;
    virtual HRESULT WINAPI get_backgroundPositionX(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_backgroundPositionY(VARIANT v) = 0;
    virtual HRESULT WINAPI get_backgroundPositionY(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_wordSpacing(VARIANT v) = 0;
    virtual HRESULT WINAPI get_wordSpacing(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_letterSpacing(VARIANT v) = 0;
    virtual HRESULT WINAPI get_letterSpacing(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_textDecoration(BSTR v) = 0;
    virtual HRESULT WINAPI get_textDecoration(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textDecorationNone(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_textDecorationNone(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_textDecorationUnderline(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_textDecorationUnderline(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_textDecorationOverline(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_textDecorationOverline(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_textDecorationLineThrough(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_textDecorationLineThrough(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_textDecorationBlink(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_textDecorationBlink(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_verticalAlign(VARIANT v) = 0;
    virtual HRESULT WINAPI get_verticalAlign(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_textTransform(BSTR v) = 0;
    virtual HRESULT WINAPI get_textTransform(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textAlign(BSTR v) = 0;
    virtual HRESULT WINAPI get_textAlign(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textIndent(VARIANT v) = 0;
    virtual HRESULT WINAPI get_textIndent(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_lineHeight(VARIANT v) = 0;
    virtual HRESULT WINAPI get_lineHeight(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_marginTop(VARIANT v) = 0;
    virtual HRESULT WINAPI get_marginTop(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_marginRight(VARIANT v) = 0;
    virtual HRESULT WINAPI get_marginRight(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_marginBottom(VARIANT v) = 0;
    virtual HRESULT WINAPI get_marginBottom(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_marginLeft(VARIANT v) = 0;
    virtual HRESULT WINAPI get_marginLeft(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_margin(BSTR v) = 0;
    virtual HRESULT WINAPI get_margin(BSTR *p) = 0;
    virtual HRESULT WINAPI put_paddingTop(VARIANT v) = 0;
    virtual HRESULT WINAPI get_paddingTop(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_paddingRight(VARIANT v) = 0;
    virtual HRESULT WINAPI get_paddingRight(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_paddingBottom(VARIANT v) = 0;
    virtual HRESULT WINAPI get_paddingBottom(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_paddingLeft(VARIANT v) = 0;
    virtual HRESULT WINAPI get_paddingLeft(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_padding(BSTR v) = 0;
    virtual HRESULT WINAPI get_padding(BSTR *p) = 0;
    virtual HRESULT WINAPI put_border(BSTR v) = 0;
    virtual HRESULT WINAPI get_border(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderTop(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderTop(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderRight(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderRight(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderBottom(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderBottom(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderLeft(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderLeft(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderColor(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderColor(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderTopColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderTopColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderRightColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderRightColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderBottomColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderBottomColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderLeftColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderLeftColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderWidth(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderWidth(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderTopWidth(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderTopWidth(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderRightWidth(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderRightWidth(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderBottomWidth(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderBottomWidth(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderLeftWidth(VARIANT v) = 0;
    virtual HRESULT WINAPI get_borderLeftWidth(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_borderStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderTopStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderTopStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderRightStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderRightStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderBottomStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderBottomStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderLeftStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderLeftStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_width(VARIANT v) = 0;
    virtual HRESULT WINAPI get_width(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_height(VARIANT v) = 0;
    virtual HRESULT WINAPI get_height(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_styleFloat(BSTR v) = 0;
    virtual HRESULT WINAPI get_styleFloat(BSTR *p) = 0;
    virtual HRESULT WINAPI put_clear(BSTR v) = 0;
    virtual HRESULT WINAPI get_clear(BSTR *p) = 0;
    virtual HRESULT WINAPI put_display(BSTR v) = 0;
    virtual HRESULT WINAPI get_display(BSTR *p) = 0;
    virtual HRESULT WINAPI put_visibility(BSTR v) = 0;
    virtual HRESULT WINAPI get_visibility(BSTR *p) = 0;
    virtual HRESULT WINAPI put_listStyleType(BSTR v) = 0;
    virtual HRESULT WINAPI get_listStyleType(BSTR *p) = 0;
    virtual HRESULT WINAPI put_listStylePosition(BSTR v) = 0;
    virtual HRESULT WINAPI get_listStylePosition(BSTR *p) = 0;
    virtual HRESULT WINAPI put_listStyleImage(BSTR v) = 0;
    virtual HRESULT WINAPI get_listStyleImage(BSTR *p) = 0;
    virtual HRESULT WINAPI put_listStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_listStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_whiteSpace(BSTR v) = 0;
    virtual HRESULT WINAPI get_whiteSpace(BSTR *p) = 0;
    virtual HRESULT WINAPI put_top(VARIANT v) = 0;
    virtual HRESULT WINAPI get_top(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_left(VARIANT v) = 0;
    virtual HRESULT WINAPI get_left(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_position(BSTR *p) = 0;
    virtual HRESULT WINAPI put_zIndex(VARIANT v) = 0;
    virtual HRESULT WINAPI get_zIndex(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_overflow(BSTR v) = 0;
    virtual HRESULT WINAPI get_overflow(BSTR *p) = 0;
    virtual HRESULT WINAPI put_pageBreakBefore(BSTR v) = 0;
    virtual HRESULT WINAPI get_pageBreakBefore(BSTR *p) = 0;
    virtual HRESULT WINAPI put_pageBreakAfter(BSTR v) = 0;
    virtual HRESULT WINAPI get_pageBreakAfter(BSTR *p) = 0;
    virtual HRESULT WINAPI put_cssText(BSTR v) = 0;
    virtual HRESULT WINAPI get_cssText(BSTR *p) = 0;
    virtual HRESULT WINAPI put_cursor(BSTR v) = 0;
    virtual HRESULT WINAPI get_cursor(BSTR *p) = 0;
    virtual HRESULT WINAPI put_clip(BSTR v) = 0;
    virtual HRESULT WINAPI get_clip(BSTR *p) = 0;
    virtual HRESULT WINAPI put_filter(BSTR v) = 0;
    virtual HRESULT WINAPI get_filter(BSTR *p) = 0;
    virtual HRESULT WINAPI setAttribute(BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags = 1) = 0;
    virtual HRESULT WINAPI getAttribute(BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) = 0;
    virtual HRESULT WINAPI removeAttribute(BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess) = 0;
  };
#else
  typedef struct IHTMLRuleStyleVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLRuleStyle *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLRuleStyle *This);
      ULONG (WINAPI *Release)(IHTMLRuleStyle *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLRuleStyle *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLRuleStyle *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLRuleStyle *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLRuleStyle *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_fontFamily)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_fontFamily)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_fontStyle)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_fontStyle)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_fontVariant)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_fontVariant)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_fontWeight)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_fontWeight)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_fontSize)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_fontSize)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_font)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_font)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_color)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_color)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_background)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_background)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_backgroundColor)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_backgroundColor)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_backgroundImage)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_backgroundImage)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_backgroundRepeat)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_backgroundRepeat)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_backgroundAttachment)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_backgroundAttachment)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_backgroundPosition)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_backgroundPosition)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_backgroundPositionX)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_backgroundPositionX)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_backgroundPositionY)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_backgroundPositionY)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_wordSpacing)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_wordSpacing)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_letterSpacing)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_letterSpacing)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_textDecoration)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_textDecoration)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_textDecorationNone)(IHTMLRuleStyle *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_textDecorationNone)(IHTMLRuleStyle *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_textDecorationUnderline)(IHTMLRuleStyle *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_textDecorationUnderline)(IHTMLRuleStyle *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_textDecorationOverline)(IHTMLRuleStyle *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_textDecorationOverline)(IHTMLRuleStyle *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_textDecorationLineThrough)(IHTMLRuleStyle *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_textDecorationLineThrough)(IHTMLRuleStyle *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_textDecorationBlink)(IHTMLRuleStyle *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_textDecorationBlink)(IHTMLRuleStyle *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_verticalAlign)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_verticalAlign)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_textTransform)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_textTransform)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_textAlign)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_textAlign)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_textIndent)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_textIndent)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_lineHeight)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_lineHeight)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_marginTop)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_marginTop)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_marginRight)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_marginRight)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_marginBottom)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_marginBottom)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_marginLeft)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_marginLeft)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_margin)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_margin)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_paddingTop)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_paddingTop)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_paddingRight)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_paddingRight)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_paddingBottom)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_paddingBottom)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_paddingLeft)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_paddingLeft)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_padding)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_padding)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_border)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_border)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderTop)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderTop)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderRight)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderRight)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderBottom)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderBottom)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderLeft)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderLeft)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderColor)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderColor)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderTopColor)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderTopColor)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderRightColor)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderRightColor)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderBottomColor)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderBottomColor)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderLeftColor)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderLeftColor)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderWidth)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderWidth)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderTopWidth)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderTopWidth)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderRightWidth)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderRightWidth)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderBottomWidth)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderBottomWidth)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderLeftWidth)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_borderLeftWidth)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_borderStyle)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderStyle)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderTopStyle)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderTopStyle)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderRightStyle)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderRightStyle)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderBottomStyle)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderBottomStyle)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_borderLeftStyle)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_borderLeftStyle)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_width)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_width)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_height)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_height)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_styleFloat)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_styleFloat)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_clear)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_clear)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_display)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_display)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_visibility)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_visibility)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_listStyleType)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_listStyleType)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_listStylePosition)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_listStylePosition)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_listStyleImage)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_listStyleImage)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_listStyle)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_listStyle)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_whiteSpace)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_whiteSpace)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_top)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_top)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_left)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_left)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_position)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_zIndex)(IHTMLRuleStyle *This,VARIANT v);
      HRESULT (WINAPI *get_zIndex)(IHTMLRuleStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_overflow)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_overflow)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_pageBreakBefore)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_pageBreakBefore)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_pageBreakAfter)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_pageBreakAfter)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_cssText)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_cssText)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_cursor)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_cursor)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_clip)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_clip)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *put_filter)(IHTMLRuleStyle *This,BSTR v);
      HRESULT (WINAPI *get_filter)(IHTMLRuleStyle *This,BSTR *p);
      HRESULT (WINAPI *setAttribute)(IHTMLRuleStyle *This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags);
      HRESULT (WINAPI *getAttribute)(IHTMLRuleStyle *This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue);
      HRESULT (WINAPI *removeAttribute)(IHTMLRuleStyle *This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess);
    END_INTERFACE
  } IHTMLRuleStyleVtbl;
  interface IHTMLRuleStyle {
    CONST_VTBL struct IHTMLRuleStyleVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLRuleStyle_put_fontFamily_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_fontFamily_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_fontFamily_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_fontFamily_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_fontStyle_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_fontStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_fontStyle_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_fontStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_fontVariant_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_fontVariant_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_fontVariant_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_fontVariant_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_fontWeight_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_fontWeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_fontWeight_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_fontWeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_fontSize_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_fontSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_fontSize_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_fontSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_font_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_font_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_font_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_font_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_color_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_color_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_color_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_color_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_background_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_background_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_background_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_background_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_backgroundColor_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_backgroundColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_backgroundColor_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_backgroundColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_backgroundImage_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_backgroundImage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_backgroundImage_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_backgroundImage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_backgroundRepeat_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_backgroundRepeat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_backgroundRepeat_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_backgroundRepeat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_backgroundAttachment_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_backgroundAttachment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_backgroundAttachment_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_backgroundAttachment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_backgroundPosition_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_backgroundPosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_backgroundPosition_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_backgroundPosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_backgroundPositionX_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_backgroundPositionX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_backgroundPositionX_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_backgroundPositionX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_backgroundPositionY_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_backgroundPositionY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_backgroundPositionY_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_backgroundPositionY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_wordSpacing_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_wordSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_wordSpacing_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_wordSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_letterSpacing_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_letterSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_letterSpacing_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_letterSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_textDecoration_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_textDecoration_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_textDecoration_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_textDecoration_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_textDecorationNone_Proxy(IHTMLRuleStyle *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLRuleStyle_put_textDecorationNone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_textDecorationNone_Proxy(IHTMLRuleStyle *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLRuleStyle_get_textDecorationNone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_textDecorationUnderline_Proxy(IHTMLRuleStyle *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLRuleStyle_put_textDecorationUnderline_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_textDecorationUnderline_Proxy(IHTMLRuleStyle *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLRuleStyle_get_textDecorationUnderline_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_textDecorationOverline_Proxy(IHTMLRuleStyle *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLRuleStyle_put_textDecorationOverline_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_textDecorationOverline_Proxy(IHTMLRuleStyle *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLRuleStyle_get_textDecorationOverline_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_textDecorationLineThrough_Proxy(IHTMLRuleStyle *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLRuleStyle_put_textDecorationLineThrough_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_textDecorationLineThrough_Proxy(IHTMLRuleStyle *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLRuleStyle_get_textDecorationLineThrough_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_textDecorationBlink_Proxy(IHTMLRuleStyle *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLRuleStyle_put_textDecorationBlink_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_textDecorationBlink_Proxy(IHTMLRuleStyle *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLRuleStyle_get_textDecorationBlink_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_verticalAlign_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_verticalAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_verticalAlign_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_verticalAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_textTransform_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_textTransform_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_textTransform_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_textTransform_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_textAlign_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_textAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_textAlign_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_textAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_textIndent_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_textIndent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_textIndent_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_textIndent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_lineHeight_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_lineHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_lineHeight_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_lineHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_marginTop_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_marginTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_marginTop_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_marginTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_marginRight_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_marginRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_marginRight_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_marginRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_marginBottom_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_marginBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_marginBottom_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_marginBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_marginLeft_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_marginLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_marginLeft_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_marginLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_margin_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_margin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_margin_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_margin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_paddingTop_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_paddingTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_paddingTop_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_paddingTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_paddingRight_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_paddingRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_paddingRight_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_paddingRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_paddingBottom_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_paddingBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_paddingBottom_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_paddingBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_paddingLeft_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_paddingLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_paddingLeft_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_paddingLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_padding_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_padding_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_padding_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_padding_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_border_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_border_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderTop_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_borderTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderTop_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderRight_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_borderRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderRight_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderBottom_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_borderBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderBottom_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderLeft_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_borderLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderLeft_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderColor_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderColor_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderTopColor_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_borderTopColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderTopColor_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderTopColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderRightColor_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_borderRightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderRightColor_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderRightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderBottomColor_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_borderBottomColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderBottomColor_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderBottomColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderLeftColor_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_borderLeftColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderLeftColor_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderLeftColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderWidth_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_borderWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderWidth_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderTopWidth_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_borderTopWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderTopWidth_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderTopWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderRightWidth_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_borderRightWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderRightWidth_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderRightWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderBottomWidth_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_borderBottomWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderBottomWidth_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderBottomWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderLeftWidth_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_borderLeftWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderLeftWidth_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderLeftWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderStyle_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_borderStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderStyle_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderTopStyle_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_borderTopStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderTopStyle_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderTopStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderRightStyle_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_borderRightStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderRightStyle_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderRightStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderBottomStyle_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_borderBottomStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderBottomStyle_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderBottomStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_borderLeftStyle_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_borderLeftStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_borderLeftStyle_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_borderLeftStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_width_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_width_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_height_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_height_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_styleFloat_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_styleFloat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_styleFloat_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_styleFloat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_clear_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_clear_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_clear_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_clear_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_display_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_display_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_display_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_display_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_visibility_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_visibility_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_visibility_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_visibility_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_listStyleType_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_listStyleType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_listStyleType_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_listStyleType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_listStylePosition_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_listStylePosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_listStylePosition_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_listStylePosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_listStyleImage_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_listStyleImage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_listStyleImage_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_listStyleImage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_listStyle_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_listStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_listStyle_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_listStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_whiteSpace_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_whiteSpace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_whiteSpace_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_whiteSpace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_top_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_top_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_top_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_top_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_left_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_left_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_left_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_left_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_position_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_position_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_zIndex_Proxy(IHTMLRuleStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle_put_zIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_zIndex_Proxy(IHTMLRuleStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle_get_zIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_overflow_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_overflow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_overflow_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_overflow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_pageBreakBefore_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_pageBreakBefore_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_pageBreakBefore_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_pageBreakBefore_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_pageBreakAfter_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_pageBreakAfter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_pageBreakAfter_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_pageBreakAfter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_cssText_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_cssText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_cssText_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_cssText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_cursor_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_cursor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_cursor_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_cursor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_clip_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_clip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_clip_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_clip_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_put_filter_Proxy(IHTMLRuleStyle *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle_put_filter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_get_filter_Proxy(IHTMLRuleStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle_get_filter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_setAttribute_Proxy(IHTMLRuleStyle *This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags);
  void __RPC_STUB IHTMLRuleStyle_setAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_getAttribute_Proxy(IHTMLRuleStyle *This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue);
  void __RPC_STUB IHTMLRuleStyle_getAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle_removeAttribute_Proxy(IHTMLRuleStyle *This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess);
  void __RPC_STUB IHTMLRuleStyle_removeAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLRuleStyle2_INTERFACE_DEFINED__
#define __IHTMLRuleStyle2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLRuleStyle2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLRuleStyle2 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_tableLayout(BSTR v) = 0;
    virtual HRESULT WINAPI get_tableLayout(BSTR *p) = 0;
    virtual HRESULT WINAPI put_borderCollapse(BSTR v) = 0;
    virtual HRESULT WINAPI get_borderCollapse(BSTR *p) = 0;
    virtual HRESULT WINAPI put_direction(BSTR v) = 0;
    virtual HRESULT WINAPI get_direction(BSTR *p) = 0;
    virtual HRESULT WINAPI put_behavior(BSTR v) = 0;
    virtual HRESULT WINAPI get_behavior(BSTR *p) = 0;
    virtual HRESULT WINAPI put_position(BSTR v) = 0;
    virtual HRESULT WINAPI get_position(BSTR *p) = 0;
    virtual HRESULT WINAPI put_unicodeBidi(BSTR v) = 0;
    virtual HRESULT WINAPI get_unicodeBidi(BSTR *p) = 0;
    virtual HRESULT WINAPI put_bottom(VARIANT v) = 0;
    virtual HRESULT WINAPI get_bottom(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_right(VARIANT v) = 0;
    virtual HRESULT WINAPI get_right(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_pixelBottom(long v) = 0;
    virtual HRESULT WINAPI get_pixelBottom(long *p) = 0;
    virtual HRESULT WINAPI put_pixelRight(long v) = 0;
    virtual HRESULT WINAPI get_pixelRight(long *p) = 0;
    virtual HRESULT WINAPI put_posBottom(float v) = 0;
    virtual HRESULT WINAPI get_posBottom(float *p) = 0;
    virtual HRESULT WINAPI put_posRight(float v) = 0;
    virtual HRESULT WINAPI get_posRight(float *p) = 0;
    virtual HRESULT WINAPI put_imeMode(BSTR v) = 0;
    virtual HRESULT WINAPI get_imeMode(BSTR *p) = 0;
    virtual HRESULT WINAPI put_rubyAlign(BSTR v) = 0;
    virtual HRESULT WINAPI get_rubyAlign(BSTR *p) = 0;
    virtual HRESULT WINAPI put_rubyPosition(BSTR v) = 0;
    virtual HRESULT WINAPI get_rubyPosition(BSTR *p) = 0;
    virtual HRESULT WINAPI put_rubyOverhang(BSTR v) = 0;
    virtual HRESULT WINAPI get_rubyOverhang(BSTR *p) = 0;
    virtual HRESULT WINAPI put_layoutGridChar(VARIANT v) = 0;
    virtual HRESULT WINAPI get_layoutGridChar(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_layoutGridLine(VARIANT v) = 0;
    virtual HRESULT WINAPI get_layoutGridLine(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_layoutGridMode(BSTR v) = 0;
    virtual HRESULT WINAPI get_layoutGridMode(BSTR *p) = 0;
    virtual HRESULT WINAPI put_layoutGridType(BSTR v) = 0;
    virtual HRESULT WINAPI get_layoutGridType(BSTR *p) = 0;
    virtual HRESULT WINAPI put_layoutGrid(BSTR v) = 0;
    virtual HRESULT WINAPI get_layoutGrid(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textAutospace(BSTR v) = 0;
    virtual HRESULT WINAPI get_textAutospace(BSTR *p) = 0;
    virtual HRESULT WINAPI put_wordBreak(BSTR v) = 0;
    virtual HRESULT WINAPI get_wordBreak(BSTR *p) = 0;
    virtual HRESULT WINAPI put_lineBreak(BSTR v) = 0;
    virtual HRESULT WINAPI get_lineBreak(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textJustify(BSTR v) = 0;
    virtual HRESULT WINAPI get_textJustify(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textJustifyTrim(BSTR v) = 0;
    virtual HRESULT WINAPI get_textJustifyTrim(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textKashida(VARIANT v) = 0;
    virtual HRESULT WINAPI get_textKashida(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_overflowX(BSTR v) = 0;
    virtual HRESULT WINAPI get_overflowX(BSTR *p) = 0;
    virtual HRESULT WINAPI put_overflowY(BSTR v) = 0;
    virtual HRESULT WINAPI get_overflowY(BSTR *p) = 0;
    virtual HRESULT WINAPI put_accelerator(BSTR v) = 0;
    virtual HRESULT WINAPI get_accelerator(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLRuleStyle2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLRuleStyle2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLRuleStyle2 *This);
      ULONG (WINAPI *Release)(IHTMLRuleStyle2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLRuleStyle2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLRuleStyle2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLRuleStyle2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLRuleStyle2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_tableLayout)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_tableLayout)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_borderCollapse)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_borderCollapse)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_direction)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_direction)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_behavior)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_behavior)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_position)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_position)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_unicodeBidi)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_unicodeBidi)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_bottom)(IHTMLRuleStyle2 *This,VARIANT v);
      HRESULT (WINAPI *get_bottom)(IHTMLRuleStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *put_right)(IHTMLRuleStyle2 *This,VARIANT v);
      HRESULT (WINAPI *get_right)(IHTMLRuleStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *put_pixelBottom)(IHTMLRuleStyle2 *This,long v);
      HRESULT (WINAPI *get_pixelBottom)(IHTMLRuleStyle2 *This,long *p);
      HRESULT (WINAPI *put_pixelRight)(IHTMLRuleStyle2 *This,long v);
      HRESULT (WINAPI *get_pixelRight)(IHTMLRuleStyle2 *This,long *p);
      HRESULT (WINAPI *put_posBottom)(IHTMLRuleStyle2 *This,float v);
      HRESULT (WINAPI *get_posBottom)(IHTMLRuleStyle2 *This,float *p);
      HRESULT (WINAPI *put_posRight)(IHTMLRuleStyle2 *This,float v);
      HRESULT (WINAPI *get_posRight)(IHTMLRuleStyle2 *This,float *p);
      HRESULT (WINAPI *put_imeMode)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_imeMode)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_rubyAlign)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_rubyAlign)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_rubyPosition)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_rubyPosition)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_rubyOverhang)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_rubyOverhang)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_layoutGridChar)(IHTMLRuleStyle2 *This,VARIANT v);
      HRESULT (WINAPI *get_layoutGridChar)(IHTMLRuleStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *put_layoutGridLine)(IHTMLRuleStyle2 *This,VARIANT v);
      HRESULT (WINAPI *get_layoutGridLine)(IHTMLRuleStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *put_layoutGridMode)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_layoutGridMode)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_layoutGridType)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_layoutGridType)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_layoutGrid)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_layoutGrid)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_textAutospace)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_textAutospace)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_wordBreak)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_wordBreak)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_lineBreak)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_lineBreak)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_textJustify)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_textJustify)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_textJustifyTrim)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_textJustifyTrim)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_textKashida)(IHTMLRuleStyle2 *This,VARIANT v);
      HRESULT (WINAPI *get_textKashida)(IHTMLRuleStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *put_overflowX)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_overflowX)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_overflowY)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_overflowY)(IHTMLRuleStyle2 *This,BSTR *p);
      HRESULT (WINAPI *put_accelerator)(IHTMLRuleStyle2 *This,BSTR v);
      HRESULT (WINAPI *get_accelerator)(IHTMLRuleStyle2 *This,BSTR *p);
    END_INTERFACE
  } IHTMLRuleStyle2Vtbl;
  interface IHTMLRuleStyle2 {
    CONST_VTBL struct IHTMLRuleStyle2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLRuleStyle2_put_tableLayout_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_tableLayout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_tableLayout_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_tableLayout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_borderCollapse_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_borderCollapse_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_borderCollapse_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_borderCollapse_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_direction_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_direction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_direction_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_direction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_behavior_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_behavior_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_behavior_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_behavior_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_position_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_position_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_position_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_position_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_unicodeBidi_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_unicodeBidi_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_unicodeBidi_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_unicodeBidi_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_bottom_Proxy(IHTMLRuleStyle2 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle2_put_bottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_bottom_Proxy(IHTMLRuleStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle2_get_bottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_right_Proxy(IHTMLRuleStyle2 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle2_put_right_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_right_Proxy(IHTMLRuleStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle2_get_right_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_pixelBottom_Proxy(IHTMLRuleStyle2 *This,long v);
  void __RPC_STUB IHTMLRuleStyle2_put_pixelBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_pixelBottom_Proxy(IHTMLRuleStyle2 *This,long *p);
  void __RPC_STUB IHTMLRuleStyle2_get_pixelBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_pixelRight_Proxy(IHTMLRuleStyle2 *This,long v);
  void __RPC_STUB IHTMLRuleStyle2_put_pixelRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_pixelRight_Proxy(IHTMLRuleStyle2 *This,long *p);
  void __RPC_STUB IHTMLRuleStyle2_get_pixelRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_posBottom_Proxy(IHTMLRuleStyle2 *This,float v);
  void __RPC_STUB IHTMLRuleStyle2_put_posBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_posBottom_Proxy(IHTMLRuleStyle2 *This,float *p);
  void __RPC_STUB IHTMLRuleStyle2_get_posBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_posRight_Proxy(IHTMLRuleStyle2 *This,float v);
  void __RPC_STUB IHTMLRuleStyle2_put_posRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_posRight_Proxy(IHTMLRuleStyle2 *This,float *p);
  void __RPC_STUB IHTMLRuleStyle2_get_posRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_imeMode_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_imeMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_imeMode_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_imeMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_rubyAlign_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_rubyAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_rubyAlign_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_rubyAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_rubyPosition_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_rubyPosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_rubyPosition_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_rubyPosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_rubyOverhang_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_rubyOverhang_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_rubyOverhang_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_rubyOverhang_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_layoutGridChar_Proxy(IHTMLRuleStyle2 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle2_put_layoutGridChar_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_layoutGridChar_Proxy(IHTMLRuleStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle2_get_layoutGridChar_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_layoutGridLine_Proxy(IHTMLRuleStyle2 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle2_put_layoutGridLine_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_layoutGridLine_Proxy(IHTMLRuleStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle2_get_layoutGridLine_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_layoutGridMode_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_layoutGridMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_layoutGridMode_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_layoutGridMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_layoutGridType_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_layoutGridType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_layoutGridType_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_layoutGridType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_layoutGrid_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_layoutGrid_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_layoutGrid_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_layoutGrid_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_textAutospace_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_textAutospace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_textAutospace_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_textAutospace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_wordBreak_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_wordBreak_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_wordBreak_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_wordBreak_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_lineBreak_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_lineBreak_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_lineBreak_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_lineBreak_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_textJustify_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_textJustify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_textJustify_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_textJustify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_textJustifyTrim_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_textJustifyTrim_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_textJustifyTrim_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_textJustifyTrim_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_textKashida_Proxy(IHTMLRuleStyle2 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle2_put_textKashida_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_textKashida_Proxy(IHTMLRuleStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle2_get_textKashida_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_overflowX_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_overflowX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_overflowX_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_overflowX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_overflowY_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_overflowY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_overflowY_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_overflowY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_put_accelerator_Proxy(IHTMLRuleStyle2 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle2_put_accelerator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle2_get_accelerator_Proxy(IHTMLRuleStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle2_get_accelerator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLRuleStyle3_INTERFACE_DEFINED__
#define __IHTMLRuleStyle3_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLRuleStyle3;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLRuleStyle3 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_layoutFlow(BSTR v) = 0;
    virtual HRESULT WINAPI get_layoutFlow(BSTR *p) = 0;
    virtual HRESULT WINAPI put_zoom(VARIANT v) = 0;
    virtual HRESULT WINAPI get_zoom(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_wordWrap(BSTR v) = 0;
    virtual HRESULT WINAPI get_wordWrap(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textUnderlinePosition(BSTR v) = 0;
    virtual HRESULT WINAPI get_textUnderlinePosition(BSTR *p) = 0;
    virtual HRESULT WINAPI put_scrollbarBaseColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbarBaseColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollbarFaceColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbarFaceColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollbar3dLightColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbar3dLightColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollbarShadowColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbarShadowColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollbarHighlightColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbarHighlightColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollbarDarkShadowColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbarDarkShadowColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollbarArrowColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbarArrowColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollbarTrackColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_scrollbarTrackColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_writingMode(BSTR v) = 0;
    virtual HRESULT WINAPI get_writingMode(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textAlignLast(BSTR v) = 0;
    virtual HRESULT WINAPI get_textAlignLast(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textKashidaSpace(VARIANT v) = 0;
    virtual HRESULT WINAPI get_textKashidaSpace(VARIANT *p) = 0;
  };
#else
  typedef struct IHTMLRuleStyle3Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLRuleStyle3 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLRuleStyle3 *This);
      ULONG (WINAPI *Release)(IHTMLRuleStyle3 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLRuleStyle3 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLRuleStyle3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLRuleStyle3 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLRuleStyle3 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_layoutFlow)(IHTMLRuleStyle3 *This,BSTR v);
      HRESULT (WINAPI *get_layoutFlow)(IHTMLRuleStyle3 *This,BSTR *p);
      HRESULT (WINAPI *put_zoom)(IHTMLRuleStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_zoom)(IHTMLRuleStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_wordWrap)(IHTMLRuleStyle3 *This,BSTR v);
      HRESULT (WINAPI *get_wordWrap)(IHTMLRuleStyle3 *This,BSTR *p);
      HRESULT (WINAPI *put_textUnderlinePosition)(IHTMLRuleStyle3 *This,BSTR v);
      HRESULT (WINAPI *get_textUnderlinePosition)(IHTMLRuleStyle3 *This,BSTR *p);
      HRESULT (WINAPI *put_scrollbarBaseColor)(IHTMLRuleStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbarBaseColor)(IHTMLRuleStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollbarFaceColor)(IHTMLRuleStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbarFaceColor)(IHTMLRuleStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollbar3dLightColor)(IHTMLRuleStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbar3dLightColor)(IHTMLRuleStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollbarShadowColor)(IHTMLRuleStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbarShadowColor)(IHTMLRuleStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollbarHighlightColor)(IHTMLRuleStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbarHighlightColor)(IHTMLRuleStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollbarDarkShadowColor)(IHTMLRuleStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbarDarkShadowColor)(IHTMLRuleStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollbarArrowColor)(IHTMLRuleStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbarArrowColor)(IHTMLRuleStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollbarTrackColor)(IHTMLRuleStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_scrollbarTrackColor)(IHTMLRuleStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *put_writingMode)(IHTMLRuleStyle3 *This,BSTR v);
      HRESULT (WINAPI *get_writingMode)(IHTMLRuleStyle3 *This,BSTR *p);
      HRESULT (WINAPI *put_textAlignLast)(IHTMLRuleStyle3 *This,BSTR v);
      HRESULT (WINAPI *get_textAlignLast)(IHTMLRuleStyle3 *This,BSTR *p);
      HRESULT (WINAPI *put_textKashidaSpace)(IHTMLRuleStyle3 *This,VARIANT v);
      HRESULT (WINAPI *get_textKashidaSpace)(IHTMLRuleStyle3 *This,VARIANT *p);
    END_INTERFACE
  } IHTMLRuleStyle3Vtbl;
  interface IHTMLRuleStyle3 {
    CONST_VTBL struct IHTMLRuleStyle3Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLRuleStyle3_put_layoutFlow_Proxy(IHTMLRuleStyle3 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle3_put_layoutFlow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_layoutFlow_Proxy(IHTMLRuleStyle3 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle3_get_layoutFlow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_put_zoom_Proxy(IHTMLRuleStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle3_put_zoom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_zoom_Proxy(IHTMLRuleStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle3_get_zoom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_put_wordWrap_Proxy(IHTMLRuleStyle3 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle3_put_wordWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_wordWrap_Proxy(IHTMLRuleStyle3 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle3_get_wordWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_put_textUnderlinePosition_Proxy(IHTMLRuleStyle3 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle3_put_textUnderlinePosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_textUnderlinePosition_Proxy(IHTMLRuleStyle3 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle3_get_textUnderlinePosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_put_scrollbarBaseColor_Proxy(IHTMLRuleStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle3_put_scrollbarBaseColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_scrollbarBaseColor_Proxy(IHTMLRuleStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle3_get_scrollbarBaseColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_put_scrollbarFaceColor_Proxy(IHTMLRuleStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle3_put_scrollbarFaceColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_scrollbarFaceColor_Proxy(IHTMLRuleStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle3_get_scrollbarFaceColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_put_scrollbar3dLightColor_Proxy(IHTMLRuleStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle3_put_scrollbar3dLightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_scrollbar3dLightColor_Proxy(IHTMLRuleStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle3_get_scrollbar3dLightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_put_scrollbarShadowColor_Proxy(IHTMLRuleStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle3_put_scrollbarShadowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_scrollbarShadowColor_Proxy(IHTMLRuleStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle3_get_scrollbarShadowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_put_scrollbarHighlightColor_Proxy(IHTMLRuleStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle3_put_scrollbarHighlightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_scrollbarHighlightColor_Proxy(IHTMLRuleStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle3_get_scrollbarHighlightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_put_scrollbarDarkShadowColor_Proxy(IHTMLRuleStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle3_put_scrollbarDarkShadowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_scrollbarDarkShadowColor_Proxy(IHTMLRuleStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle3_get_scrollbarDarkShadowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_put_scrollbarArrowColor_Proxy(IHTMLRuleStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle3_put_scrollbarArrowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_scrollbarArrowColor_Proxy(IHTMLRuleStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle3_get_scrollbarArrowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_put_scrollbarTrackColor_Proxy(IHTMLRuleStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle3_put_scrollbarTrackColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_scrollbarTrackColor_Proxy(IHTMLRuleStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle3_get_scrollbarTrackColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_put_writingMode_Proxy(IHTMLRuleStyle3 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle3_put_writingMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_writingMode_Proxy(IHTMLRuleStyle3 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle3_get_writingMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_put_textAlignLast_Proxy(IHTMLRuleStyle3 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle3_put_textAlignLast_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_textAlignLast_Proxy(IHTMLRuleStyle3 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle3_get_textAlignLast_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_put_textKashidaSpace_Proxy(IHTMLRuleStyle3 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle3_put_textKashidaSpace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle3_get_textKashidaSpace_Proxy(IHTMLRuleStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle3_get_textKashidaSpace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLRuleStyle4_INTERFACE_DEFINED__
#define __IHTMLRuleStyle4_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLRuleStyle4;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLRuleStyle4 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_textOverflow(BSTR v) = 0;
    virtual HRESULT WINAPI get_textOverflow(BSTR *p) = 0;
    virtual HRESULT WINAPI put_minHeight(VARIANT v) = 0;
    virtual HRESULT WINAPI get_minHeight(VARIANT *p) = 0;
  };
#else
  typedef struct IHTMLRuleStyle4Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLRuleStyle4 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLRuleStyle4 *This);
      ULONG (WINAPI *Release)(IHTMLRuleStyle4 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLRuleStyle4 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLRuleStyle4 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLRuleStyle4 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLRuleStyle4 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_textOverflow)(IHTMLRuleStyle4 *This,BSTR v);
      HRESULT (WINAPI *get_textOverflow)(IHTMLRuleStyle4 *This,BSTR *p);
      HRESULT (WINAPI *put_minHeight)(IHTMLRuleStyle4 *This,VARIANT v);
      HRESULT (WINAPI *get_minHeight)(IHTMLRuleStyle4 *This,VARIANT *p);
    END_INTERFACE
  } IHTMLRuleStyle4Vtbl;
  interface IHTMLRuleStyle4 {
    CONST_VTBL struct IHTMLRuleStyle4Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLRuleStyle4_put_textOverflow_Proxy(IHTMLRuleStyle4 *This,BSTR v);
  void __RPC_STUB IHTMLRuleStyle4_put_textOverflow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle4_get_textOverflow_Proxy(IHTMLRuleStyle4 *This,BSTR *p);
  void __RPC_STUB IHTMLRuleStyle4_get_textOverflow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle4_put_minHeight_Proxy(IHTMLRuleStyle4 *This,VARIANT v);
  void __RPC_STUB IHTMLRuleStyle4_put_minHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRuleStyle4_get_minHeight_Proxy(IHTMLRuleStyle4 *This,VARIANT *p);
  void __RPC_STUB IHTMLRuleStyle4_get_minHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLStyle_DISPINTERFACE_DEFINED__
#define __DispHTMLStyle_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLStyle;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLStyle : public IDispatch {
  };
#else
  typedef struct DispHTMLStyleVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLStyle *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLStyle *This);
      ULONG (WINAPI *Release)(DispHTMLStyle *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLStyle *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLStyle *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLStyle *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLStyleVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLStyle;
#ifdef __cplusplus
  class HTMLStyle;
#endif

#ifndef __DispHTMLRuleStyle_DISPINTERFACE_DEFINED__
#define __DispHTMLRuleStyle_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLRuleStyle;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLRuleStyle : public IDispatch {
  };
#else
  typedef struct DispHTMLRuleStyleVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLRuleStyle *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLRuleStyle *This);
      ULONG (WINAPI *Release)(DispHTMLRuleStyle *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLRuleStyle *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLRuleStyle *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLRuleStyle *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLRuleStyleVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLRuleStyle;
#ifdef __cplusplus
  class HTMLRuleStyle;
#endif

#ifndef __IHTMLRenderStyle_INTERFACE_DEFINED__
#define __IHTMLRenderStyle_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLRenderStyle;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLRenderStyle : public IDispatch {
  public:
    virtual HRESULT WINAPI put_textLineThroughStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_textLineThroughStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textUnderlineStyle(BSTR v) = 0;
    virtual HRESULT WINAPI get_textUnderlineStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textEffect(BSTR v) = 0;
    virtual HRESULT WINAPI get_textEffect(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_textColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_textBackgroundColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_textBackgroundColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_textDecorationColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_textDecorationColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_renderingPriority(long v) = 0;
    virtual HRESULT WINAPI get_renderingPriority(long *p) = 0;
    virtual HRESULT WINAPI put_defaultTextSelection(BSTR v) = 0;
    virtual HRESULT WINAPI get_defaultTextSelection(BSTR *p) = 0;
    virtual HRESULT WINAPI put_textDecoration(BSTR v) = 0;
    virtual HRESULT WINAPI get_textDecoration(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLRenderStyleVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLRenderStyle *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLRenderStyle *This);
      ULONG (WINAPI *Release)(IHTMLRenderStyle *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLRenderStyle *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLRenderStyle *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLRenderStyle *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLRenderStyle *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_textLineThroughStyle)(IHTMLRenderStyle *This,BSTR v);
      HRESULT (WINAPI *get_textLineThroughStyle)(IHTMLRenderStyle *This,BSTR *p);
      HRESULT (WINAPI *put_textUnderlineStyle)(IHTMLRenderStyle *This,BSTR v);
      HRESULT (WINAPI *get_textUnderlineStyle)(IHTMLRenderStyle *This,BSTR *p);
      HRESULT (WINAPI *put_textEffect)(IHTMLRenderStyle *This,BSTR v);
      HRESULT (WINAPI *get_textEffect)(IHTMLRenderStyle *This,BSTR *p);
      HRESULT (WINAPI *put_textColor)(IHTMLRenderStyle *This,VARIANT v);
      HRESULT (WINAPI *get_textColor)(IHTMLRenderStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_textBackgroundColor)(IHTMLRenderStyle *This,VARIANT v);
      HRESULT (WINAPI *get_textBackgroundColor)(IHTMLRenderStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_textDecorationColor)(IHTMLRenderStyle *This,VARIANT v);
      HRESULT (WINAPI *get_textDecorationColor)(IHTMLRenderStyle *This,VARIANT *p);
      HRESULT (WINAPI *put_renderingPriority)(IHTMLRenderStyle *This,long v);
      HRESULT (WINAPI *get_renderingPriority)(IHTMLRenderStyle *This,long *p);
      HRESULT (WINAPI *put_defaultTextSelection)(IHTMLRenderStyle *This,BSTR v);
      HRESULT (WINAPI *get_defaultTextSelection)(IHTMLRenderStyle *This,BSTR *p);
      HRESULT (WINAPI *put_textDecoration)(IHTMLRenderStyle *This,BSTR v);
      HRESULT (WINAPI *get_textDecoration)(IHTMLRenderStyle *This,BSTR *p);
    END_INTERFACE
  } IHTMLRenderStyleVtbl;
  interface IHTMLRenderStyle {
    CONST_VTBL struct IHTMLRenderStyleVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLRenderStyle_put_textLineThroughStyle_Proxy(IHTMLRenderStyle *This,BSTR v);
  void __RPC_STUB IHTMLRenderStyle_put_textLineThroughStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_get_textLineThroughStyle_Proxy(IHTMLRenderStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRenderStyle_get_textLineThroughStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_put_textUnderlineStyle_Proxy(IHTMLRenderStyle *This,BSTR v);
  void __RPC_STUB IHTMLRenderStyle_put_textUnderlineStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_get_textUnderlineStyle_Proxy(IHTMLRenderStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRenderStyle_get_textUnderlineStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_put_textEffect_Proxy(IHTMLRenderStyle *This,BSTR v);
  void __RPC_STUB IHTMLRenderStyle_put_textEffect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_get_textEffect_Proxy(IHTMLRenderStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRenderStyle_get_textEffect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_put_textColor_Proxy(IHTMLRenderStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRenderStyle_put_textColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_get_textColor_Proxy(IHTMLRenderStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRenderStyle_get_textColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_put_textBackgroundColor_Proxy(IHTMLRenderStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRenderStyle_put_textBackgroundColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_get_textBackgroundColor_Proxy(IHTMLRenderStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRenderStyle_get_textBackgroundColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_put_textDecorationColor_Proxy(IHTMLRenderStyle *This,VARIANT v);
  void __RPC_STUB IHTMLRenderStyle_put_textDecorationColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_get_textDecorationColor_Proxy(IHTMLRenderStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLRenderStyle_get_textDecorationColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_put_renderingPriority_Proxy(IHTMLRenderStyle *This,long v);
  void __RPC_STUB IHTMLRenderStyle_put_renderingPriority_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_get_renderingPriority_Proxy(IHTMLRenderStyle *This,long *p);
  void __RPC_STUB IHTMLRenderStyle_get_renderingPriority_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_put_defaultTextSelection_Proxy(IHTMLRenderStyle *This,BSTR v);
  void __RPC_STUB IHTMLRenderStyle_put_defaultTextSelection_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_get_defaultTextSelection_Proxy(IHTMLRenderStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRenderStyle_get_defaultTextSelection_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_put_textDecoration_Proxy(IHTMLRenderStyle *This,BSTR v);
  void __RPC_STUB IHTMLRenderStyle_put_textDecoration_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRenderStyle_get_textDecoration_Proxy(IHTMLRenderStyle *This,BSTR *p);
  void __RPC_STUB IHTMLRenderStyle_get_textDecoration_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLRenderStyle_DISPINTERFACE_DEFINED__
#define __DispHTMLRenderStyle_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLRenderStyle;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLRenderStyle : public IDispatch {
  };
#else
  typedef struct DispHTMLRenderStyleVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLRenderStyle *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLRenderStyle *This);
      ULONG (WINAPI *Release)(DispHTMLRenderStyle *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLRenderStyle *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLRenderStyle *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLRenderStyle *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLRenderStyleVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLRenderStyle;
#ifdef __cplusplus
  class HTMLRenderStyle;
#endif

#ifndef __IHTMLCurrentStyle_INTERFACE_DEFINED__
#define __IHTMLCurrentStyle_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLCurrentStyle;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLCurrentStyle : public IDispatch {
  public:
    virtual HRESULT WINAPI get_position(BSTR *p) = 0;
    virtual HRESULT WINAPI get_styleFloat(BSTR *p) = 0;
    virtual HRESULT WINAPI get_color(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_backgroundColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_fontFamily(BSTR *p) = 0;
    virtual HRESULT WINAPI get_fontStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI get_fontVariant(BSTR *p) = 0;
    virtual HRESULT WINAPI get_fontWeight(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_fontSize(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_backgroundImage(BSTR *p) = 0;
    virtual HRESULT WINAPI get_backgroundPositionX(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_backgroundPositionY(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_backgroundRepeat(BSTR *p) = 0;
    virtual HRESULT WINAPI get_borderLeftColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_borderTopColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_borderRightColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_borderBottomColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_borderTopStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI get_borderRightStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI get_borderBottomStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI get_borderLeftStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI get_borderTopWidth(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_borderRightWidth(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_borderBottomWidth(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_borderLeftWidth(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_left(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_top(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_width(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_height(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_paddingLeft(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_paddingTop(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_paddingRight(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_paddingBottom(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_textAlign(BSTR *p) = 0;
    virtual HRESULT WINAPI get_textDecoration(BSTR *p) = 0;
    virtual HRESULT WINAPI get_display(BSTR *p) = 0;
    virtual HRESULT WINAPI get_visibility(BSTR *p) = 0;
    virtual HRESULT WINAPI get_zIndex(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_letterSpacing(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_lineHeight(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_textIndent(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_verticalAlign(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_backgroundAttachment(BSTR *p) = 0;
    virtual HRESULT WINAPI get_marginTop(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_marginRight(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_marginBottom(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_marginLeft(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_clear(BSTR *p) = 0;
    virtual HRESULT WINAPI get_listStyleType(BSTR *p) = 0;
    virtual HRESULT WINAPI get_listStylePosition(BSTR *p) = 0;
    virtual HRESULT WINAPI get_listStyleImage(BSTR *p) = 0;
    virtual HRESULT WINAPI get_clipTop(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_clipRight(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_clipBottom(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_clipLeft(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_overflow(BSTR *p) = 0;
    virtual HRESULT WINAPI get_pageBreakBefore(BSTR *p) = 0;
    virtual HRESULT WINAPI get_pageBreakAfter(BSTR *p) = 0;
    virtual HRESULT WINAPI get_cursor(BSTR *p) = 0;
    virtual HRESULT WINAPI get_tableLayout(BSTR *p) = 0;
    virtual HRESULT WINAPI get_borderCollapse(BSTR *p) = 0;
    virtual HRESULT WINAPI get_direction(BSTR *p) = 0;
    virtual HRESULT WINAPI get_behavior(BSTR *p) = 0;
    virtual HRESULT WINAPI getAttribute(BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) = 0;
    virtual HRESULT WINAPI get_unicodeBidi(BSTR *p) = 0;
    virtual HRESULT WINAPI get_right(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_bottom(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_imeMode(BSTR *p) = 0;
    virtual HRESULT WINAPI get_rubyAlign(BSTR *p) = 0;
    virtual HRESULT WINAPI get_rubyPosition(BSTR *p) = 0;
    virtual HRESULT WINAPI get_rubyOverhang(BSTR *p) = 0;
    virtual HRESULT WINAPI get_textAutospace(BSTR *p) = 0;
    virtual HRESULT WINAPI get_lineBreak(BSTR *p) = 0;
    virtual HRESULT WINAPI get_wordBreak(BSTR *p) = 0;
    virtual HRESULT WINAPI get_textJustify(BSTR *p) = 0;
    virtual HRESULT WINAPI get_textJustifyTrim(BSTR *p) = 0;
    virtual HRESULT WINAPI get_textKashida(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_blockDirection(BSTR *p) = 0;
    virtual HRESULT WINAPI get_layoutGridChar(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_layoutGridLine(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_layoutGridMode(BSTR *p) = 0;
    virtual HRESULT WINAPI get_layoutGridType(BSTR *p) = 0;
    virtual HRESULT WINAPI get_borderStyle(BSTR *p) = 0;
    virtual HRESULT WINAPI get_borderColor(BSTR *p) = 0;
    virtual HRESULT WINAPI get_borderWidth(BSTR *p) = 0;
    virtual HRESULT WINAPI get_padding(BSTR *p) = 0;
    virtual HRESULT WINAPI get_margin(BSTR *p) = 0;
    virtual HRESULT WINAPI get_accelerator(BSTR *p) = 0;
    virtual HRESULT WINAPI get_overflowX(BSTR *p) = 0;
    virtual HRESULT WINAPI get_overflowY(BSTR *p) = 0;
    virtual HRESULT WINAPI get_textTransform(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLCurrentStyleVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLCurrentStyle *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLCurrentStyle *This);
      ULONG (WINAPI *Release)(IHTMLCurrentStyle *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLCurrentStyle *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLCurrentStyle *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLCurrentStyle *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLCurrentStyle *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_position)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_styleFloat)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_color)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_backgroundColor)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_fontFamily)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_fontStyle)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_fontVariant)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_fontWeight)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_fontSize)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_backgroundImage)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_backgroundPositionX)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_backgroundPositionY)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_backgroundRepeat)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_borderLeftColor)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_borderTopColor)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_borderRightColor)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_borderBottomColor)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_borderTopStyle)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_borderRightStyle)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_borderBottomStyle)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_borderLeftStyle)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_borderTopWidth)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_borderRightWidth)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_borderBottomWidth)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_borderLeftWidth)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_left)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_top)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_width)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_height)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_paddingLeft)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_paddingTop)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_paddingRight)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_paddingBottom)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_textAlign)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_textDecoration)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_display)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_visibility)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_zIndex)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_letterSpacing)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_lineHeight)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_textIndent)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_verticalAlign)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_backgroundAttachment)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_marginTop)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_marginRight)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_marginBottom)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_marginLeft)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_clear)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_listStyleType)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_listStylePosition)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_listStyleImage)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_clipTop)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_clipRight)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_clipBottom)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_clipLeft)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_overflow)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_pageBreakBefore)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_pageBreakAfter)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_cursor)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_tableLayout)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_borderCollapse)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_direction)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_behavior)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *getAttribute)(IHTMLCurrentStyle *This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue);
      HRESULT (WINAPI *get_unicodeBidi)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_right)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_bottom)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_imeMode)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_rubyAlign)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_rubyPosition)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_rubyOverhang)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_textAutospace)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_lineBreak)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_wordBreak)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_textJustify)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_textJustifyTrim)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_textKashida)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_blockDirection)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_layoutGridChar)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_layoutGridLine)(IHTMLCurrentStyle *This,VARIANT *p);
      HRESULT (WINAPI *get_layoutGridMode)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_layoutGridType)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_borderStyle)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_borderColor)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_borderWidth)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_padding)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_margin)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_accelerator)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_overflowX)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_overflowY)(IHTMLCurrentStyle *This,BSTR *p);
      HRESULT (WINAPI *get_textTransform)(IHTMLCurrentStyle *This,BSTR *p);
    END_INTERFACE
  } IHTMLCurrentStyleVtbl;
  interface IHTMLCurrentStyle {
    CONST_VTBL struct IHTMLCurrentStyleVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLCurrentStyle_get_position_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_position_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_styleFloat_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_styleFloat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_color_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_color_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_backgroundColor_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_backgroundColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_fontFamily_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_fontFamily_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_fontStyle_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_fontStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_fontVariant_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_fontVariant_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_fontWeight_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_fontWeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_fontSize_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_fontSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_backgroundImage_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_backgroundImage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_backgroundPositionX_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_backgroundPositionX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_backgroundPositionY_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_backgroundPositionY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_backgroundRepeat_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_backgroundRepeat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderLeftColor_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderLeftColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderTopColor_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderTopColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderRightColor_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderRightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderBottomColor_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderBottomColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderTopStyle_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderTopStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderRightStyle_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderRightStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderBottomStyle_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderBottomStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderLeftStyle_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderLeftStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderTopWidth_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderTopWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderRightWidth_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderRightWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderBottomWidth_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderBottomWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderLeftWidth_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderLeftWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_left_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_left_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_top_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_top_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_width_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_height_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_paddingLeft_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_paddingLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_paddingTop_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_paddingTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_paddingRight_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_paddingRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_paddingBottom_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_paddingBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_textAlign_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_textAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_textDecoration_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_textDecoration_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_display_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_display_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_visibility_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_visibility_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_zIndex_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_zIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_letterSpacing_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_letterSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_lineHeight_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_lineHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_textIndent_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_textIndent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_verticalAlign_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_verticalAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_backgroundAttachment_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_backgroundAttachment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_marginTop_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_marginTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_marginRight_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_marginRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_marginBottom_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_marginBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_marginLeft_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_marginLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_clear_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_clear_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_listStyleType_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_listStyleType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_listStylePosition_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_listStylePosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_listStyleImage_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_listStyleImage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_clipTop_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_clipTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_clipRight_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_clipRight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_clipBottom_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_clipBottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_clipLeft_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_clipLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_overflow_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_overflow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_pageBreakBefore_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_pageBreakBefore_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_pageBreakAfter_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_pageBreakAfter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_cursor_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_cursor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_tableLayout_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_tableLayout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderCollapse_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderCollapse_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_direction_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_direction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_behavior_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_behavior_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_getAttribute_Proxy(IHTMLCurrentStyle *This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue);
  void __RPC_STUB IHTMLCurrentStyle_getAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_unicodeBidi_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_unicodeBidi_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_right_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_right_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_bottom_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_bottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_imeMode_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_imeMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_rubyAlign_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_rubyAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_rubyPosition_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_rubyPosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_rubyOverhang_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_rubyOverhang_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_textAutospace_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_textAutospace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_lineBreak_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_lineBreak_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_wordBreak_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_wordBreak_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_textJustify_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_textJustify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_textJustifyTrim_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_textJustifyTrim_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_textKashida_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_textKashida_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_blockDirection_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_blockDirection_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_layoutGridChar_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_layoutGridChar_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_layoutGridLine_Proxy(IHTMLCurrentStyle *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle_get_layoutGridLine_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_layoutGridMode_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_layoutGridMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_layoutGridType_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_layoutGridType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderStyle_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderColor_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_borderWidth_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_borderWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_padding_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_padding_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_margin_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_margin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_accelerator_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_accelerator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_overflowX_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_overflowX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_overflowY_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_overflowY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle_get_textTransform_Proxy(IHTMLCurrentStyle *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle_get_textTransform_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLCurrentStyle2_INTERFACE_DEFINED__
#define __IHTMLCurrentStyle2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLCurrentStyle2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLCurrentStyle2 : public IDispatch {
  public:
    virtual HRESULT WINAPI get_layoutFlow(BSTR *p) = 0;
    virtual HRESULT WINAPI get_wordWrap(BSTR *p) = 0;
    virtual HRESULT WINAPI get_textUnderlinePosition(BSTR *p) = 0;
    virtual HRESULT WINAPI get_hasLayout(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_scrollbarBaseColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_scrollbarFaceColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_scrollbar3dLightColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_scrollbarShadowColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_scrollbarHighlightColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_scrollbarDarkShadowColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_scrollbarArrowColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_scrollbarTrackColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_writingMode(BSTR *p) = 0;
    virtual HRESULT WINAPI get_zoom(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_filter(BSTR *p) = 0;
    virtual HRESULT WINAPI get_textAlignLast(BSTR *p) = 0;
    virtual HRESULT WINAPI get_textKashidaSpace(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_isBlock(VARIANT_BOOL *p) = 0;
  };
#else
  typedef struct IHTMLCurrentStyle2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLCurrentStyle2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLCurrentStyle2 *This);
      ULONG (WINAPI *Release)(IHTMLCurrentStyle2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLCurrentStyle2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLCurrentStyle2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLCurrentStyle2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLCurrentStyle2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_layoutFlow)(IHTMLCurrentStyle2 *This,BSTR *p);
      HRESULT (WINAPI *get_wordWrap)(IHTMLCurrentStyle2 *This,BSTR *p);
      HRESULT (WINAPI *get_textUnderlinePosition)(IHTMLCurrentStyle2 *This,BSTR *p);
      HRESULT (WINAPI *get_hasLayout)(IHTMLCurrentStyle2 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_scrollbarBaseColor)(IHTMLCurrentStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *get_scrollbarFaceColor)(IHTMLCurrentStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *get_scrollbar3dLightColor)(IHTMLCurrentStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *get_scrollbarShadowColor)(IHTMLCurrentStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *get_scrollbarHighlightColor)(IHTMLCurrentStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *get_scrollbarDarkShadowColor)(IHTMLCurrentStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *get_scrollbarArrowColor)(IHTMLCurrentStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *get_scrollbarTrackColor)(IHTMLCurrentStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *get_writingMode)(IHTMLCurrentStyle2 *This,BSTR *p);
      HRESULT (WINAPI *get_zoom)(IHTMLCurrentStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *get_filter)(IHTMLCurrentStyle2 *This,BSTR *p);
      HRESULT (WINAPI *get_textAlignLast)(IHTMLCurrentStyle2 *This,BSTR *p);
      HRESULT (WINAPI *get_textKashidaSpace)(IHTMLCurrentStyle2 *This,VARIANT *p);
      HRESULT (WINAPI *get_isBlock)(IHTMLCurrentStyle2 *This,VARIANT_BOOL *p);
    END_INTERFACE
  } IHTMLCurrentStyle2Vtbl;
  interface IHTMLCurrentStyle2 {
    CONST_VTBL struct IHTMLCurrentStyle2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLCurrentStyle2_get_layoutFlow_Proxy(IHTMLCurrentStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_layoutFlow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_wordWrap_Proxy(IHTMLCurrentStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_wordWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_textUnderlinePosition_Proxy(IHTMLCurrentStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_textUnderlinePosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_hasLayout_Proxy(IHTMLCurrentStyle2 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_hasLayout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_scrollbarBaseColor_Proxy(IHTMLCurrentStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_scrollbarBaseColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_scrollbarFaceColor_Proxy(IHTMLCurrentStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_scrollbarFaceColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_scrollbar3dLightColor_Proxy(IHTMLCurrentStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_scrollbar3dLightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_scrollbarShadowColor_Proxy(IHTMLCurrentStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_scrollbarShadowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_scrollbarHighlightColor_Proxy(IHTMLCurrentStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_scrollbarHighlightColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_scrollbarDarkShadowColor_Proxy(IHTMLCurrentStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_scrollbarDarkShadowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_scrollbarArrowColor_Proxy(IHTMLCurrentStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_scrollbarArrowColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_scrollbarTrackColor_Proxy(IHTMLCurrentStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_scrollbarTrackColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_writingMode_Proxy(IHTMLCurrentStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_writingMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_zoom_Proxy(IHTMLCurrentStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_zoom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_filter_Proxy(IHTMLCurrentStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_filter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_textAlignLast_Proxy(IHTMLCurrentStyle2 *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_textAlignLast_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_textKashidaSpace_Proxy(IHTMLCurrentStyle2 *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_textKashidaSpace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle2_get_isBlock_Proxy(IHTMLCurrentStyle2 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLCurrentStyle2_get_isBlock_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLCurrentStyle3_INTERFACE_DEFINED__
#define __IHTMLCurrentStyle3_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLCurrentStyle3;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLCurrentStyle3 : public IDispatch {
  public:
    virtual HRESULT WINAPI get_textOverflow(BSTR *p) = 0;
    virtual HRESULT WINAPI get_minHeight(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_wordSpacing(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_whiteSpace(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLCurrentStyle3Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLCurrentStyle3 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLCurrentStyle3 *This);
      ULONG (WINAPI *Release)(IHTMLCurrentStyle3 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLCurrentStyle3 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLCurrentStyle3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLCurrentStyle3 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLCurrentStyle3 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_textOverflow)(IHTMLCurrentStyle3 *This,BSTR *p);
      HRESULT (WINAPI *get_minHeight)(IHTMLCurrentStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *get_wordSpacing)(IHTMLCurrentStyle3 *This,VARIANT *p);
      HRESULT (WINAPI *get_whiteSpace)(IHTMLCurrentStyle3 *This,BSTR *p);
    END_INTERFACE
  } IHTMLCurrentStyle3Vtbl;
  interface IHTMLCurrentStyle3 {
    CONST_VTBL struct IHTMLCurrentStyle3Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLCurrentStyle3_get_textOverflow_Proxy(IHTMLCurrentStyle3 *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle3_get_textOverflow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle3_get_minHeight_Proxy(IHTMLCurrentStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle3_get_minHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle3_get_wordSpacing_Proxy(IHTMLCurrentStyle3 *This,VARIANT *p);
  void __RPC_STUB IHTMLCurrentStyle3_get_wordSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLCurrentStyle3_get_whiteSpace_Proxy(IHTMLCurrentStyle3 *This,BSTR *p);
  void __RPC_STUB IHTMLCurrentStyle3_get_whiteSpace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLCurrentStyle_DISPINTERFACE_DEFINED__
#define __DispHTMLCurrentStyle_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLCurrentStyle;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLCurrentStyle : public IDispatch {
  };
#else
  typedef struct DispHTMLCurrentStyleVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLCurrentStyle *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLCurrentStyle *This);
      ULONG (WINAPI *Release)(DispHTMLCurrentStyle *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLCurrentStyle *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLCurrentStyle *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLCurrentStyle *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLCurrentStyleVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLCurrentStyle;
#ifdef __cplusplus
  class HTMLCurrentStyle;
#endif

#ifndef __IHTMLElement_INTERFACE_DEFINED__
#define __IHTMLElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLElement : public IDispatch {
  public:
    virtual HRESULT WINAPI setAttribute(BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags = 1) = 0;
    virtual HRESULT WINAPI getAttribute(BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) = 0;
    virtual HRESULT WINAPI removeAttribute(BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess) = 0;
    virtual HRESULT WINAPI put_className(BSTR v) = 0;
    virtual HRESULT WINAPI get_className(BSTR *p) = 0;
    virtual HRESULT WINAPI put_id(BSTR v) = 0;
    virtual HRESULT WINAPI get_id(BSTR *p) = 0;
    virtual HRESULT WINAPI get_tagName(BSTR *p) = 0;
    virtual HRESULT WINAPI get_parentElement(IHTMLElement **p) = 0;
    virtual HRESULT WINAPI get_style(IHTMLStyle **p) = 0;
    virtual HRESULT WINAPI put_onhelp(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onhelp(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onclick(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onclick(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_ondblclick(VARIANT v) = 0;
    virtual HRESULT WINAPI get_ondblclick(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onkeydown(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onkeydown(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onkeyup(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onkeyup(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onkeypress(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onkeypress(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onmouseout(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmouseout(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onmouseover(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmouseover(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onmousemove(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmousemove(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onmousedown(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmousedown(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onmouseup(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmouseup(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_document(IDispatch **p) = 0;
    virtual HRESULT WINAPI put_title(BSTR v) = 0;
    virtual HRESULT WINAPI get_title(BSTR *p) = 0;
    virtual HRESULT WINAPI put_language(BSTR v) = 0;
    virtual HRESULT WINAPI get_language(BSTR *p) = 0;
    virtual HRESULT WINAPI put_onselectstart(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onselectstart(VARIANT *p) = 0;
    virtual HRESULT WINAPI scrollIntoView(VARIANT varargStart) = 0;
    virtual HRESULT WINAPI contains(IHTMLElement *pChild,VARIANT_BOOL *pfResult) = 0;
    virtual HRESULT WINAPI get_sourceIndex(long *p) = 0;
    virtual HRESULT WINAPI get_recordNumber(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_lang(BSTR v) = 0;
    virtual HRESULT WINAPI get_lang(BSTR *p) = 0;
    virtual HRESULT WINAPI get_offsetLeft(long *p) = 0;
    virtual HRESULT WINAPI get_offsetTop(long *p) = 0;
    virtual HRESULT WINAPI get_offsetWidth(long *p) = 0;
    virtual HRESULT WINAPI get_offsetHeight(long *p) = 0;
    virtual HRESULT WINAPI get_offsetParent(IHTMLElement **p) = 0;
    virtual HRESULT WINAPI put_innerHTML(BSTR v) = 0;
    virtual HRESULT WINAPI get_innerHTML(BSTR *p) = 0;
    virtual HRESULT WINAPI put_innerText(BSTR v) = 0;
    virtual HRESULT WINAPI get_innerText(BSTR *p) = 0;
    virtual HRESULT WINAPI put_outerHTML(BSTR v) = 0;
    virtual HRESULT WINAPI get_outerHTML(BSTR *p) = 0;
    virtual HRESULT WINAPI put_outerText(BSTR v) = 0;
    virtual HRESULT WINAPI get_outerText(BSTR *p) = 0;
    virtual HRESULT WINAPI insertAdjacentHTML(BSTR where,BSTR html) = 0;
    virtual HRESULT WINAPI insertAdjacentText(BSTR where,BSTR text) = 0;
    virtual HRESULT WINAPI get_parentTextEdit(IHTMLElement **p) = 0;
    virtual HRESULT WINAPI get_isTextEdit(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI click(void) = 0;
    virtual HRESULT WINAPI get_filters(IHTMLFiltersCollection **p) = 0;
    virtual HRESULT WINAPI put_ondragstart(VARIANT v) = 0;
    virtual HRESULT WINAPI get_ondragstart(VARIANT *p) = 0;
    virtual HRESULT WINAPI toString(BSTR *String) = 0;
    virtual HRESULT WINAPI put_onbeforeupdate(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onbeforeupdate(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onafterupdate(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onafterupdate(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onerrorupdate(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onerrorupdate(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onrowexit(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onrowexit(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onrowenter(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onrowenter(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_ondatasetchanged(VARIANT v) = 0;
    virtual HRESULT WINAPI get_ondatasetchanged(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_ondataavailable(VARIANT v) = 0;
    virtual HRESULT WINAPI get_ondataavailable(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_ondatasetcomplete(VARIANT v) = 0;
    virtual HRESULT WINAPI get_ondatasetcomplete(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onfilterchange(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onfilterchange(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_children(IDispatch **p) = 0;
    virtual HRESULT WINAPI get_all(IDispatch **p) = 0;
  };
#else
  typedef struct IHTMLElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLElement *This);
      ULONG (WINAPI *Release)(IHTMLElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *setAttribute)(IHTMLElement *This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags);
      HRESULT (WINAPI *getAttribute)(IHTMLElement *This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue);
      HRESULT (WINAPI *removeAttribute)(IHTMLElement *This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess);
      HRESULT (WINAPI *put_className)(IHTMLElement *This,BSTR v);
      HRESULT (WINAPI *get_className)(IHTMLElement *This,BSTR *p);
      HRESULT (WINAPI *put_id)(IHTMLElement *This,BSTR v);
      HRESULT (WINAPI *get_id)(IHTMLElement *This,BSTR *p);
      HRESULT (WINAPI *get_tagName)(IHTMLElement *This,BSTR *p);
      HRESULT (WINAPI *get_parentElement)(IHTMLElement *This,IHTMLElement **p);
      HRESULT (WINAPI *get_style)(IHTMLElement *This,IHTMLStyle **p);
      HRESULT (WINAPI *put_onhelp)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onhelp)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onclick)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onclick)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_ondblclick)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_ondblclick)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onkeydown)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onkeydown)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onkeyup)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onkeyup)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onkeypress)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onkeypress)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onmouseout)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onmouseout)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onmouseover)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onmouseover)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onmousemove)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onmousemove)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onmousedown)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onmousedown)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onmouseup)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onmouseup)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *get_document)(IHTMLElement *This,IDispatch **p);
      HRESULT (WINAPI *put_title)(IHTMLElement *This,BSTR v);
      HRESULT (WINAPI *get_title)(IHTMLElement *This,BSTR *p);
      HRESULT (WINAPI *put_language)(IHTMLElement *This,BSTR v);
      HRESULT (WINAPI *get_language)(IHTMLElement *This,BSTR *p);
      HRESULT (WINAPI *put_onselectstart)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onselectstart)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *scrollIntoView)(IHTMLElement *This,VARIANT varargStart);
      HRESULT (WINAPI *contains)(IHTMLElement *This,IHTMLElement *pChild,VARIANT_BOOL *pfResult);
      HRESULT (WINAPI *get_sourceIndex)(IHTMLElement *This,long *p);
      HRESULT (WINAPI *get_recordNumber)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_lang)(IHTMLElement *This,BSTR v);
      HRESULT (WINAPI *get_lang)(IHTMLElement *This,BSTR *p);
      HRESULT (WINAPI *get_offsetLeft)(IHTMLElement *This,long *p);
      HRESULT (WINAPI *get_offsetTop)(IHTMLElement *This,long *p);
      HRESULT (WINAPI *get_offsetWidth)(IHTMLElement *This,long *p);
      HRESULT (WINAPI *get_offsetHeight)(IHTMLElement *This,long *p);
      HRESULT (WINAPI *get_offsetParent)(IHTMLElement *This,IHTMLElement **p);
      HRESULT (WINAPI *put_innerHTML)(IHTMLElement *This,BSTR v);
      HRESULT (WINAPI *get_innerHTML)(IHTMLElement *This,BSTR *p);
      HRESULT (WINAPI *put_innerText)(IHTMLElement *This,BSTR v);
      HRESULT (WINAPI *get_innerText)(IHTMLElement *This,BSTR *p);
      HRESULT (WINAPI *put_outerHTML)(IHTMLElement *This,BSTR v);
      HRESULT (WINAPI *get_outerHTML)(IHTMLElement *This,BSTR *p);
      HRESULT (WINAPI *put_outerText)(IHTMLElement *This,BSTR v);
      HRESULT (WINAPI *get_outerText)(IHTMLElement *This,BSTR *p);
      HRESULT (WINAPI *insertAdjacentHTML)(IHTMLElement *This,BSTR where,BSTR html);
      HRESULT (WINAPI *insertAdjacentText)(IHTMLElement *This,BSTR where,BSTR text);
      HRESULT (WINAPI *get_parentTextEdit)(IHTMLElement *This,IHTMLElement **p);
      HRESULT (WINAPI *get_isTextEdit)(IHTMLElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *click)(IHTMLElement *This);
      HRESULT (WINAPI *get_filters)(IHTMLElement *This,IHTMLFiltersCollection **p);
      HRESULT (WINAPI *put_ondragstart)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_ondragstart)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *toString)(IHTMLElement *This,BSTR *String);
      HRESULT (WINAPI *put_onbeforeupdate)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onbeforeupdate)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onafterupdate)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onafterupdate)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onerrorupdate)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onerrorupdate)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onrowexit)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onrowexit)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onrowenter)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onrowenter)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_ondatasetchanged)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_ondatasetchanged)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_ondataavailable)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_ondataavailable)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_ondatasetcomplete)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_ondatasetcomplete)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onfilterchange)(IHTMLElement *This,VARIANT v);
      HRESULT (WINAPI *get_onfilterchange)(IHTMLElement *This,VARIANT *p);
      HRESULT (WINAPI *get_children)(IHTMLElement *This,IDispatch **p);
      HRESULT (WINAPI *get_all)(IHTMLElement *This,IDispatch **p);
    END_INTERFACE
  } IHTMLElementVtbl;
  interface IHTMLElement {
    CONST_VTBL struct IHTMLElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLElement_setAttribute_Proxy(IHTMLElement *This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags);
  void __RPC_STUB IHTMLElement_setAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_getAttribute_Proxy(IHTMLElement *This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue);
  void __RPC_STUB IHTMLElement_getAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_removeAttribute_Proxy(IHTMLElement *This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess);
  void __RPC_STUB IHTMLElement_removeAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_className_Proxy(IHTMLElement *This,BSTR v);
  void __RPC_STUB IHTMLElement_put_className_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_className_Proxy(IHTMLElement *This,BSTR *p);
  void __RPC_STUB IHTMLElement_get_className_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_id_Proxy(IHTMLElement *This,BSTR v);
  void __RPC_STUB IHTMLElement_put_id_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_id_Proxy(IHTMLElement *This,BSTR *p);
  void __RPC_STUB IHTMLElement_get_id_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_tagName_Proxy(IHTMLElement *This,BSTR *p);
  void __RPC_STUB IHTMLElement_get_tagName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_parentElement_Proxy(IHTMLElement *This,IHTMLElement **p);
  void __RPC_STUB IHTMLElement_get_parentElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_style_Proxy(IHTMLElement *This,IHTMLStyle **p);
  void __RPC_STUB IHTMLElement_get_style_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onhelp_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onhelp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onhelp_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onhelp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onclick_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onclick_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onclick_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onclick_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_ondblclick_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_ondblclick_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_ondblclick_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_ondblclick_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onkeydown_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onkeydown_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onkeydown_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onkeydown_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onkeyup_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onkeyup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onkeyup_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onkeyup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onkeypress_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onkeypress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onkeypress_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onkeypress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onmouseout_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onmouseout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onmouseout_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onmouseout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onmouseover_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onmouseover_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onmouseover_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onmouseover_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onmousemove_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onmousemove_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onmousemove_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onmousemove_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onmousedown_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onmousedown_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onmousedown_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onmousedown_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onmouseup_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onmouseup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onmouseup_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onmouseup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_document_Proxy(IHTMLElement *This,IDispatch **p);
  void __RPC_STUB IHTMLElement_get_document_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_title_Proxy(IHTMLElement *This,BSTR v);
  void __RPC_STUB IHTMLElement_put_title_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_title_Proxy(IHTMLElement *This,BSTR *p);
  void __RPC_STUB IHTMLElement_get_title_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_language_Proxy(IHTMLElement *This,BSTR v);
  void __RPC_STUB IHTMLElement_put_language_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_language_Proxy(IHTMLElement *This,BSTR *p);
  void __RPC_STUB IHTMLElement_get_language_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onselectstart_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onselectstart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onselectstart_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onselectstart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_scrollIntoView_Proxy(IHTMLElement *This,VARIANT varargStart);
  void __RPC_STUB IHTMLElement_scrollIntoView_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_contains_Proxy(IHTMLElement *This,IHTMLElement *pChild,VARIANT_BOOL *pfResult);
  void __RPC_STUB IHTMLElement_contains_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_sourceIndex_Proxy(IHTMLElement *This,long *p);
  void __RPC_STUB IHTMLElement_get_sourceIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_recordNumber_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_recordNumber_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_lang_Proxy(IHTMLElement *This,BSTR v);
  void __RPC_STUB IHTMLElement_put_lang_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_lang_Proxy(IHTMLElement *This,BSTR *p);
  void __RPC_STUB IHTMLElement_get_lang_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_offsetLeft_Proxy(IHTMLElement *This,long *p);
  void __RPC_STUB IHTMLElement_get_offsetLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_offsetTop_Proxy(IHTMLElement *This,long *p);
  void __RPC_STUB IHTMLElement_get_offsetTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_offsetWidth_Proxy(IHTMLElement *This,long *p);
  void __RPC_STUB IHTMLElement_get_offsetWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_offsetHeight_Proxy(IHTMLElement *This,long *p);
  void __RPC_STUB IHTMLElement_get_offsetHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_offsetParent_Proxy(IHTMLElement *This,IHTMLElement **p);
  void __RPC_STUB IHTMLElement_get_offsetParent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_innerHTML_Proxy(IHTMLElement *This,BSTR v);
  void __RPC_STUB IHTMLElement_put_innerHTML_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_innerHTML_Proxy(IHTMLElement *This,BSTR *p);
  void __RPC_STUB IHTMLElement_get_innerHTML_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_innerText_Proxy(IHTMLElement *This,BSTR v);
  void __RPC_STUB IHTMLElement_put_innerText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_innerText_Proxy(IHTMLElement *This,BSTR *p);
  void __RPC_STUB IHTMLElement_get_innerText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_outerHTML_Proxy(IHTMLElement *This,BSTR v);
  void __RPC_STUB IHTMLElement_put_outerHTML_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_outerHTML_Proxy(IHTMLElement *This,BSTR *p);
  void __RPC_STUB IHTMLElement_get_outerHTML_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_outerText_Proxy(IHTMLElement *This,BSTR v);
  void __RPC_STUB IHTMLElement_put_outerText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_outerText_Proxy(IHTMLElement *This,BSTR *p);
  void __RPC_STUB IHTMLElement_get_outerText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_insertAdjacentHTML_Proxy(IHTMLElement *This,BSTR where,BSTR html);
  void __RPC_STUB IHTMLElement_insertAdjacentHTML_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_insertAdjacentText_Proxy(IHTMLElement *This,BSTR where,BSTR text);
  void __RPC_STUB IHTMLElement_insertAdjacentText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_parentTextEdit_Proxy(IHTMLElement *This,IHTMLElement **p);
  void __RPC_STUB IHTMLElement_get_parentTextEdit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_isTextEdit_Proxy(IHTMLElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElement_get_isTextEdit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_click_Proxy(IHTMLElement *This);
  void __RPC_STUB IHTMLElement_click_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_filters_Proxy(IHTMLElement *This,IHTMLFiltersCollection **p);
  void __RPC_STUB IHTMLElement_get_filters_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_ondragstart_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_ondragstart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_ondragstart_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_ondragstart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_toString_Proxy(IHTMLElement *This,BSTR *String);
  void __RPC_STUB IHTMLElement_toString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onbeforeupdate_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onbeforeupdate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onbeforeupdate_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onbeforeupdate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onafterupdate_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onafterupdate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onafterupdate_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onafterupdate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onerrorupdate_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onerrorupdate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onerrorupdate_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onerrorupdate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onrowexit_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onrowexit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onrowexit_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onrowexit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onrowenter_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onrowenter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onrowenter_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onrowenter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_ondatasetchanged_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_ondatasetchanged_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_ondatasetchanged_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_ondatasetchanged_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_ondataavailable_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_ondataavailable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_ondataavailable_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_ondataavailable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_ondatasetcomplete_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_ondatasetcomplete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_ondatasetcomplete_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_ondatasetcomplete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_put_onfilterchange_Proxy(IHTMLElement *This,VARIANT v);
  void __RPC_STUB IHTMLElement_put_onfilterchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_onfilterchange_Proxy(IHTMLElement *This,VARIANT *p);
  void __RPC_STUB IHTMLElement_get_onfilterchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_children_Proxy(IHTMLElement *This,IDispatch **p);
  void __RPC_STUB IHTMLElement_get_children_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement_get_all_Proxy(IHTMLElement *This,IDispatch **p);
  void __RPC_STUB IHTMLElement_get_all_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLRect_INTERFACE_DEFINED__
#define __IHTMLRect_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLRect;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLRect : public IDispatch {
  public:
    virtual HRESULT WINAPI put_left(long v) = 0;
    virtual HRESULT WINAPI get_left(long *p) = 0;
    virtual HRESULT WINAPI put_top(long v) = 0;
    virtual HRESULT WINAPI get_top(long *p) = 0;
    virtual HRESULT WINAPI put_right(long v) = 0;
    virtual HRESULT WINAPI get_right(long *p) = 0;
    virtual HRESULT WINAPI put_bottom(long v) = 0;
    virtual HRESULT WINAPI get_bottom(long *p) = 0;
  };
#else
  typedef struct IHTMLRectVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLRect *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLRect *This);
      ULONG (WINAPI *Release)(IHTMLRect *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLRect *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLRect *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLRect *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLRect *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_left)(IHTMLRect *This,long v);
      HRESULT (WINAPI *get_left)(IHTMLRect *This,long *p);
      HRESULT (WINAPI *put_top)(IHTMLRect *This,long v);
      HRESULT (WINAPI *get_top)(IHTMLRect *This,long *p);
      HRESULT (WINAPI *put_right)(IHTMLRect *This,long v);
      HRESULT (WINAPI *get_right)(IHTMLRect *This,long *p);
      HRESULT (WINAPI *put_bottom)(IHTMLRect *This,long v);
      HRESULT (WINAPI *get_bottom)(IHTMLRect *This,long *p);
    END_INTERFACE
  } IHTMLRectVtbl;
  interface IHTMLRect {
    CONST_VTBL struct IHTMLRectVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLRect_put_left_Proxy(IHTMLRect *This,long v);
  void __RPC_STUB IHTMLRect_put_left_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRect_get_left_Proxy(IHTMLRect *This,long *p);
  void __RPC_STUB IHTMLRect_get_left_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRect_put_top_Proxy(IHTMLRect *This,long v);
  void __RPC_STUB IHTMLRect_put_top_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRect_get_top_Proxy(IHTMLRect *This,long *p);
  void __RPC_STUB IHTMLRect_get_top_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRect_put_right_Proxy(IHTMLRect *This,long v);
  void __RPC_STUB IHTMLRect_put_right_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRect_get_right_Proxy(IHTMLRect *This,long *p);
  void __RPC_STUB IHTMLRect_get_right_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRect_put_bottom_Proxy(IHTMLRect *This,long v);
  void __RPC_STUB IHTMLRect_put_bottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRect_get_bottom_Proxy(IHTMLRect *This,long *p);
  void __RPC_STUB IHTMLRect_get_bottom_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLRectCollection_INTERFACE_DEFINED__
#define __IHTMLRectCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLRectCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLRectCollection : public IDispatch {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;
    virtual HRESULT WINAPI item(VARIANT *pvarIndex,VARIANT *pvarResult) = 0;
  };
#else
  typedef struct IHTMLRectCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLRectCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLRectCollection *This);
      ULONG (WINAPI *Release)(IHTMLRectCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLRectCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLRectCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLRectCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLRectCollection *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_length)(IHTMLRectCollection *This,long *p);
      HRESULT (WINAPI *get__newEnum)(IHTMLRectCollection *This,IUnknown **p);
      HRESULT (WINAPI *item)(IHTMLRectCollection *This,VARIANT *pvarIndex,VARIANT *pvarResult);
    END_INTERFACE
  } IHTMLRectCollectionVtbl;
  interface IHTMLRectCollection {
    CONST_VTBL struct IHTMLRectCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLRectCollection_get_length_Proxy(IHTMLRectCollection *This,long *p);
  void __RPC_STUB IHTMLRectCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRectCollection_get__newEnum_Proxy(IHTMLRectCollection *This,IUnknown **p);
  void __RPC_STUB IHTMLRectCollection_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLRectCollection_item_Proxy(IHTMLRectCollection *This,VARIANT *pvarIndex,VARIANT *pvarResult);
  void __RPC_STUB IHTMLRectCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDOMNode_INTERFACE_DEFINED__
#define __IHTMLDOMNode_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDOMNode;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDOMNode : public IDispatch {
  public:
    virtual HRESULT WINAPI get_nodeType(long *p) = 0;
    virtual HRESULT WINAPI get_parentNode(IHTMLDOMNode **p) = 0;
    virtual HRESULT WINAPI hasChildNodes(VARIANT_BOOL *fChildren) = 0;
    virtual HRESULT WINAPI get_childNodes(IDispatch **p) = 0;
    virtual HRESULT WINAPI get_attributes(IDispatch **p) = 0;
    virtual HRESULT WINAPI insertBefore(IHTMLDOMNode *newChild,VARIANT refChild,IHTMLDOMNode **node) = 0;
    virtual HRESULT WINAPI removeChild(IHTMLDOMNode *oldChild,IHTMLDOMNode **node) = 0;
    virtual HRESULT WINAPI replaceChild(IHTMLDOMNode *newChild,IHTMLDOMNode *oldChild,IHTMLDOMNode **node) = 0;
    virtual HRESULT WINAPI cloneNode(VARIANT_BOOL fDeep,IHTMLDOMNode **clonedNode) = 0;
    virtual HRESULT WINAPI removeNode(VARIANT_BOOL fDeep,IHTMLDOMNode **removed) = 0;
    virtual HRESULT WINAPI swapNode(IHTMLDOMNode *otherNode,IHTMLDOMNode **swappedNode) = 0;
    virtual HRESULT WINAPI replaceNode(IHTMLDOMNode *replacement,IHTMLDOMNode **replaced) = 0;
    virtual HRESULT WINAPI appendChild(IHTMLDOMNode *newChild,IHTMLDOMNode **node) = 0;
    virtual HRESULT WINAPI get_nodeName(BSTR *p) = 0;
    virtual HRESULT WINAPI put_nodeValue(VARIANT v) = 0;
    virtual HRESULT WINAPI get_nodeValue(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_firstChild(IHTMLDOMNode **p) = 0;
    virtual HRESULT WINAPI get_lastChild(IHTMLDOMNode **p) = 0;
    virtual HRESULT WINAPI get_previousSibling(IHTMLDOMNode **p) = 0;
    virtual HRESULT WINAPI get_nextSibling(IHTMLDOMNode **p) = 0;
  };
#else
  typedef struct IHTMLDOMNodeVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDOMNode *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDOMNode *This);
      ULONG (WINAPI *Release)(IHTMLDOMNode *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDOMNode *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDOMNode *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDOMNode *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDOMNode *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_nodeType)(IHTMLDOMNode *This,long *p);
      HRESULT (WINAPI *get_parentNode)(IHTMLDOMNode *This,IHTMLDOMNode **p);
      HRESULT (WINAPI *hasChildNodes)(IHTMLDOMNode *This,VARIANT_BOOL *fChildren);
      HRESULT (WINAPI *get_childNodes)(IHTMLDOMNode *This,IDispatch **p);
      HRESULT (WINAPI *get_attributes)(IHTMLDOMNode *This,IDispatch **p);
      HRESULT (WINAPI *insertBefore)(IHTMLDOMNode *This,IHTMLDOMNode *newChild,VARIANT refChild,IHTMLDOMNode **node);
      HRESULT (WINAPI *removeChild)(IHTMLDOMNode *This,IHTMLDOMNode *oldChild,IHTMLDOMNode **node);
      HRESULT (WINAPI *replaceChild)(IHTMLDOMNode *This,IHTMLDOMNode *newChild,IHTMLDOMNode *oldChild,IHTMLDOMNode **node);
      HRESULT (WINAPI *cloneNode)(IHTMLDOMNode *This,VARIANT_BOOL fDeep,IHTMLDOMNode **clonedNode);
      HRESULT (WINAPI *removeNode)(IHTMLDOMNode *This,VARIANT_BOOL fDeep,IHTMLDOMNode **removed);
      HRESULT (WINAPI *swapNode)(IHTMLDOMNode *This,IHTMLDOMNode *otherNode,IHTMLDOMNode **swappedNode);
      HRESULT (WINAPI *replaceNode)(IHTMLDOMNode *This,IHTMLDOMNode *replacement,IHTMLDOMNode **replaced);
      HRESULT (WINAPI *appendChild)(IHTMLDOMNode *This,IHTMLDOMNode *newChild,IHTMLDOMNode **node);
      HRESULT (WINAPI *get_nodeName)(IHTMLDOMNode *This,BSTR *p);
      HRESULT (WINAPI *put_nodeValue)(IHTMLDOMNode *This,VARIANT v);
      HRESULT (WINAPI *get_nodeValue)(IHTMLDOMNode *This,VARIANT *p);
      HRESULT (WINAPI *get_firstChild)(IHTMLDOMNode *This,IHTMLDOMNode **p);
      HRESULT (WINAPI *get_lastChild)(IHTMLDOMNode *This,IHTMLDOMNode **p);
      HRESULT (WINAPI *get_previousSibling)(IHTMLDOMNode *This,IHTMLDOMNode **p);
      HRESULT (WINAPI *get_nextSibling)(IHTMLDOMNode *This,IHTMLDOMNode **p);
    END_INTERFACE
  } IHTMLDOMNodeVtbl;
  interface IHTMLDOMNode {
    CONST_VTBL struct IHTMLDOMNodeVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLDOMNode_get_nodeType_Proxy(IHTMLDOMNode *This,long *p);
  void __RPC_STUB IHTMLDOMNode_get_nodeType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_get_parentNode_Proxy(IHTMLDOMNode *This,IHTMLDOMNode **p);
  void __RPC_STUB IHTMLDOMNode_get_parentNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_hasChildNodes_Proxy(IHTMLDOMNode *This,VARIANT_BOOL *fChildren);
  void __RPC_STUB IHTMLDOMNode_hasChildNodes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_get_childNodes_Proxy(IHTMLDOMNode *This,IDispatch **p);
  void __RPC_STUB IHTMLDOMNode_get_childNodes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_get_attributes_Proxy(IHTMLDOMNode *This,IDispatch **p);
  void __RPC_STUB IHTMLDOMNode_get_attributes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_insertBefore_Proxy(IHTMLDOMNode *This,IHTMLDOMNode *newChild,VARIANT refChild,IHTMLDOMNode **node);
  void __RPC_STUB IHTMLDOMNode_insertBefore_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_removeChild_Proxy(IHTMLDOMNode *This,IHTMLDOMNode *oldChild,IHTMLDOMNode **node);
  void __RPC_STUB IHTMLDOMNode_removeChild_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_replaceChild_Proxy(IHTMLDOMNode *This,IHTMLDOMNode *newChild,IHTMLDOMNode *oldChild,IHTMLDOMNode **node);
  void __RPC_STUB IHTMLDOMNode_replaceChild_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_cloneNode_Proxy(IHTMLDOMNode *This,VARIANT_BOOL fDeep,IHTMLDOMNode **clonedNode);
  void __RPC_STUB IHTMLDOMNode_cloneNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_removeNode_Proxy(IHTMLDOMNode *This,VARIANT_BOOL fDeep,IHTMLDOMNode **removed);
  void __RPC_STUB IHTMLDOMNode_removeNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_swapNode_Proxy(IHTMLDOMNode *This,IHTMLDOMNode *otherNode,IHTMLDOMNode **swappedNode);
  void __RPC_STUB IHTMLDOMNode_swapNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_replaceNode_Proxy(IHTMLDOMNode *This,IHTMLDOMNode *replacement,IHTMLDOMNode **replaced);
  void __RPC_STUB IHTMLDOMNode_replaceNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_appendChild_Proxy(IHTMLDOMNode *This,IHTMLDOMNode *newChild,IHTMLDOMNode **node);
  void __RPC_STUB IHTMLDOMNode_appendChild_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_get_nodeName_Proxy(IHTMLDOMNode *This,BSTR *p);
  void __RPC_STUB IHTMLDOMNode_get_nodeName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_put_nodeValue_Proxy(IHTMLDOMNode *This,VARIANT v);
  void __RPC_STUB IHTMLDOMNode_put_nodeValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_get_nodeValue_Proxy(IHTMLDOMNode *This,VARIANT *p);
  void __RPC_STUB IHTMLDOMNode_get_nodeValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_get_firstChild_Proxy(IHTMLDOMNode *This,IHTMLDOMNode **p);
  void __RPC_STUB IHTMLDOMNode_get_firstChild_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_get_lastChild_Proxy(IHTMLDOMNode *This,IHTMLDOMNode **p);
  void __RPC_STUB IHTMLDOMNode_get_lastChild_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_get_previousSibling_Proxy(IHTMLDOMNode *This,IHTMLDOMNode **p);
  void __RPC_STUB IHTMLDOMNode_get_previousSibling_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMNode_get_nextSibling_Proxy(IHTMLDOMNode *This,IHTMLDOMNode **p);
  void __RPC_STUB IHTMLDOMNode_get_nextSibling_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDOMNode2_INTERFACE_DEFINED__
#define __IHTMLDOMNode2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDOMNode2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDOMNode2 : public IDispatch {
  public:
    virtual HRESULT WINAPI get_ownerDocument(IDispatch **p) = 0;
  };
#else
  typedef struct IHTMLDOMNode2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDOMNode2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDOMNode2 *This);
      ULONG (WINAPI *Release)(IHTMLDOMNode2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDOMNode2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDOMNode2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDOMNode2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDOMNode2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_ownerDocument)(IHTMLDOMNode2 *This,IDispatch **p);
    END_INTERFACE
  } IHTMLDOMNode2Vtbl;
  interface IHTMLDOMNode2 {
    CONST_VTBL struct IHTMLDOMNode2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLDOMNode2_get_ownerDocument(This,p) (This)->lpVtbl->get_ownerDocument(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLDOMNode2_get_ownerDocument_Proxy(IHTMLDOMNode2 *This,IDispatch **p);
  void __RPC_STUB IHTMLDOMNode2_get_ownerDocument_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDOMAttribute_INTERFACE_DEFINED__
#define __IHTMLDOMAttribute_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDOMAttribute;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDOMAttribute : public IDispatch {
  public:
    virtual HRESULT WINAPI get_nodeName(BSTR *p) = 0;
    virtual HRESULT WINAPI put_nodeValue(VARIANT v) = 0;
    virtual HRESULT WINAPI get_nodeValue(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_specified(VARIANT_BOOL *p) = 0;
  };
#else
  typedef struct IHTMLDOMAttributeVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDOMAttribute *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDOMAttribute *This);
      ULONG (WINAPI *Release)(IHTMLDOMAttribute *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDOMAttribute *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDOMAttribute *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDOMAttribute *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDOMAttribute *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_nodeName)(IHTMLDOMAttribute *This,BSTR *p);
      HRESULT (WINAPI *put_nodeValue)(IHTMLDOMAttribute *This,VARIANT v);
      HRESULT (WINAPI *get_nodeValue)(IHTMLDOMAttribute *This,VARIANT *p);
      HRESULT (WINAPI *get_specified)(IHTMLDOMAttribute *This,VARIANT_BOOL *p);
    END_INTERFACE
  } IHTMLDOMAttributeVtbl;
  interface IHTMLDOMAttribute {
    CONST_VTBL struct IHTMLDOMAttributeVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLDOMAttribute_get_nodeName_Proxy(IHTMLDOMAttribute *This,BSTR *p);
  void __RPC_STUB IHTMLDOMAttribute_get_nodeName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute_put_nodeValue_Proxy(IHTMLDOMAttribute *This,VARIANT v);
  void __RPC_STUB IHTMLDOMAttribute_put_nodeValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute_get_nodeValue_Proxy(IHTMLDOMAttribute *This,VARIANT *p);
  void __RPC_STUB IHTMLDOMAttribute_get_nodeValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute_get_specified_Proxy(IHTMLDOMAttribute *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLDOMAttribute_get_specified_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDOMAttribute2_INTERFACE_DEFINED__
#define __IHTMLDOMAttribute2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDOMAttribute2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDOMAttribute2 : public IDispatch {
  public:
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_value(BSTR v) = 0;
    virtual HRESULT WINAPI get_value(BSTR *p) = 0;
    virtual HRESULT WINAPI get_expando(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_nodeType(long *p) = 0;
    virtual HRESULT WINAPI get_parentNode(IHTMLDOMNode **p) = 0;
    virtual HRESULT WINAPI get_childNodes(IDispatch **p) = 0;
    virtual HRESULT WINAPI get_firstChild(IHTMLDOMNode **p) = 0;
    virtual HRESULT WINAPI get_lastChild(IHTMLDOMNode **p) = 0;
    virtual HRESULT WINAPI get_previousSibling(IHTMLDOMNode **p) = 0;
    virtual HRESULT WINAPI get_nextSibling(IHTMLDOMNode **p) = 0;
    virtual HRESULT WINAPI get_attributes(IDispatch **p) = 0;
    virtual HRESULT WINAPI get_ownerDocument(IDispatch **p) = 0;
    virtual HRESULT WINAPI insertBefore(IHTMLDOMNode *newChild,VARIANT refChild,IHTMLDOMNode **node) = 0;
    virtual HRESULT WINAPI replaceChild(IHTMLDOMNode *newChild,IHTMLDOMNode *oldChild,IHTMLDOMNode **node) = 0;
    virtual HRESULT WINAPI removeChild(IHTMLDOMNode *oldChild,IHTMLDOMNode **node) = 0;
    virtual HRESULT WINAPI appendChild(IHTMLDOMNode *newChild,IHTMLDOMNode **node) = 0;
    virtual HRESULT WINAPI hasChildNodes(VARIANT_BOOL *fChildren) = 0;
    virtual HRESULT WINAPI cloneNode(VARIANT_BOOL fDeep,IHTMLDOMAttribute **clonedNode) = 0;
  };
#else
  typedef struct IHTMLDOMAttribute2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDOMAttribute2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDOMAttribute2 *This);
      ULONG (WINAPI *Release)(IHTMLDOMAttribute2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDOMAttribute2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDOMAttribute2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDOMAttribute2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDOMAttribute2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_name)(IHTMLDOMAttribute2 *This,BSTR *p);
      HRESULT (WINAPI *put_value)(IHTMLDOMAttribute2 *This,BSTR v);
      HRESULT (WINAPI *get_value)(IHTMLDOMAttribute2 *This,BSTR *p);
      HRESULT (WINAPI *get_expando)(IHTMLDOMAttribute2 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_nodeType)(IHTMLDOMAttribute2 *This,long *p);
      HRESULT (WINAPI *get_parentNode)(IHTMLDOMAttribute2 *This,IHTMLDOMNode **p);
      HRESULT (WINAPI *get_childNodes)(IHTMLDOMAttribute2 *This,IDispatch **p);
      HRESULT (WINAPI *get_firstChild)(IHTMLDOMAttribute2 *This,IHTMLDOMNode **p);
      HRESULT (WINAPI *get_lastChild)(IHTMLDOMAttribute2 *This,IHTMLDOMNode **p);
      HRESULT (WINAPI *get_previousSibling)(IHTMLDOMAttribute2 *This,IHTMLDOMNode **p);
      HRESULT (WINAPI *get_nextSibling)(IHTMLDOMAttribute2 *This,IHTMLDOMNode **p);
      HRESULT (WINAPI *get_attributes)(IHTMLDOMAttribute2 *This,IDispatch **p);
      HRESULT (WINAPI *get_ownerDocument)(IHTMLDOMAttribute2 *This,IDispatch **p);
      HRESULT (WINAPI *insertBefore)(IHTMLDOMAttribute2 *This,IHTMLDOMNode *newChild,VARIANT refChild,IHTMLDOMNode **node);
      HRESULT (WINAPI *replaceChild)(IHTMLDOMAttribute2 *This,IHTMLDOMNode *newChild,IHTMLDOMNode *oldChild,IHTMLDOMNode **node);
      HRESULT (WINAPI *removeChild)(IHTMLDOMAttribute2 *This,IHTMLDOMNode *oldChild,IHTMLDOMNode **node);
      HRESULT (WINAPI *appendChild)(IHTMLDOMAttribute2 *This,IHTMLDOMNode *newChild,IHTMLDOMNode **node);
      HRESULT (WINAPI *hasChildNodes)(IHTMLDOMAttribute2 *This,VARIANT_BOOL *fChildren);
      HRESULT (WINAPI *cloneNode)(IHTMLDOMAttribute2 *This,VARIANT_BOOL fDeep,IHTMLDOMAttribute **clonedNode);
    END_INTERFACE
  } IHTMLDOMAttribute2Vtbl;
  interface IHTMLDOMAttribute2 {
    CONST_VTBL struct IHTMLDOMAttribute2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLDOMAttribute2_get_name_Proxy(IHTMLDOMAttribute2 *This,BSTR *p);
  void __RPC_STUB IHTMLDOMAttribute2_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_put_value_Proxy(IHTMLDOMAttribute2 *This,BSTR v);
  void __RPC_STUB IHTMLDOMAttribute2_put_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_get_value_Proxy(IHTMLDOMAttribute2 *This,BSTR *p);
  void __RPC_STUB IHTMLDOMAttribute2_get_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_get_expando_Proxy(IHTMLDOMAttribute2 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLDOMAttribute2_get_expando_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_get_nodeType_Proxy(IHTMLDOMAttribute2 *This,long *p);
  void __RPC_STUB IHTMLDOMAttribute2_get_nodeType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_get_parentNode_Proxy(IHTMLDOMAttribute2 *This,IHTMLDOMNode **p);
  void __RPC_STUB IHTMLDOMAttribute2_get_parentNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_get_childNodes_Proxy(IHTMLDOMAttribute2 *This,IDispatch **p);
  void __RPC_STUB IHTMLDOMAttribute2_get_childNodes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_get_firstChild_Proxy(IHTMLDOMAttribute2 *This,IHTMLDOMNode **p);
  void __RPC_STUB IHTMLDOMAttribute2_get_firstChild_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_get_lastChild_Proxy(IHTMLDOMAttribute2 *This,IHTMLDOMNode **p);
  void __RPC_STUB IHTMLDOMAttribute2_get_lastChild_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_get_previousSibling_Proxy(IHTMLDOMAttribute2 *This,IHTMLDOMNode **p);
  void __RPC_STUB IHTMLDOMAttribute2_get_previousSibling_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_get_nextSibling_Proxy(IHTMLDOMAttribute2 *This,IHTMLDOMNode **p);
  void __RPC_STUB IHTMLDOMAttribute2_get_nextSibling_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_get_attributes_Proxy(IHTMLDOMAttribute2 *This,IDispatch **p);
  void __RPC_STUB IHTMLDOMAttribute2_get_attributes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_get_ownerDocument_Proxy(IHTMLDOMAttribute2 *This,IDispatch **p);
  void __RPC_STUB IHTMLDOMAttribute2_get_ownerDocument_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_insertBefore_Proxy(IHTMLDOMAttribute2 *This,IHTMLDOMNode *newChild,VARIANT refChild,IHTMLDOMNode **node);
  void __RPC_STUB IHTMLDOMAttribute2_insertBefore_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_replaceChild_Proxy(IHTMLDOMAttribute2 *This,IHTMLDOMNode *newChild,IHTMLDOMNode *oldChild,IHTMLDOMNode **node);
  void __RPC_STUB IHTMLDOMAttribute2_replaceChild_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_removeChild_Proxy(IHTMLDOMAttribute2 *This,IHTMLDOMNode *oldChild,IHTMLDOMNode **node);
  void __RPC_STUB IHTMLDOMAttribute2_removeChild_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_appendChild_Proxy(IHTMLDOMAttribute2 *This,IHTMLDOMNode *newChild,IHTMLDOMNode **node);
  void __RPC_STUB IHTMLDOMAttribute2_appendChild_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_hasChildNodes_Proxy(IHTMLDOMAttribute2 *This,VARIANT_BOOL *fChildren);
  void __RPC_STUB IHTMLDOMAttribute2_hasChildNodes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMAttribute2_cloneNode_Proxy(IHTMLDOMAttribute2 *This,VARIANT_BOOL fDeep,IHTMLDOMAttribute **clonedNode);
  void __RPC_STUB IHTMLDOMAttribute2_cloneNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDOMTextNode_INTERFACE_DEFINED__
#define __IHTMLDOMTextNode_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDOMTextNode;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDOMTextNode : public IDispatch {
  public:
    virtual HRESULT WINAPI put_data(BSTR v) = 0;
    virtual HRESULT WINAPI get_data(BSTR *p) = 0;
    virtual HRESULT WINAPI toString(BSTR *String) = 0;
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI splitText(long offset,IHTMLDOMNode **pRetNode) = 0;
  };
#else
  typedef struct IHTMLDOMTextNodeVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDOMTextNode *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDOMTextNode *This);
      ULONG (WINAPI *Release)(IHTMLDOMTextNode *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDOMTextNode *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDOMTextNode *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDOMTextNode *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDOMTextNode *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_data)(IHTMLDOMTextNode *This,BSTR v);
      HRESULT (WINAPI *get_data)(IHTMLDOMTextNode *This,BSTR *p);
      HRESULT (WINAPI *toString)(IHTMLDOMTextNode *This,BSTR *String);
      HRESULT (WINAPI *get_length)(IHTMLDOMTextNode *This,long *p);
      HRESULT (WINAPI *splitText)(IHTMLDOMTextNode *This,long offset,IHTMLDOMNode **pRetNode);
    END_INTERFACE
  } IHTMLDOMTextNodeVtbl;
  interface IHTMLDOMTextNode {
    CONST_VTBL struct IHTMLDOMTextNodeVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLDOMTextNode_put_data_Proxy(IHTMLDOMTextNode *This,BSTR v);
  void __RPC_STUB IHTMLDOMTextNode_put_data_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMTextNode_get_data_Proxy(IHTMLDOMTextNode *This,BSTR *p);
  void __RPC_STUB IHTMLDOMTextNode_get_data_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMTextNode_toString_Proxy(IHTMLDOMTextNode *This,BSTR *String);
  void __RPC_STUB IHTMLDOMTextNode_toString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMTextNode_get_length_Proxy(IHTMLDOMTextNode *This,long *p);
  void __RPC_STUB IHTMLDOMTextNode_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMTextNode_splitText_Proxy(IHTMLDOMTextNode *This,long offset,IHTMLDOMNode **pRetNode);
  void __RPC_STUB IHTMLDOMTextNode_splitText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDOMTextNode2_INTERFACE_DEFINED__
#define __IHTMLDOMTextNode2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDOMTextNode2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDOMTextNode2 : public IDispatch {
  public:
    virtual HRESULT WINAPI substringData(long offset,long Count,BSTR *pbstrsubString) = 0;
    virtual HRESULT WINAPI appendData(BSTR bstrstring) = 0;
    virtual HRESULT WINAPI insertData(long offset,BSTR bstrstring) = 0;
    virtual HRESULT WINAPI deleteData(long offset,long Count) = 0;
    virtual HRESULT WINAPI replaceData(long offset,long Count,BSTR bstrstring) = 0;
  };
#else
  typedef struct IHTMLDOMTextNode2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDOMTextNode2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDOMTextNode2 *This);
      ULONG (WINAPI *Release)(IHTMLDOMTextNode2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDOMTextNode2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDOMTextNode2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDOMTextNode2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDOMTextNode2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *substringData)(IHTMLDOMTextNode2 *This,long offset,long Count,BSTR *pbstrsubString);
      HRESULT (WINAPI *appendData)(IHTMLDOMTextNode2 *This,BSTR bstrstring);
      HRESULT (WINAPI *insertData)(IHTMLDOMTextNode2 *This,long offset,BSTR bstrstring);
      HRESULT (WINAPI *deleteData)(IHTMLDOMTextNode2 *This,long offset,long Count);
      HRESULT (WINAPI *replaceData)(IHTMLDOMTextNode2 *This,long offset,long Count,BSTR bstrstring);
    END_INTERFACE
  } IHTMLDOMTextNode2Vtbl;
  interface IHTMLDOMTextNode2 {
    CONST_VTBL struct IHTMLDOMTextNode2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLDOMTextNode2_substringData_Proxy(IHTMLDOMTextNode2 *This,long offset,long Count,BSTR *pbstrsubString);
  void __RPC_STUB IHTMLDOMTextNode2_substringData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMTextNode2_appendData_Proxy(IHTMLDOMTextNode2 *This,BSTR bstrstring);
  void __RPC_STUB IHTMLDOMTextNode2_appendData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMTextNode2_insertData_Proxy(IHTMLDOMTextNode2 *This,long offset,BSTR bstrstring);
  void __RPC_STUB IHTMLDOMTextNode2_insertData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMTextNode2_deleteData_Proxy(IHTMLDOMTextNode2 *This,long offset,long Count);
  void __RPC_STUB IHTMLDOMTextNode2_deleteData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMTextNode2_replaceData_Proxy(IHTMLDOMTextNode2 *This,long offset,long Count,BSTR bstrstring);
  void __RPC_STUB IHTMLDOMTextNode2_replaceData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDOMImplementation_INTERFACE_DEFINED__
#define __IHTMLDOMImplementation_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDOMImplementation;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDOMImplementation : public IDispatch {
  public:
    virtual HRESULT WINAPI hasFeature(BSTR bstrfeature,VARIANT version,VARIANT_BOOL *pfHasFeature) = 0;
  };
#else
  typedef struct IHTMLDOMImplementationVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDOMImplementation *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDOMImplementation *This);
      ULONG (WINAPI *Release)(IHTMLDOMImplementation *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDOMImplementation *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDOMImplementation *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDOMImplementation *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDOMImplementation *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *hasFeature)(IHTMLDOMImplementation *This,BSTR bstrfeature,VARIANT version,VARIANT_BOOL *pfHasFeature);
    END_INTERFACE
  } IHTMLDOMImplementationVtbl;
  interface IHTMLDOMImplementation {
    CONST_VTBL struct IHTMLDOMImplementationVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLDOMImplementation_hasFeature(This,bstrfeature,version,pfHasFeature) (This)->lpVtbl->hasFeature(This,bstrfeature,version,pfHasFeature)
#endif
#endif
  HRESULT WINAPI IHTMLDOMImplementation_hasFeature_Proxy(IHTMLDOMImplementation *This,BSTR bstrfeature,VARIANT version,VARIANT_BOOL *pfHasFeature);
  void __RPC_STUB IHTMLDOMImplementation_hasFeature_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLDOMAttribute_DISPINTERFACE_DEFINED__
#define __DispHTMLDOMAttribute_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLDOMAttribute;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLDOMAttribute : public IDispatch {
  };
#else
  typedef struct DispHTMLDOMAttributeVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLDOMAttribute *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLDOMAttribute *This);
      ULONG (WINAPI *Release)(DispHTMLDOMAttribute *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLDOMAttribute *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLDOMAttribute *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLDOMAttribute *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLDOMAttributeVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLDOMAttribute;
#ifdef __cplusplus
  class HTMLDOMAttribute;
#endif

#ifndef __DispHTMLDOMTextNode_DISPINTERFACE_DEFINED__
#define __DispHTMLDOMTextNode_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLDOMTextNode;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLDOMTextNode : public IDispatch {
  };
#else
  typedef struct DispHTMLDOMTextNodeVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLDOMTextNode *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLDOMTextNode *This);
      ULONG (WINAPI *Release)(DispHTMLDOMTextNode *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLDOMTextNode *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLDOMTextNode *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLDOMTextNode *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLDOMTextNodeVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLDOMTextNode;
#ifdef __cplusplus
  class HTMLDOMTextNode;
#endif

#ifndef __DispHTMLDOMImplementation_DISPINTERFACE_DEFINED__
#define __DispHTMLDOMImplementation_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLDOMImplementation;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLDOMImplementation : public IDispatch {
  };
#else
  typedef struct DispHTMLDOMImplementationVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLDOMImplementation *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLDOMImplementation *This);
      ULONG (WINAPI *Release)(DispHTMLDOMImplementation *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLDOMImplementation *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLDOMImplementation *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLDOMImplementation *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLDOMImplementationVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLDOMImplementation;
#ifdef __cplusplus
  class HTMLDOMImplementation;
#endif

#ifndef __IHTMLAttributeCollection_INTERFACE_DEFINED__
#define __IHTMLAttributeCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLAttributeCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLAttributeCollection : public IDispatch {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;
    virtual HRESULT WINAPI item(VARIANT *name,IDispatch **pdisp) = 0;
  };
#else
  typedef struct IHTMLAttributeCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLAttributeCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLAttributeCollection *This);
      ULONG (WINAPI *Release)(IHTMLAttributeCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLAttributeCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLAttributeCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLAttributeCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLAttributeCollection *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_length)(IHTMLAttributeCollection *This,long *p);
      HRESULT (WINAPI *get__newEnum)(IHTMLAttributeCollection *This,IUnknown **p);
      HRESULT (WINAPI *item)(IHTMLAttributeCollection *This,VARIANT *name,IDispatch **pdisp);
    END_INTERFACE
  } IHTMLAttributeCollectionVtbl;
  interface IHTMLAttributeCollection {
    CONST_VTBL struct IHTMLAttributeCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLAttributeCollection_get_length_Proxy(IHTMLAttributeCollection *This,long *p);
  void __RPC_STUB IHTMLAttributeCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAttributeCollection_get__newEnum_Proxy(IHTMLAttributeCollection *This,IUnknown **p);
  void __RPC_STUB IHTMLAttributeCollection_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAttributeCollection_item_Proxy(IHTMLAttributeCollection *This,VARIANT *name,IDispatch **pdisp);
  void __RPC_STUB IHTMLAttributeCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLAttributeCollection2_INTERFACE_DEFINED__
#define __IHTMLAttributeCollection2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLAttributeCollection2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLAttributeCollection2 : public IDispatch {
  public:
    virtual HRESULT WINAPI getNamedItem(BSTR bstrName,IHTMLDOMAttribute **newretNode) = 0;
    virtual HRESULT WINAPI setNamedItem(IHTMLDOMAttribute *ppNode,IHTMLDOMAttribute **newretNode) = 0;
    virtual HRESULT WINAPI removeNamedItem(BSTR bstrName,IHTMLDOMAttribute **newretNode) = 0;
  };
#else
  typedef struct IHTMLAttributeCollection2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLAttributeCollection2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLAttributeCollection2 *This);
      ULONG (WINAPI *Release)(IHTMLAttributeCollection2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLAttributeCollection2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLAttributeCollection2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLAttributeCollection2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLAttributeCollection2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *getNamedItem)(IHTMLAttributeCollection2 *This,BSTR bstrName,IHTMLDOMAttribute **newretNode);
      HRESULT (WINAPI *setNamedItem)(IHTMLAttributeCollection2 *This,IHTMLDOMAttribute *ppNode,IHTMLDOMAttribute **newretNode);
      HRESULT (WINAPI *removeNamedItem)(IHTMLAttributeCollection2 *This,BSTR bstrName,IHTMLDOMAttribute **newretNode);
    END_INTERFACE
  } IHTMLAttributeCollection2Vtbl;
  interface IHTMLAttributeCollection2 {
    CONST_VTBL struct IHTMLAttributeCollection2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLAttributeCollection2_getNamedItem_Proxy(IHTMLAttributeCollection2 *This,BSTR bstrName,IHTMLDOMAttribute **newretNode);
  void __RPC_STUB IHTMLAttributeCollection2_getNamedItem_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAttributeCollection2_setNamedItem_Proxy(IHTMLAttributeCollection2 *This,IHTMLDOMAttribute *ppNode,IHTMLDOMAttribute **newretNode);
  void __RPC_STUB IHTMLAttributeCollection2_setNamedItem_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAttributeCollection2_removeNamedItem_Proxy(IHTMLAttributeCollection2 *This,BSTR bstrName,IHTMLDOMAttribute **newretNode);
  void __RPC_STUB IHTMLAttributeCollection2_removeNamedItem_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDOMChildrenCollection_INTERFACE_DEFINED__
#define __IHTMLDOMChildrenCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDOMChildrenCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDOMChildrenCollection : public IDispatch {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;
    virtual HRESULT WINAPI item(long index,IDispatch **ppItem) = 0;
  };
#else
  typedef struct IHTMLDOMChildrenCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDOMChildrenCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDOMChildrenCollection *This);
      ULONG (WINAPI *Release)(IHTMLDOMChildrenCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDOMChildrenCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDOMChildrenCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDOMChildrenCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDOMChildrenCollection *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_length)(IHTMLDOMChildrenCollection *This,long *p);
      HRESULT (WINAPI *get__newEnum)(IHTMLDOMChildrenCollection *This,IUnknown **p);
      HRESULT (WINAPI *item)(IHTMLDOMChildrenCollection *This,long index,IDispatch **ppItem);
    END_INTERFACE
  } IHTMLDOMChildrenCollectionVtbl;
  interface IHTMLDOMChildrenCollection {
    CONST_VTBL struct IHTMLDOMChildrenCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLDOMChildrenCollection_get_length_Proxy(IHTMLDOMChildrenCollection *This,long *p);
  void __RPC_STUB IHTMLDOMChildrenCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMChildrenCollection_get__newEnum_Proxy(IHTMLDOMChildrenCollection *This,IUnknown **p);
  void __RPC_STUB IHTMLDOMChildrenCollection_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDOMChildrenCollection_item_Proxy(IHTMLDOMChildrenCollection *This,long index,IDispatch **ppItem);
  void __RPC_STUB IHTMLDOMChildrenCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLAttributeCollection_DISPINTERFACE_DEFINED__
#define __DispHTMLAttributeCollection_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLAttributeCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLAttributeCollection : public IDispatch {
  };
#else
  typedef struct DispHTMLAttributeCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLAttributeCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLAttributeCollection *This);
      ULONG (WINAPI *Release)(DispHTMLAttributeCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLAttributeCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLAttributeCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLAttributeCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLAttributeCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLAttributeCollection;
#ifdef __cplusplus
  class HTMLAttributeCollection;
#endif

#ifndef __DispDOMChildrenCollection_DISPINTERFACE_DEFINED__
#define __DispDOMChildrenCollection_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispDOMChildrenCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispDOMChildrenCollection : public IDispatch {
  };
#else
  typedef struct DispDOMChildrenCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispDOMChildrenCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispDOMChildrenCollection *This);
      ULONG (WINAPI *Release)(DispDOMChildrenCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispDOMChildrenCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispDOMChildrenCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispDOMChildrenCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispDOMChildrenCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_DOMChildrenCollection;
#ifdef __cplusplus
  class DOMChildrenCollection;
#endif

#ifndef __HTMLElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLElementEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLElementEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLElementEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLElementEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLElementEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLElementEvents2 *This);
      ULONG (WINAPI *Release)(HTMLElementEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLElementEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLElementEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLElementEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLElementEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLElementEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLElementEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLElementEvents : public IDispatch {
  };
#else
  typedef struct HTMLElementEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLElementEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLElementEvents *This);
      ULONG (WINAPI *Release)(HTMLElementEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLElementEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLElementEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLElementEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLElementEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __IHTMLElementCollection_INTERFACE_DEFINED__
#define __IHTMLElementCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLElementCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLElementCollection : public IDispatch {
  public:
    virtual HRESULT WINAPI toString(BSTR *String) = 0;
    virtual HRESULT WINAPI put_length(long v) = 0;
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;
    virtual HRESULT WINAPI item(VARIANT name,VARIANT index,IDispatch **pdisp) = 0;
    virtual HRESULT WINAPI tags(VARIANT tagName,IDispatch **pdisp) = 0;
  };
#else
  typedef struct IHTMLElementCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLElementCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLElementCollection *This);
      ULONG (WINAPI *Release)(IHTMLElementCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLElementCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLElementCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLElementCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLElementCollection *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *toString)(IHTMLElementCollection *This,BSTR *String);
      HRESULT (WINAPI *put_length)(IHTMLElementCollection *This,long v);
      HRESULT (WINAPI *get_length)(IHTMLElementCollection *This,long *p);
      HRESULT (WINAPI *get__newEnum)(IHTMLElementCollection *This,IUnknown **p);
      HRESULT (WINAPI *item)(IHTMLElementCollection *This,VARIANT name,VARIANT index,IDispatch **pdisp);
      HRESULT (WINAPI *tags)(IHTMLElementCollection *This,VARIANT tagName,IDispatch **pdisp);
    END_INTERFACE
  } IHTMLElementCollectionVtbl;
  interface IHTMLElementCollection {
    CONST_VTBL struct IHTMLElementCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLElementCollection_toString_Proxy(IHTMLElementCollection *This,BSTR *String);
  void __RPC_STUB IHTMLElementCollection_toString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementCollection_put_length_Proxy(IHTMLElementCollection *This,long v);
  void __RPC_STUB IHTMLElementCollection_put_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementCollection_get_length_Proxy(IHTMLElementCollection *This,long *p);
  void __RPC_STUB IHTMLElementCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementCollection_get__newEnum_Proxy(IHTMLElementCollection *This,IUnknown **p);
  void __RPC_STUB IHTMLElementCollection_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementCollection_item_Proxy(IHTMLElementCollection *This,VARIANT name,VARIANT index,IDispatch **pdisp);
  void __RPC_STUB IHTMLElementCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementCollection_tags_Proxy(IHTMLElementCollection *This,VARIANT tagName,IDispatch **pdisp);
  void __RPC_STUB IHTMLElementCollection_tags_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLElement2_INTERFACE_DEFINED__
#define __IHTMLElement2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLElement2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLElement2 : public IDispatch {
  public:
    virtual HRESULT WINAPI get_scopeName(BSTR *p) = 0;
    virtual HRESULT WINAPI setCapture(VARIANT_BOOL containerCapture = -1) = 0;
    virtual HRESULT WINAPI releaseCapture(void) = 0;
    virtual HRESULT WINAPI put_onlosecapture(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onlosecapture(VARIANT *p) = 0;
    virtual HRESULT WINAPI componentFromPoint(long x,long y,BSTR *component) = 0;
    virtual HRESULT WINAPI doScroll(VARIANT component) = 0;
    virtual HRESULT WINAPI put_onscroll(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onscroll(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_ondrag(VARIANT v) = 0;
    virtual HRESULT WINAPI get_ondrag(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_ondragend(VARIANT v) = 0;
    virtual HRESULT WINAPI get_ondragend(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_ondragenter(VARIANT v) = 0;
    virtual HRESULT WINAPI get_ondragenter(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_ondragover(VARIANT v) = 0;
    virtual HRESULT WINAPI get_ondragover(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_ondragleave(VARIANT v) = 0;
    virtual HRESULT WINAPI get_ondragleave(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_ondrop(VARIANT v) = 0;
    virtual HRESULT WINAPI get_ondrop(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onbeforecut(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onbeforecut(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_oncut(VARIANT v) = 0;
    virtual HRESULT WINAPI get_oncut(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onbeforecopy(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onbeforecopy(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_oncopy(VARIANT v) = 0;
    virtual HRESULT WINAPI get_oncopy(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onbeforepaste(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onbeforepaste(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onpaste(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onpaste(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_currentStyle(IHTMLCurrentStyle **p) = 0;
    virtual HRESULT WINAPI put_onpropertychange(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onpropertychange(VARIANT *p) = 0;
    virtual HRESULT WINAPI getClientRects(IHTMLRectCollection **pRectCol) = 0;
    virtual HRESULT WINAPI getBoundingClientRect(IHTMLRect **pRect) = 0;
    virtual HRESULT WINAPI setExpression(BSTR propname,BSTR expression,BSTR language = L"") = 0;
    virtual HRESULT WINAPI getExpression(BSTR propname,VARIANT *expression) = 0;
    virtual HRESULT WINAPI removeExpression(BSTR propname,VARIANT_BOOL *pfSuccess) = 0;
    virtual HRESULT WINAPI put_tabIndex(short v) = 0;
    virtual HRESULT WINAPI get_tabIndex(short *p) = 0;
    virtual HRESULT WINAPI focus(void) = 0;
    virtual HRESULT WINAPI put_accessKey(BSTR v) = 0;
    virtual HRESULT WINAPI get_accessKey(BSTR *p) = 0;
    virtual HRESULT WINAPI put_onblur(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onblur(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onfocus(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onfocus(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onresize(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onresize(VARIANT *p) = 0;
    virtual HRESULT WINAPI blur(void) = 0;
    virtual HRESULT WINAPI addFilter(IUnknown *pUnk) = 0;
    virtual HRESULT WINAPI removeFilter(IUnknown *pUnk) = 0;
    virtual HRESULT WINAPI get_clientHeight(long *p) = 0;
    virtual HRESULT WINAPI get_clientWidth(long *p) = 0;
    virtual HRESULT WINAPI get_clientTop(long *p) = 0;
    virtual HRESULT WINAPI get_clientLeft(long *p) = 0;
    virtual HRESULT WINAPI attachEvent(BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult) = 0;
    virtual HRESULT WINAPI detachEvent(BSTR event,IDispatch *pDisp) = 0;
    virtual HRESULT WINAPI get_readyState(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onreadystatechange(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onreadystatechange(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onrowsdelete(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onrowsdelete(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onrowsinserted(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onrowsinserted(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_oncellchange(VARIANT v) = 0;
    virtual HRESULT WINAPI get_oncellchange(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_dir(BSTR v) = 0;
    virtual HRESULT WINAPI get_dir(BSTR *p) = 0;
    virtual HRESULT WINAPI createControlRange(IDispatch **range) = 0;
    virtual HRESULT WINAPI get_scrollHeight(long *p) = 0;
    virtual HRESULT WINAPI get_scrollWidth(long *p) = 0;
    virtual HRESULT WINAPI put_scrollTop(long v) = 0;
    virtual HRESULT WINAPI get_scrollTop(long *p) = 0;
    virtual HRESULT WINAPI put_scrollLeft(long v) = 0;
    virtual HRESULT WINAPI get_scrollLeft(long *p) = 0;
    virtual HRESULT WINAPI clearAttributes(void) = 0;
    virtual HRESULT WINAPI mergeAttributes(IHTMLElement *mergeThis) = 0;
    virtual HRESULT WINAPI put_oncontextmenu(VARIANT v) = 0;
    virtual HRESULT WINAPI get_oncontextmenu(VARIANT *p) = 0;
    virtual HRESULT WINAPI insertAdjacentElement(BSTR where,IHTMLElement *insertedElement,IHTMLElement **inserted) = 0;
    virtual HRESULT WINAPI applyElement(IHTMLElement *apply,BSTR where,IHTMLElement **applied) = 0;
    virtual HRESULT WINAPI getAdjacentText(BSTR where,BSTR *text) = 0;
    virtual HRESULT WINAPI replaceAdjacentText(BSTR where,BSTR newText,BSTR *oldText) = 0;
    virtual HRESULT WINAPI get_canHaveChildren(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI addBehavior(BSTR bstrUrl,VARIANT *pvarFactory,long *pCookie) = 0;
    virtual HRESULT WINAPI removeBehavior(long cookie,VARIANT_BOOL *pfResult) = 0;
    virtual HRESULT WINAPI get_runtimeStyle(IHTMLStyle **p) = 0;
    virtual HRESULT WINAPI get_behaviorUrns(IDispatch **p) = 0;
    virtual HRESULT WINAPI put_tagUrn(BSTR v) = 0;
    virtual HRESULT WINAPI get_tagUrn(BSTR *p) = 0;
    virtual HRESULT WINAPI put_onbeforeeditfocus(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onbeforeeditfocus(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_readyStateValue(long *p) = 0;
    virtual HRESULT WINAPI getElementsByTagName(BSTR v,IHTMLElementCollection **pelColl) = 0;
  };
#else
  typedef struct IHTMLElement2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLElement2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLElement2 *This);
      ULONG (WINAPI *Release)(IHTMLElement2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLElement2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLElement2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLElement2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_scopeName)(IHTMLElement2 *This,BSTR *p);
      HRESULT (WINAPI *setCapture)(IHTMLElement2 *This,VARIANT_BOOL containerCapture);
      HRESULT (WINAPI *releaseCapture)(IHTMLElement2 *This);
      HRESULT (WINAPI *put_onlosecapture)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onlosecapture)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *componentFromPoint)(IHTMLElement2 *This,long x,long y,BSTR *component);
      HRESULT (WINAPI *doScroll)(IHTMLElement2 *This,VARIANT component);
      HRESULT (WINAPI *put_onscroll)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onscroll)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_ondrag)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_ondrag)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_ondragend)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_ondragend)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_ondragenter)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_ondragenter)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_ondragover)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_ondragover)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_ondragleave)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_ondragleave)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_ondrop)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_ondrop)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onbeforecut)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onbeforecut)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_oncut)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_oncut)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onbeforecopy)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onbeforecopy)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_oncopy)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_oncopy)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onbeforepaste)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onbeforepaste)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onpaste)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onpaste)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *get_currentStyle)(IHTMLElement2 *This,IHTMLCurrentStyle **p);
      HRESULT (WINAPI *put_onpropertychange)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onpropertychange)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *getClientRects)(IHTMLElement2 *This,IHTMLRectCollection **pRectCol);
      HRESULT (WINAPI *getBoundingClientRect)(IHTMLElement2 *This,IHTMLRect **pRect);
      HRESULT (WINAPI *setExpression)(IHTMLElement2 *This,BSTR propname,BSTR expression,BSTR language);
      HRESULT (WINAPI *getExpression)(IHTMLElement2 *This,BSTR propname,VARIANT *expression);
      HRESULT (WINAPI *removeExpression)(IHTMLElement2 *This,BSTR propname,VARIANT_BOOL *pfSuccess);
      HRESULT (WINAPI *put_tabIndex)(IHTMLElement2 *This,short v);
      HRESULT (WINAPI *get_tabIndex)(IHTMLElement2 *This,short *p);
      HRESULT (WINAPI *focus)(IHTMLElement2 *This);
      HRESULT (WINAPI *put_accessKey)(IHTMLElement2 *This,BSTR v);
      HRESULT (WINAPI *get_accessKey)(IHTMLElement2 *This,BSTR *p);
      HRESULT (WINAPI *put_onblur)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onblur)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onfocus)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onfocus)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onresize)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onresize)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *blur)(IHTMLElement2 *This);
      HRESULT (WINAPI *addFilter)(IHTMLElement2 *This,IUnknown *pUnk);
      HRESULT (WINAPI *removeFilter)(IHTMLElement2 *This,IUnknown *pUnk);
      HRESULT (WINAPI *get_clientHeight)(IHTMLElement2 *This,long *p);
      HRESULT (WINAPI *get_clientWidth)(IHTMLElement2 *This,long *p);
      HRESULT (WINAPI *get_clientTop)(IHTMLElement2 *This,long *p);
      HRESULT (WINAPI *get_clientLeft)(IHTMLElement2 *This,long *p);
      HRESULT (WINAPI *attachEvent)(IHTMLElement2 *This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult);
      HRESULT (WINAPI *detachEvent)(IHTMLElement2 *This,BSTR event,IDispatch *pDisp);
      HRESULT (WINAPI *get_readyState)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onreadystatechange)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onreadystatechange)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onrowsdelete)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onrowsdelete)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onrowsinserted)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onrowsinserted)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_oncellchange)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_oncellchange)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_dir)(IHTMLElement2 *This,BSTR v);
      HRESULT (WINAPI *get_dir)(IHTMLElement2 *This,BSTR *p);
      HRESULT (WINAPI *createControlRange)(IHTMLElement2 *This,IDispatch **range);
      HRESULT (WINAPI *get_scrollHeight)(IHTMLElement2 *This,long *p);
      HRESULT (WINAPI *get_scrollWidth)(IHTMLElement2 *This,long *p);
      HRESULT (WINAPI *put_scrollTop)(IHTMLElement2 *This,long v);
      HRESULT (WINAPI *get_scrollTop)(IHTMLElement2 *This,long *p);
      HRESULT (WINAPI *put_scrollLeft)(IHTMLElement2 *This,long v);
      HRESULT (WINAPI *get_scrollLeft)(IHTMLElement2 *This,long *p);
      HRESULT (WINAPI *clearAttributes)(IHTMLElement2 *This);
      HRESULT (WINAPI *mergeAttributes)(IHTMLElement2 *This,IHTMLElement *mergeThis);
      HRESULT (WINAPI *put_oncontextmenu)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_oncontextmenu)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *insertAdjacentElement)(IHTMLElement2 *This,BSTR where,IHTMLElement *insertedElement,IHTMLElement **inserted);
      HRESULT (WINAPI *applyElement)(IHTMLElement2 *This,IHTMLElement *apply,BSTR where,IHTMLElement **applied);
      HRESULT (WINAPI *getAdjacentText)(IHTMLElement2 *This,BSTR where,BSTR *text);
      HRESULT (WINAPI *replaceAdjacentText)(IHTMLElement2 *This,BSTR where,BSTR newText,BSTR *oldText);
      HRESULT (WINAPI *get_canHaveChildren)(IHTMLElement2 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *addBehavior)(IHTMLElement2 *This,BSTR bstrUrl,VARIANT *pvarFactory,long *pCookie);
      HRESULT (WINAPI *removeBehavior)(IHTMLElement2 *This,long cookie,VARIANT_BOOL *pfResult);
      HRESULT (WINAPI *get_runtimeStyle)(IHTMLElement2 *This,IHTMLStyle **p);
      HRESULT (WINAPI *get_behaviorUrns)(IHTMLElement2 *This,IDispatch **p);
      HRESULT (WINAPI *put_tagUrn)(IHTMLElement2 *This,BSTR v);
      HRESULT (WINAPI *get_tagUrn)(IHTMLElement2 *This,BSTR *p);
      HRESULT (WINAPI *put_onbeforeeditfocus)(IHTMLElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onbeforeeditfocus)(IHTMLElement2 *This,VARIANT *p);
      HRESULT (WINAPI *get_readyStateValue)(IHTMLElement2 *This,long *p);
      HRESULT (WINAPI *getElementsByTagName)(IHTMLElement2 *This,BSTR v,IHTMLElementCollection **pelColl);
    END_INTERFACE
  } IHTMLElement2Vtbl;
  interface IHTMLElement2 {
    CONST_VTBL struct IHTMLElement2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLElement2_get_scopeName_Proxy(IHTMLElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLElement2_get_scopeName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_setCapture_Proxy(IHTMLElement2 *This,VARIANT_BOOL containerCapture);
  void __RPC_STUB IHTMLElement2_setCapture_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_releaseCapture_Proxy(IHTMLElement2 *This);
  void __RPC_STUB IHTMLElement2_releaseCapture_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_onlosecapture_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_onlosecapture_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_onlosecapture_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_onlosecapture_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_componentFromPoint_Proxy(IHTMLElement2 *This,long x,long y,BSTR *component);
  void __RPC_STUB IHTMLElement2_componentFromPoint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_doScroll_Proxy(IHTMLElement2 *This,VARIANT component);
  void __RPC_STUB IHTMLElement2_doScroll_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_onscroll_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_onscroll_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_onscroll_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_onscroll_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_ondrag_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_ondrag_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_ondrag_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_ondrag_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_ondragend_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_ondragend_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_ondragend_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_ondragend_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_ondragenter_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_ondragenter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_ondragenter_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_ondragenter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_ondragover_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_ondragover_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_ondragover_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_ondragover_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_ondragleave_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_ondragleave_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_ondragleave_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_ondragleave_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_ondrop_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_ondrop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_ondrop_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_ondrop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_onbeforecut_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_onbeforecut_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_onbeforecut_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_onbeforecut_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_oncut_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_oncut_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_oncut_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_oncut_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_onbeforecopy_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_onbeforecopy_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_onbeforecopy_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_onbeforecopy_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_oncopy_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_oncopy_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_oncopy_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_oncopy_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_onbeforepaste_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_onbeforepaste_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_onbeforepaste_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_onbeforepaste_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_onpaste_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_onpaste_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_onpaste_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_onpaste_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_currentStyle_Proxy(IHTMLElement2 *This,IHTMLCurrentStyle **p);
  void __RPC_STUB IHTMLElement2_get_currentStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_onpropertychange_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_onpropertychange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_onpropertychange_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_onpropertychange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_getClientRects_Proxy(IHTMLElement2 *This,IHTMLRectCollection **pRectCol);
  void __RPC_STUB IHTMLElement2_getClientRects_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_getBoundingClientRect_Proxy(IHTMLElement2 *This,IHTMLRect **pRect);
  void __RPC_STUB IHTMLElement2_getBoundingClientRect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_setExpression_Proxy(IHTMLElement2 *This,BSTR propname,BSTR expression,BSTR language);
  void __RPC_STUB IHTMLElement2_setExpression_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_getExpression_Proxy(IHTMLElement2 *This,BSTR propname,VARIANT *expression);
  void __RPC_STUB IHTMLElement2_getExpression_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_removeExpression_Proxy(IHTMLElement2 *This,BSTR propname,VARIANT_BOOL *pfSuccess);
  void __RPC_STUB IHTMLElement2_removeExpression_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_tabIndex_Proxy(IHTMLElement2 *This,short v);
  void __RPC_STUB IHTMLElement2_put_tabIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_tabIndex_Proxy(IHTMLElement2 *This,short *p);
  void __RPC_STUB IHTMLElement2_get_tabIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_focus_Proxy(IHTMLElement2 *This);
  void __RPC_STUB IHTMLElement2_focus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_accessKey_Proxy(IHTMLElement2 *This,BSTR v);
  void __RPC_STUB IHTMLElement2_put_accessKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_accessKey_Proxy(IHTMLElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLElement2_get_accessKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_onblur_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_onblur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_onblur_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_onblur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_onfocus_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_onfocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_onfocus_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_onfocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_onresize_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_onresize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_onresize_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_onresize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_blur_Proxy(IHTMLElement2 *This);
  void __RPC_STUB IHTMLElement2_blur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_addFilter_Proxy(IHTMLElement2 *This,IUnknown *pUnk);
  void __RPC_STUB IHTMLElement2_addFilter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_removeFilter_Proxy(IHTMLElement2 *This,IUnknown *pUnk);
  void __RPC_STUB IHTMLElement2_removeFilter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_clientHeight_Proxy(IHTMLElement2 *This,long *p);
  void __RPC_STUB IHTMLElement2_get_clientHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_clientWidth_Proxy(IHTMLElement2 *This,long *p);
  void __RPC_STUB IHTMLElement2_get_clientWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_clientTop_Proxy(IHTMLElement2 *This,long *p);
  void __RPC_STUB IHTMLElement2_get_clientTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_clientLeft_Proxy(IHTMLElement2 *This,long *p);
  void __RPC_STUB IHTMLElement2_get_clientLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_attachEvent_Proxy(IHTMLElement2 *This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult);
  void __RPC_STUB IHTMLElement2_attachEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_detachEvent_Proxy(IHTMLElement2 *This,BSTR event,IDispatch *pDisp);
  void __RPC_STUB IHTMLElement2_detachEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_readyState_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_readyState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_onreadystatechange_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_onreadystatechange_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_onrowsdelete_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_onrowsdelete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_onrowsdelete_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_onrowsdelete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_onrowsinserted_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_onrowsinserted_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_onrowsinserted_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_onrowsinserted_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_oncellchange_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_oncellchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_oncellchange_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_oncellchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_dir_Proxy(IHTMLElement2 *This,BSTR v);
  void __RPC_STUB IHTMLElement2_put_dir_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_dir_Proxy(IHTMLElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLElement2_get_dir_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_createControlRange_Proxy(IHTMLElement2 *This,IDispatch **range);
  void __RPC_STUB IHTMLElement2_createControlRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_scrollHeight_Proxy(IHTMLElement2 *This,long *p);
  void __RPC_STUB IHTMLElement2_get_scrollHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_scrollWidth_Proxy(IHTMLElement2 *This,long *p);
  void __RPC_STUB IHTMLElement2_get_scrollWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_scrollTop_Proxy(IHTMLElement2 *This,long v);
  void __RPC_STUB IHTMLElement2_put_scrollTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_scrollTop_Proxy(IHTMLElement2 *This,long *p);
  void __RPC_STUB IHTMLElement2_get_scrollTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_scrollLeft_Proxy(IHTMLElement2 *This,long v);
  void __RPC_STUB IHTMLElement2_put_scrollLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_scrollLeft_Proxy(IHTMLElement2 *This,long *p);
  void __RPC_STUB IHTMLElement2_get_scrollLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_clearAttributes_Proxy(IHTMLElement2 *This);
  void __RPC_STUB IHTMLElement2_clearAttributes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_mergeAttributes_Proxy(IHTMLElement2 *This,IHTMLElement *mergeThis);
  void __RPC_STUB IHTMLElement2_mergeAttributes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_oncontextmenu_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_oncontextmenu_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_oncontextmenu_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_oncontextmenu_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_insertAdjacentElement_Proxy(IHTMLElement2 *This,BSTR where,IHTMLElement *insertedElement,IHTMLElement **inserted);
  void __RPC_STUB IHTMLElement2_insertAdjacentElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_applyElement_Proxy(IHTMLElement2 *This,IHTMLElement *apply,BSTR where,IHTMLElement **applied);
  void __RPC_STUB IHTMLElement2_applyElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_getAdjacentText_Proxy(IHTMLElement2 *This,BSTR where,BSTR *text);
  void __RPC_STUB IHTMLElement2_getAdjacentText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_replaceAdjacentText_Proxy(IHTMLElement2 *This,BSTR where,BSTR newText,BSTR *oldText);
  void __RPC_STUB IHTMLElement2_replaceAdjacentText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_canHaveChildren_Proxy(IHTMLElement2 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElement2_get_canHaveChildren_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_addBehavior_Proxy(IHTMLElement2 *This,BSTR bstrUrl,VARIANT *pvarFactory,long *pCookie);
  void __RPC_STUB IHTMLElement2_addBehavior_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_removeBehavior_Proxy(IHTMLElement2 *This,long cookie,VARIANT_BOOL *pfResult);
  void __RPC_STUB IHTMLElement2_removeBehavior_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_runtimeStyle_Proxy(IHTMLElement2 *This,IHTMLStyle **p);
  void __RPC_STUB IHTMLElement2_get_runtimeStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_behaviorUrns_Proxy(IHTMLElement2 *This,IDispatch **p);
  void __RPC_STUB IHTMLElement2_get_behaviorUrns_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_tagUrn_Proxy(IHTMLElement2 *This,BSTR v);
  void __RPC_STUB IHTMLElement2_put_tagUrn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_tagUrn_Proxy(IHTMLElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLElement2_get_tagUrn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_put_onbeforeeditfocus_Proxy(IHTMLElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLElement2_put_onbeforeeditfocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_onbeforeeditfocus_Proxy(IHTMLElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement2_get_onbeforeeditfocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_get_readyStateValue_Proxy(IHTMLElement2 *This,long *p);
  void __RPC_STUB IHTMLElement2_get_readyStateValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement2_getElementsByTagName_Proxy(IHTMLElement2 *This,BSTR v,IHTMLElementCollection **pelColl);
  void __RPC_STUB IHTMLElement2_getElementsByTagName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLElement3_INTERFACE_DEFINED__
#define __IHTMLElement3_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLElement3;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLElement3 : public IDispatch {
  public:
    virtual HRESULT WINAPI mergeAttributes(IHTMLElement *mergeThis,VARIANT *pvarFlags) = 0;
    virtual HRESULT WINAPI get_isMultiLine(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_canHaveHTML(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_onlayoutcomplete(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onlayoutcomplete(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onpage(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onpage(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_inflateBlock(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_inflateBlock(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_onbeforedeactivate(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onbeforedeactivate(VARIANT *p) = 0;
    virtual HRESULT WINAPI setActive(void) = 0;
    virtual HRESULT WINAPI put_contentEditable(BSTR v) = 0;
    virtual HRESULT WINAPI get_contentEditable(BSTR *p) = 0;
    virtual HRESULT WINAPI get_isContentEditable(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_hideFocus(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_hideFocus(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_disabled(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_disabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_isDisabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_onmove(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmove(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_oncontrolselect(VARIANT v) = 0;
    virtual HRESULT WINAPI get_oncontrolselect(VARIANT *p) = 0;
    virtual HRESULT WINAPI fireEvent(BSTR bstrEventName,VARIANT *pvarEventObject,VARIANT_BOOL *pfCancelled) = 0;
    virtual HRESULT WINAPI put_onresizestart(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onresizestart(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onresizeend(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onresizeend(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onmovestart(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmovestart(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onmoveend(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmoveend(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onmouseenter(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmouseenter(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onmouseleave(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmouseleave(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onactivate(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onactivate(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_ondeactivate(VARIANT v) = 0;
    virtual HRESULT WINAPI get_ondeactivate(VARIANT *p) = 0;
    virtual HRESULT WINAPI dragDrop(VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI get_glyphMode(LONG *p) = 0;
  };
#else
  typedef struct IHTMLElement3Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLElement3 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLElement3 *This);
      ULONG (WINAPI *Release)(IHTMLElement3 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLElement3 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLElement3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLElement3 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLElement3 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *mergeAttributes)(IHTMLElement3 *This,IHTMLElement *mergeThis,VARIANT *pvarFlags);
      HRESULT (WINAPI *get_isMultiLine)(IHTMLElement3 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_canHaveHTML)(IHTMLElement3 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_onlayoutcomplete)(IHTMLElement3 *This,VARIANT v);
      HRESULT (WINAPI *get_onlayoutcomplete)(IHTMLElement3 *This,VARIANT *p);
      HRESULT (WINAPI *put_onpage)(IHTMLElement3 *This,VARIANT v);
      HRESULT (WINAPI *get_onpage)(IHTMLElement3 *This,VARIANT *p);
      HRESULT (WINAPI *put_inflateBlock)(IHTMLElement3 *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_inflateBlock)(IHTMLElement3 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_onbeforedeactivate)(IHTMLElement3 *This,VARIANT v);
      HRESULT (WINAPI *get_onbeforedeactivate)(IHTMLElement3 *This,VARIANT *p);
      HRESULT (WINAPI *setActive)(IHTMLElement3 *This);
      HRESULT (WINAPI *put_contentEditable)(IHTMLElement3 *This,BSTR v);
      HRESULT (WINAPI *get_contentEditable)(IHTMLElement3 *This,BSTR *p);
      HRESULT (WINAPI *get_isContentEditable)(IHTMLElement3 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_hideFocus)(IHTMLElement3 *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_hideFocus)(IHTMLElement3 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_disabled)(IHTMLElement3 *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_disabled)(IHTMLElement3 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_isDisabled)(IHTMLElement3 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_onmove)(IHTMLElement3 *This,VARIANT v);
      HRESULT (WINAPI *get_onmove)(IHTMLElement3 *This,VARIANT *p);
      HRESULT (WINAPI *put_oncontrolselect)(IHTMLElement3 *This,VARIANT v);
      HRESULT (WINAPI *get_oncontrolselect)(IHTMLElement3 *This,VARIANT *p);
      HRESULT (WINAPI *fireEvent)(IHTMLElement3 *This,BSTR bstrEventName,VARIANT *pvarEventObject,VARIANT_BOOL *pfCancelled);
      HRESULT (WINAPI *put_onresizestart)(IHTMLElement3 *This,VARIANT v);
      HRESULT (WINAPI *get_onresizestart)(IHTMLElement3 *This,VARIANT *p);
      HRESULT (WINAPI *put_onresizeend)(IHTMLElement3 *This,VARIANT v);
      HRESULT (WINAPI *get_onresizeend)(IHTMLElement3 *This,VARIANT *p);
      HRESULT (WINAPI *put_onmovestart)(IHTMLElement3 *This,VARIANT v);
      HRESULT (WINAPI *get_onmovestart)(IHTMLElement3 *This,VARIANT *p);
      HRESULT (WINAPI *put_onmoveend)(IHTMLElement3 *This,VARIANT v);
      HRESULT (WINAPI *get_onmoveend)(IHTMLElement3 *This,VARIANT *p);
      HRESULT (WINAPI *put_onmouseenter)(IHTMLElement3 *This,VARIANT v);
      HRESULT (WINAPI *get_onmouseenter)(IHTMLElement3 *This,VARIANT *p);
      HRESULT (WINAPI *put_onmouseleave)(IHTMLElement3 *This,VARIANT v);
      HRESULT (WINAPI *get_onmouseleave)(IHTMLElement3 *This,VARIANT *p);
      HRESULT (WINAPI *put_onactivate)(IHTMLElement3 *This,VARIANT v);
      HRESULT (WINAPI *get_onactivate)(IHTMLElement3 *This,VARIANT *p);
      HRESULT (WINAPI *put_ondeactivate)(IHTMLElement3 *This,VARIANT v);
      HRESULT (WINAPI *get_ondeactivate)(IHTMLElement3 *This,VARIANT *p);
      HRESULT (WINAPI *dragDrop)(IHTMLElement3 *This,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *get_glyphMode)(IHTMLElement3 *This,LONG *p);
    END_INTERFACE
  } IHTMLElement3Vtbl;
  interface IHTMLElement3 {
    CONST_VTBL struct IHTMLElement3Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLElement3_mergeAttributes_Proxy(IHTMLElement3 *This,IHTMLElement *mergeThis,VARIANT *pvarFlags);
  void __RPC_STUB IHTMLElement3_mergeAttributes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_isMultiLine_Proxy(IHTMLElement3 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElement3_get_isMultiLine_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_canHaveHTML_Proxy(IHTMLElement3 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElement3_get_canHaveHTML_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_onlayoutcomplete_Proxy(IHTMLElement3 *This,VARIANT v);
  void __RPC_STUB IHTMLElement3_put_onlayoutcomplete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_onlayoutcomplete_Proxy(IHTMLElement3 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement3_get_onlayoutcomplete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_onpage_Proxy(IHTMLElement3 *This,VARIANT v);
  void __RPC_STUB IHTMLElement3_put_onpage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_onpage_Proxy(IHTMLElement3 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement3_get_onpage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_inflateBlock_Proxy(IHTMLElement3 *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLElement3_put_inflateBlock_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_inflateBlock_Proxy(IHTMLElement3 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElement3_get_inflateBlock_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_onbeforedeactivate_Proxy(IHTMLElement3 *This,VARIANT v);
  void __RPC_STUB IHTMLElement3_put_onbeforedeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_onbeforedeactivate_Proxy(IHTMLElement3 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement3_get_onbeforedeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_setActive_Proxy(IHTMLElement3 *This);
  void __RPC_STUB IHTMLElement3_setActive_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_contentEditable_Proxy(IHTMLElement3 *This,BSTR v);
  void __RPC_STUB IHTMLElement3_put_contentEditable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_contentEditable_Proxy(IHTMLElement3 *This,BSTR *p);
  void __RPC_STUB IHTMLElement3_get_contentEditable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_isContentEditable_Proxy(IHTMLElement3 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElement3_get_isContentEditable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_hideFocus_Proxy(IHTMLElement3 *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLElement3_put_hideFocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_hideFocus_Proxy(IHTMLElement3 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElement3_get_hideFocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_disabled_Proxy(IHTMLElement3 *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLElement3_put_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_disabled_Proxy(IHTMLElement3 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElement3_get_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_isDisabled_Proxy(IHTMLElement3 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElement3_get_isDisabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_onmove_Proxy(IHTMLElement3 *This,VARIANT v);
  void __RPC_STUB IHTMLElement3_put_onmove_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_onmove_Proxy(IHTMLElement3 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement3_get_onmove_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_oncontrolselect_Proxy(IHTMLElement3 *This,VARIANT v);
  void __RPC_STUB IHTMLElement3_put_oncontrolselect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_oncontrolselect_Proxy(IHTMLElement3 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement3_get_oncontrolselect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_fireEvent_Proxy(IHTMLElement3 *This,BSTR bstrEventName,VARIANT *pvarEventObject,VARIANT_BOOL *pfCancelled);
  void __RPC_STUB IHTMLElement3_fireEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_onresizestart_Proxy(IHTMLElement3 *This,VARIANT v);
  void __RPC_STUB IHTMLElement3_put_onresizestart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_onresizestart_Proxy(IHTMLElement3 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement3_get_onresizestart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_onresizeend_Proxy(IHTMLElement3 *This,VARIANT v);
  void __RPC_STUB IHTMLElement3_put_onresizeend_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_onresizeend_Proxy(IHTMLElement3 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement3_get_onresizeend_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_onmovestart_Proxy(IHTMLElement3 *This,VARIANT v);
  void __RPC_STUB IHTMLElement3_put_onmovestart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_onmovestart_Proxy(IHTMLElement3 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement3_get_onmovestart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_onmoveend_Proxy(IHTMLElement3 *This,VARIANT v);
  void __RPC_STUB IHTMLElement3_put_onmoveend_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_onmoveend_Proxy(IHTMLElement3 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement3_get_onmoveend_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_onmouseenter_Proxy(IHTMLElement3 *This,VARIANT v);
  void __RPC_STUB IHTMLElement3_put_onmouseenter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_onmouseenter_Proxy(IHTMLElement3 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement3_get_onmouseenter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_onmouseleave_Proxy(IHTMLElement3 *This,VARIANT v);
  void __RPC_STUB IHTMLElement3_put_onmouseleave_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_onmouseleave_Proxy(IHTMLElement3 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement3_get_onmouseleave_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_onactivate_Proxy(IHTMLElement3 *This,VARIANT v);
  void __RPC_STUB IHTMLElement3_put_onactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_onactivate_Proxy(IHTMLElement3 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement3_get_onactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_put_ondeactivate_Proxy(IHTMLElement3 *This,VARIANT v);
  void __RPC_STUB IHTMLElement3_put_ondeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_ondeactivate_Proxy(IHTMLElement3 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement3_get_ondeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_dragDrop_Proxy(IHTMLElement3 *This,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLElement3_dragDrop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement3_get_glyphMode_Proxy(IHTMLElement3 *This,LONG *p);
  void __RPC_STUB IHTMLElement3_get_glyphMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLElement4_INTERFACE_DEFINED__
#define __IHTMLElement4_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLElement4;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLElement4 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_onmousewheel(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmousewheel(VARIANT *p) = 0;
    virtual HRESULT WINAPI normalize(void) = 0;
    virtual HRESULT WINAPI getAttributeNode(BSTR bstrname,IHTMLDOMAttribute **ppAttribute) = 0;
    virtual HRESULT WINAPI setAttributeNode(IHTMLDOMAttribute *pattr,IHTMLDOMAttribute **ppretAttribute) = 0;
    virtual HRESULT WINAPI removeAttributeNode(IHTMLDOMAttribute *pattr,IHTMLDOMAttribute **ppretAttribute) = 0;
    virtual HRESULT WINAPI put_onbeforeactivate(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onbeforeactivate(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onfocusin(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onfocusin(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onfocusout(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onfocusout(VARIANT *p) = 0;
  };
#else
  typedef struct IHTMLElement4Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLElement4 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLElement4 *This);
      ULONG (WINAPI *Release)(IHTMLElement4 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLElement4 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLElement4 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLElement4 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLElement4 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_onmousewheel)(IHTMLElement4 *This,VARIANT v);
      HRESULT (WINAPI *get_onmousewheel)(IHTMLElement4 *This,VARIANT *p);
      HRESULT (WINAPI *normalize)(IHTMLElement4 *This);
      HRESULT (WINAPI *getAttributeNode)(IHTMLElement4 *This,BSTR bstrname,IHTMLDOMAttribute **ppAttribute);
      HRESULT (WINAPI *setAttributeNode)(IHTMLElement4 *This,IHTMLDOMAttribute *pattr,IHTMLDOMAttribute **ppretAttribute);
      HRESULT (WINAPI *removeAttributeNode)(IHTMLElement4 *This,IHTMLDOMAttribute *pattr,IHTMLDOMAttribute **ppretAttribute);
      HRESULT (WINAPI *put_onbeforeactivate)(IHTMLElement4 *This,VARIANT v);
      HRESULT (WINAPI *get_onbeforeactivate)(IHTMLElement4 *This,VARIANT *p);
      HRESULT (WINAPI *put_onfocusin)(IHTMLElement4 *This,VARIANT v);
      HRESULT (WINAPI *get_onfocusin)(IHTMLElement4 *This,VARIANT *p);
      HRESULT (WINAPI *put_onfocusout)(IHTMLElement4 *This,VARIANT v);
      HRESULT (WINAPI *get_onfocusout)(IHTMLElement4 *This,VARIANT *p);
    END_INTERFACE
  } IHTMLElement4Vtbl;
  interface IHTMLElement4 {
    CONST_VTBL struct IHTMLElement4Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLElement4_put_onmousewheel_Proxy(IHTMLElement4 *This,VARIANT v);
  void __RPC_STUB IHTMLElement4_put_onmousewheel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement4_get_onmousewheel_Proxy(IHTMLElement4 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement4_get_onmousewheel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement4_normalize_Proxy(IHTMLElement4 *This);
  void __RPC_STUB IHTMLElement4_normalize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement4_getAttributeNode_Proxy(IHTMLElement4 *This,BSTR bstrname,IHTMLDOMAttribute **ppAttribute);
  void __RPC_STUB IHTMLElement4_getAttributeNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement4_setAttributeNode_Proxy(IHTMLElement4 *This,IHTMLDOMAttribute *pattr,IHTMLDOMAttribute **ppretAttribute);
  void __RPC_STUB IHTMLElement4_setAttributeNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement4_removeAttributeNode_Proxy(IHTMLElement4 *This,IHTMLDOMAttribute *pattr,IHTMLDOMAttribute **ppretAttribute);
  void __RPC_STUB IHTMLElement4_removeAttributeNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement4_put_onbeforeactivate_Proxy(IHTMLElement4 *This,VARIANT v);
  void __RPC_STUB IHTMLElement4_put_onbeforeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement4_get_onbeforeactivate_Proxy(IHTMLElement4 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement4_get_onbeforeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement4_put_onfocusin_Proxy(IHTMLElement4 *This,VARIANT v);
  void __RPC_STUB IHTMLElement4_put_onfocusin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement4_get_onfocusin_Proxy(IHTMLElement4 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement4_get_onfocusin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement4_put_onfocusout_Proxy(IHTMLElement4 *This,VARIANT v);
  void __RPC_STUB IHTMLElement4_put_onfocusout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElement4_get_onfocusout_Proxy(IHTMLElement4 *This,VARIANT *p);
  void __RPC_STUB IHTMLElement4_get_onfocusout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLElementRender_INTERFACE_DEFINED__
#define __IHTMLElementRender_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLElementRender;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLElementRender : public IUnknown {
  public:
    virtual HRESULT WINAPI DrawToDC(HDC hDC) = 0;
    virtual HRESULT WINAPI SetDocumentPrinter(BSTR bstrPrinterName,HDC hDC) = 0;
  };
#else
  typedef struct IHTMLElementRenderVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLElementRender *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLElementRender *This);
      ULONG (WINAPI *Release)(IHTMLElementRender *This);
      HRESULT (WINAPI *DrawToDC)(IHTMLElementRender *This,HDC hDC);
      HRESULT (WINAPI *SetDocumentPrinter)(IHTMLElementRender *This,BSTR bstrPrinterName,HDC hDC);
    END_INTERFACE
  } IHTMLElementRenderVtbl;
  interface IHTMLElementRender {
    CONST_VTBL struct IHTMLElementRenderVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#define IHTMLElementRender_DrawToDC(This,hDC) (This)->lpVtbl->DrawToDC(This,hDC)
#define IHTMLElementRender_SetDocumentPrinter(This,bstrPrinterName,hDC) (This)->lpVtbl->SetDocumentPrinter(This,bstrPrinterName,hDC)
#endif
#endif
  HRESULT WINAPI IHTMLElementRender_DrawToDC_Proxy(IHTMLElementRender *This,HDC hDC);
  void __RPC_STUB IHTMLElementRender_DrawToDC_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementRender_SetDocumentPrinter_Proxy(IHTMLElementRender *This,BSTR bstrPrinterName,HDC hDC);
  void __RPC_STUB IHTMLElementRender_SetDocumentPrinter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLUniqueName_INTERFACE_DEFINED__
#define __IHTMLUniqueName_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLUniqueName;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLUniqueName : public IDispatch {
  public:
    virtual HRESULT WINAPI get_uniqueNumber(long *p) = 0;
    virtual HRESULT WINAPI get_uniqueID(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLUniqueNameVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLUniqueName *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLUniqueName *This);
      ULONG (WINAPI *Release)(IHTMLUniqueName *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLUniqueName *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLUniqueName *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLUniqueName *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLUniqueName *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_uniqueNumber)(IHTMLUniqueName *This,long *p);
      HRESULT (WINAPI *get_uniqueID)(IHTMLUniqueName *This,BSTR *p);
    END_INTERFACE
  } IHTMLUniqueNameVtbl;
  interface IHTMLUniqueName {
    CONST_VTBL struct IHTMLUniqueNameVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLUniqueName_get_uniqueNumber(This,p) (This)->lpVtbl->get_uniqueNumber(This,p)
#define IHTMLUniqueName_get_uniqueID(This,p) (This)->lpVtbl->get_uniqueID(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLUniqueName_get_uniqueNumber_Proxy(IHTMLUniqueName *This,long *p);
  void __RPC_STUB IHTMLUniqueName_get_uniqueNumber_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLUniqueName_get_uniqueID_Proxy(IHTMLUniqueName *This,BSTR *p);
  void __RPC_STUB IHTMLUniqueName_get_uniqueID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDatabinding_INTERFACE_DEFINED__
#define __IHTMLDatabinding_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDatabinding;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDatabinding : public IDispatch {
  public:
    virtual HRESULT WINAPI put_dataFld(BSTR v) = 0;
    virtual HRESULT WINAPI get_dataFld(BSTR *p) = 0;
    virtual HRESULT WINAPI put_dataSrc(BSTR v) = 0;
    virtual HRESULT WINAPI get_dataSrc(BSTR *p) = 0;
    virtual HRESULT WINAPI put_dataFormatAs(BSTR v) = 0;
    virtual HRESULT WINAPI get_dataFormatAs(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLDatabindingVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDatabinding *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDatabinding *This);
      ULONG (WINAPI *Release)(IHTMLDatabinding *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDatabinding *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDatabinding *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDatabinding *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDatabinding *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_dataFld)(IHTMLDatabinding *This,BSTR v);
      HRESULT (WINAPI *get_dataFld)(IHTMLDatabinding *This,BSTR *p);
      HRESULT (WINAPI *put_dataSrc)(IHTMLDatabinding *This,BSTR v);
      HRESULT (WINAPI *get_dataSrc)(IHTMLDatabinding *This,BSTR *p);
      HRESULT (WINAPI *put_dataFormatAs)(IHTMLDatabinding *This,BSTR v);
      HRESULT (WINAPI *get_dataFormatAs)(IHTMLDatabinding *This,BSTR *p);
    END_INTERFACE
  } IHTMLDatabindingVtbl;
  interface IHTMLDatabinding {
    CONST_VTBL struct IHTMLDatabindingVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLDatabinding_put_dataFld_Proxy(IHTMLDatabinding *This,BSTR v);
  void __RPC_STUB IHTMLDatabinding_put_dataFld_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDatabinding_get_dataFld_Proxy(IHTMLDatabinding *This,BSTR *p);
  void __RPC_STUB IHTMLDatabinding_get_dataFld_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDatabinding_put_dataSrc_Proxy(IHTMLDatabinding *This,BSTR v);
  void __RPC_STUB IHTMLDatabinding_put_dataSrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDatabinding_get_dataSrc_Proxy(IHTMLDatabinding *This,BSTR *p);
  void __RPC_STUB IHTMLDatabinding_get_dataSrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDatabinding_put_dataFormatAs_Proxy(IHTMLDatabinding *This,BSTR v);
  void __RPC_STUB IHTMLDatabinding_put_dataFormatAs_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDatabinding_get_dataFormatAs_Proxy(IHTMLDatabinding *This,BSTR *p);
  void __RPC_STUB IHTMLDatabinding_get_dataFormatAs_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDocument_INTERFACE_DEFINED__
#define __IHTMLDocument_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDocument;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDocument : public IDispatch {
  public:
    virtual HRESULT WINAPI get_Script(IDispatch **p) = 0;
  };
#else
  typedef struct IHTMLDocumentVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDocument *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDocument *This);
      ULONG (WINAPI *Release)(IHTMLDocument *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDocument *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDocument *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDocument *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDocument *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_Script)(IHTMLDocument *This,IDispatch **p);
    END_INTERFACE
  } IHTMLDocumentVtbl;
  interface IHTMLDocument {
    CONST_VTBL struct IHTMLDocumentVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLDocument_get_Script(This,p) (This)->lpVtbl->get_Script(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLDocument_get_Script_Proxy(IHTMLDocument *This,IDispatch **p);
  void __RPC_STUB IHTMLDocument_get_Script_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLElementDefaults_INTERFACE_DEFINED__
#define __IHTMLElementDefaults_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLElementDefaults;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLElementDefaults : public IDispatch {
  public:
    virtual HRESULT WINAPI get_style(IHTMLStyle **p) = 0;
    virtual HRESULT WINAPI put_tabStop(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_tabStop(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_viewInheritStyle(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_viewInheritStyle(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_viewMasterTab(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_viewMasterTab(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_scrollSegmentX(long v) = 0;
    virtual HRESULT WINAPI get_scrollSegmentX(long *p) = 0;
    virtual HRESULT WINAPI put_scrollSegmentY(long v) = 0;
    virtual HRESULT WINAPI get_scrollSegmentY(long *p) = 0;
    virtual HRESULT WINAPI put_isMultiLine(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_isMultiLine(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_contentEditable(BSTR v) = 0;
    virtual HRESULT WINAPI get_contentEditable(BSTR *p) = 0;
    virtual HRESULT WINAPI put_canHaveHTML(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_canHaveHTML(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI putref_viewLink(IHTMLDocument *v) = 0;
    virtual HRESULT WINAPI get_viewLink(IHTMLDocument **p) = 0;
    virtual HRESULT WINAPI put_frozen(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_frozen(VARIANT_BOOL *p) = 0;
  };
#else
  typedef struct IHTMLElementDefaultsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLElementDefaults *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLElementDefaults *This);
      ULONG (WINAPI *Release)(IHTMLElementDefaults *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLElementDefaults *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLElementDefaults *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLElementDefaults *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLElementDefaults *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_style)(IHTMLElementDefaults *This,IHTMLStyle **p);
      HRESULT (WINAPI *put_tabStop)(IHTMLElementDefaults *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_tabStop)(IHTMLElementDefaults *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_viewInheritStyle)(IHTMLElementDefaults *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_viewInheritStyle)(IHTMLElementDefaults *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_viewMasterTab)(IHTMLElementDefaults *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_viewMasterTab)(IHTMLElementDefaults *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_scrollSegmentX)(IHTMLElementDefaults *This,long v);
      HRESULT (WINAPI *get_scrollSegmentX)(IHTMLElementDefaults *This,long *p);
      HRESULT (WINAPI *put_scrollSegmentY)(IHTMLElementDefaults *This,long v);
      HRESULT (WINAPI *get_scrollSegmentY)(IHTMLElementDefaults *This,long *p);
      HRESULT (WINAPI *put_isMultiLine)(IHTMLElementDefaults *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_isMultiLine)(IHTMLElementDefaults *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_contentEditable)(IHTMLElementDefaults *This,BSTR v);
      HRESULT (WINAPI *get_contentEditable)(IHTMLElementDefaults *This,BSTR *p);
      HRESULT (WINAPI *put_canHaveHTML)(IHTMLElementDefaults *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_canHaveHTML)(IHTMLElementDefaults *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *putref_viewLink)(IHTMLElementDefaults *This,IHTMLDocument *v);
      HRESULT (WINAPI *get_viewLink)(IHTMLElementDefaults *This,IHTMLDocument **p);
      HRESULT (WINAPI *put_frozen)(IHTMLElementDefaults *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_frozen)(IHTMLElementDefaults *This,VARIANT_BOOL *p);
    END_INTERFACE
  } IHTMLElementDefaultsVtbl;
  interface IHTMLElementDefaults {
    CONST_VTBL struct IHTMLElementDefaultsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLElementDefaults_get_style_Proxy(IHTMLElementDefaults *This,IHTMLStyle **p);
  void __RPC_STUB IHTMLElementDefaults_get_style_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_put_tabStop_Proxy(IHTMLElementDefaults *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLElementDefaults_put_tabStop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_get_tabStop_Proxy(IHTMLElementDefaults *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElementDefaults_get_tabStop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_put_viewInheritStyle_Proxy(IHTMLElementDefaults *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLElementDefaults_put_viewInheritStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_get_viewInheritStyle_Proxy(IHTMLElementDefaults *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElementDefaults_get_viewInheritStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_put_viewMasterTab_Proxy(IHTMLElementDefaults *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLElementDefaults_put_viewMasterTab_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_get_viewMasterTab_Proxy(IHTMLElementDefaults *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElementDefaults_get_viewMasterTab_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_put_scrollSegmentX_Proxy(IHTMLElementDefaults *This,long v);
  void __RPC_STUB IHTMLElementDefaults_put_scrollSegmentX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_get_scrollSegmentX_Proxy(IHTMLElementDefaults *This,long *p);
  void __RPC_STUB IHTMLElementDefaults_get_scrollSegmentX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_put_scrollSegmentY_Proxy(IHTMLElementDefaults *This,long v);
  void __RPC_STUB IHTMLElementDefaults_put_scrollSegmentY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_get_scrollSegmentY_Proxy(IHTMLElementDefaults *This,long *p);
  void __RPC_STUB IHTMLElementDefaults_get_scrollSegmentY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_put_isMultiLine_Proxy(IHTMLElementDefaults *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLElementDefaults_put_isMultiLine_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_get_isMultiLine_Proxy(IHTMLElementDefaults *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElementDefaults_get_isMultiLine_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_put_contentEditable_Proxy(IHTMLElementDefaults *This,BSTR v);
  void __RPC_STUB IHTMLElementDefaults_put_contentEditable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_get_contentEditable_Proxy(IHTMLElementDefaults *This,BSTR *p);
  void __RPC_STUB IHTMLElementDefaults_get_contentEditable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_put_canHaveHTML_Proxy(IHTMLElementDefaults *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLElementDefaults_put_canHaveHTML_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_get_canHaveHTML_Proxy(IHTMLElementDefaults *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElementDefaults_get_canHaveHTML_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_putref_viewLink_Proxy(IHTMLElementDefaults *This,IHTMLDocument *v);
  void __RPC_STUB IHTMLElementDefaults_putref_viewLink_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_get_viewLink_Proxy(IHTMLElementDefaults *This,IHTMLDocument **p);
  void __RPC_STUB IHTMLElementDefaults_get_viewLink_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_put_frozen_Proxy(IHTMLElementDefaults *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLElementDefaults_put_frozen_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLElementDefaults_get_frozen_Proxy(IHTMLElementDefaults *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLElementDefaults_get_frozen_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLDefaults_DISPINTERFACE_DEFINED__
#define __DispHTMLDefaults_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLDefaults;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLDefaults : public IDispatch {
  };
#else
  typedef struct DispHTMLDefaultsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLDefaults *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLDefaults *This);
      ULONG (WINAPI *Release)(DispHTMLDefaults *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLDefaults *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLDefaults *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLDefaults *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLDefaultsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLDefaults;
#ifdef __cplusplus
  class HTMLDefaults;
#endif

#ifndef __IHTCDefaultDispatch_INTERFACE_DEFINED__
#define __IHTCDefaultDispatch_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTCDefaultDispatch;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTCDefaultDispatch : public IDispatch {
  public:
    virtual HRESULT WINAPI get_element(IHTMLElement **p) = 0;
    virtual HRESULT WINAPI createEventObject(IHTMLEventObj **eventObj) = 0;
    virtual HRESULT WINAPI get_defaults(IDispatch **p) = 0;
    virtual HRESULT WINAPI get_document(IDispatch **p) = 0;
  };
#else
  typedef struct IHTCDefaultDispatchVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTCDefaultDispatch *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTCDefaultDispatch *This);
      ULONG (WINAPI *Release)(IHTCDefaultDispatch *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTCDefaultDispatch *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTCDefaultDispatch *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTCDefaultDispatch *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTCDefaultDispatch *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_element)(IHTCDefaultDispatch *This,IHTMLElement **p);
      HRESULT (WINAPI *createEventObject)(IHTCDefaultDispatch *This,IHTMLEventObj **eventObj);
      HRESULT (WINAPI *get_defaults)(IHTCDefaultDispatch *This,IDispatch **p);
      HRESULT (WINAPI *get_document)(IHTCDefaultDispatch *This,IDispatch **p);
    END_INTERFACE
  } IHTCDefaultDispatchVtbl;
  interface IHTCDefaultDispatch {
    CONST_VTBL struct IHTCDefaultDispatchVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTCDefaultDispatch_get_element_Proxy(IHTCDefaultDispatch *This,IHTMLElement **p);
  void __RPC_STUB IHTCDefaultDispatch_get_element_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTCDefaultDispatch_createEventObject_Proxy(IHTCDefaultDispatch *This,IHTMLEventObj **eventObj);
  void __RPC_STUB IHTCDefaultDispatch_createEventObject_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTCDefaultDispatch_get_defaults_Proxy(IHTCDefaultDispatch *This,IDispatch **p);
  void __RPC_STUB IHTCDefaultDispatch_get_defaults_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTCDefaultDispatch_get_document_Proxy(IHTCDefaultDispatch *This,IDispatch **p);
  void __RPC_STUB IHTCDefaultDispatch_get_document_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTCPropertyBehavior_INTERFACE_DEFINED__
#define __IHTCPropertyBehavior_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTCPropertyBehavior;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTCPropertyBehavior : public IDispatch {
  public:
    virtual HRESULT WINAPI fireChange(void) = 0;
    virtual HRESULT WINAPI put_value(VARIANT v) = 0;
    virtual HRESULT WINAPI get_value(VARIANT *p) = 0;
  };
#else
  typedef struct IHTCPropertyBehaviorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTCPropertyBehavior *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTCPropertyBehavior *This);
      ULONG (WINAPI *Release)(IHTCPropertyBehavior *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTCPropertyBehavior *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTCPropertyBehavior *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTCPropertyBehavior *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTCPropertyBehavior *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *fireChange)(IHTCPropertyBehavior *This);
      HRESULT (WINAPI *put_value)(IHTCPropertyBehavior *This,VARIANT v);
      HRESULT (WINAPI *get_value)(IHTCPropertyBehavior *This,VARIANT *p);
    END_INTERFACE
  } IHTCPropertyBehaviorVtbl;
  interface IHTCPropertyBehavior {
    CONST_VTBL struct IHTCPropertyBehaviorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTCPropertyBehavior_fireChange_Proxy(IHTCPropertyBehavior *This);
  void __RPC_STUB IHTCPropertyBehavior_fireChange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTCPropertyBehavior_put_value_Proxy(IHTCPropertyBehavior *This,VARIANT v);
  void __RPC_STUB IHTCPropertyBehavior_put_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTCPropertyBehavior_get_value_Proxy(IHTCPropertyBehavior *This,VARIANT *p);
  void __RPC_STUB IHTCPropertyBehavior_get_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTCMethodBehavior_INTERFACE_DEFINED__
#define __IHTCMethodBehavior_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTCMethodBehavior;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTCMethodBehavior : public IDispatch {
  };
#else
  typedef struct IHTCMethodBehaviorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTCMethodBehavior *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTCMethodBehavior *This);
      ULONG (WINAPI *Release)(IHTCMethodBehavior *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTCMethodBehavior *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTCMethodBehavior *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTCMethodBehavior *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct IHTCMethodBehaviorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __IHTCEventBehavior_INTERFACE_DEFINED__
#define __IHTCEventBehavior_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTCEventBehavior;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTCEventBehavior : public IDispatch {
  public:
    virtual HRESULT WINAPI fire(IHTMLEventObj *pvar) = 0;
  };
#else
  typedef struct IHTCEventBehaviorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTCEventBehavior *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTCEventBehavior *This);
      ULONG (WINAPI *Release)(IHTCEventBehavior *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTCEventBehavior *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTCEventBehavior *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTCEventBehavior *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTCEventBehavior *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *fire)(IHTCEventBehavior *This,IHTMLEventObj *pvar);
    END_INTERFACE
  } IHTCEventBehaviorVtbl;
  interface IHTCEventBehavior {
    CONST_VTBL struct IHTCEventBehaviorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTCEventBehavior_fire(This,pvar) (This)->lpVtbl->fire(This,pvar)
#endif
#endif
  HRESULT WINAPI IHTCEventBehavior_fire_Proxy(IHTCEventBehavior *This,IHTMLEventObj *pvar);
  void __RPC_STUB IHTCEventBehavior_fire_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTCAttachBehavior_INTERFACE_DEFINED__
#define __IHTCAttachBehavior_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTCAttachBehavior;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTCAttachBehavior : public IDispatch {
  public:
    virtual HRESULT WINAPI fireEvent(IDispatch *evt) = 0;
    virtual HRESULT WINAPI detachEvent(void) = 0;
  };
#else
  typedef struct IHTCAttachBehaviorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTCAttachBehavior *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTCAttachBehavior *This);
      ULONG (WINAPI *Release)(IHTCAttachBehavior *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTCAttachBehavior *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTCAttachBehavior *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTCAttachBehavior *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTCAttachBehavior *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *fireEvent)(IHTCAttachBehavior *This,IDispatch *evt);
      HRESULT (WINAPI *detachEvent)(IHTCAttachBehavior *This);
    END_INTERFACE
  } IHTCAttachBehaviorVtbl;
  interface IHTCAttachBehavior {
    CONST_VTBL struct IHTCAttachBehaviorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTCAttachBehavior_fireEvent(This,evt) (This)->lpVtbl->fireEvent(This,evt)
#define IHTCAttachBehavior_detachEvent(This) (This)->lpVtbl->detachEvent(This)
#endif
#endif
  HRESULT WINAPI IHTCAttachBehavior_fireEvent_Proxy(IHTCAttachBehavior *This,IDispatch *evt);
  void __RPC_STUB IHTCAttachBehavior_fireEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTCAttachBehavior_detachEvent_Proxy(IHTCAttachBehavior *This);
  void __RPC_STUB IHTCAttachBehavior_detachEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTCAttachBehavior2_INTERFACE_DEFINED__
#define __IHTCAttachBehavior2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTCAttachBehavior2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTCAttachBehavior2 : public IDispatch {
  public:
    virtual HRESULT WINAPI fireEvent(VARIANT evt) = 0;
  };
#else
  typedef struct IHTCAttachBehavior2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTCAttachBehavior2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTCAttachBehavior2 *This);
      ULONG (WINAPI *Release)(IHTCAttachBehavior2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTCAttachBehavior2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTCAttachBehavior2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTCAttachBehavior2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTCAttachBehavior2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *fireEvent)(IHTCAttachBehavior2 *This,VARIANT evt);
    END_INTERFACE
  } IHTCAttachBehavior2Vtbl;
  interface IHTCAttachBehavior2 {
    CONST_VTBL struct IHTCAttachBehavior2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTCAttachBehavior2_fireEvent(This,evt) (This)->lpVtbl->fireEvent(This,evt)
#endif
#endif
  HRESULT WINAPI IHTCAttachBehavior2_fireEvent_Proxy(IHTCAttachBehavior2 *This,VARIANT evt);
  void __RPC_STUB IHTCAttachBehavior2_fireEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTCDescBehavior_INTERFACE_DEFINED__
#define __IHTCDescBehavior_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTCDescBehavior;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTCDescBehavior : public IDispatch {
  public:
    virtual HRESULT WINAPI get_urn(BSTR *p) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
  };
#else
  typedef struct IHTCDescBehaviorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTCDescBehavior *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTCDescBehavior *This);
      ULONG (WINAPI *Release)(IHTCDescBehavior *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTCDescBehavior *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTCDescBehavior *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTCDescBehavior *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTCDescBehavior *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_urn)(IHTCDescBehavior *This,BSTR *p);
      HRESULT (WINAPI *get_name)(IHTCDescBehavior *This,BSTR *p);
    END_INTERFACE
  } IHTCDescBehaviorVtbl;
  interface IHTCDescBehavior {
    CONST_VTBL struct IHTCDescBehaviorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTCDescBehavior_get_urn(This,p) (This)->lpVtbl->get_urn(This,p)
#define IHTCDescBehavior_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#endif
#endif
  HRESULT WINAPI IHTCDescBehavior_get_urn_Proxy(IHTCDescBehavior *This,BSTR *p);
  void __RPC_STUB IHTCDescBehavior_get_urn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTCDescBehavior_get_name_Proxy(IHTCDescBehavior *This,BSTR *p);
  void __RPC_STUB IHTCDescBehavior_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTCDefaultDispatch_DISPINTERFACE_DEFINED__
#define __DispHTCDefaultDispatch_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTCDefaultDispatch;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTCDefaultDispatch : public IDispatch {
  };
#else
  typedef struct DispHTCDefaultDispatchVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTCDefaultDispatch *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTCDefaultDispatch *This);
      ULONG (WINAPI *Release)(DispHTCDefaultDispatch *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTCDefaultDispatch *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTCDefaultDispatch *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTCDefaultDispatch *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTCDefaultDispatchVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTCDefaultDispatch;
#ifdef __cplusplus
  class HTCDefaultDispatch;
#endif

#ifndef __DispHTCPropertyBehavior_DISPINTERFACE_DEFINED__
#define __DispHTCPropertyBehavior_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTCPropertyBehavior;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTCPropertyBehavior : public IDispatch {
  };
#else
  typedef struct DispHTCPropertyBehaviorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTCPropertyBehavior *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTCPropertyBehavior *This);
      ULONG (WINAPI *Release)(DispHTCPropertyBehavior *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTCPropertyBehavior *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTCPropertyBehavior *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTCPropertyBehavior *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTCPropertyBehaviorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTCPropertyBehavior;
#ifdef __cplusplus
  class HTCPropertyBehavior;
#endif

#ifndef __DispHTCMethodBehavior_DISPINTERFACE_DEFINED__
#define __DispHTCMethodBehavior_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTCMethodBehavior;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTCMethodBehavior : public IDispatch {
  };
#else
  typedef struct DispHTCMethodBehaviorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTCMethodBehavior *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTCMethodBehavior *This);
      ULONG (WINAPI *Release)(DispHTCMethodBehavior *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTCMethodBehavior *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTCMethodBehavior *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTCMethodBehavior *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTCMethodBehaviorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTCMethodBehavior;
#ifdef __cplusplus
  class HTCMethodBehavior;
#endif

#ifndef __DispHTCEventBehavior_DISPINTERFACE_DEFINED__
#define __DispHTCEventBehavior_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTCEventBehavior;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTCEventBehavior : public IDispatch {
  };
#else
  typedef struct DispHTCEventBehaviorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTCEventBehavior *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTCEventBehavior *This);
      ULONG (WINAPI *Release)(DispHTCEventBehavior *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTCEventBehavior *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTCEventBehavior *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTCEventBehavior *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTCEventBehaviorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTCEventBehavior;
#ifdef __cplusplus
  class HTCEventBehavior;
#endif

#ifndef __DispHTCAttachBehavior_DISPINTERFACE_DEFINED__
#define __DispHTCAttachBehavior_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTCAttachBehavior;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTCAttachBehavior : public IDispatch {
  };
#else
  typedef struct DispHTCAttachBehaviorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTCAttachBehavior *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTCAttachBehavior *This);
      ULONG (WINAPI *Release)(DispHTCAttachBehavior *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTCAttachBehavior *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTCAttachBehavior *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTCAttachBehavior *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTCAttachBehaviorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTCAttachBehavior;
#ifdef __cplusplus
  class HTCAttachBehavior;
#endif

#ifndef __DispHTCDescBehavior_DISPINTERFACE_DEFINED__
#define __DispHTCDescBehavior_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTCDescBehavior;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTCDescBehavior : public IDispatch {
  };
#else
  typedef struct DispHTCDescBehaviorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTCDescBehavior *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTCDescBehavior *This);
      ULONG (WINAPI *Release)(DispHTCDescBehavior *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTCDescBehavior *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTCDescBehavior *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTCDescBehavior *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTCDescBehaviorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTCDescBehavior;
#ifdef __cplusplus
  class HTCDescBehavior;
#endif

#ifndef __IHTMLUrnCollection_INTERFACE_DEFINED__
#define __IHTMLUrnCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLUrnCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLUrnCollection : public IDispatch {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI item(long index,BSTR *ppUrn) = 0;
  };
#else
  typedef struct IHTMLUrnCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLUrnCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLUrnCollection *This);
      ULONG (WINAPI *Release)(IHTMLUrnCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLUrnCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLUrnCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLUrnCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLUrnCollection *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_length)(IHTMLUrnCollection *This,long *p);
      HRESULT (WINAPI *item)(IHTMLUrnCollection *This,long index,BSTR *ppUrn);
    END_INTERFACE
  } IHTMLUrnCollectionVtbl;
  interface IHTMLUrnCollection {
    CONST_VTBL struct IHTMLUrnCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLUrnCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLUrnCollection_item(This,index,ppUrn) (This)->lpVtbl->item(This,index,ppUrn)
#endif
#endif
  HRESULT WINAPI IHTMLUrnCollection_get_length_Proxy(IHTMLUrnCollection *This,long *p);
  void __RPC_STUB IHTMLUrnCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLUrnCollection_item_Proxy(IHTMLUrnCollection *This,long index,BSTR *ppUrn);
  void __RPC_STUB IHTMLUrnCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif
  EXTERN_C const CLSID CLSID_HTMLUrnCollection;
#ifdef __cplusplus
  class HTMLUrnCollection;
#endif

#ifndef __IHTMLGenericElement_INTERFACE_DEFINED__
#define __IHTMLGenericElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLGenericElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLGenericElement : public IDispatch {
  public:
    virtual HRESULT WINAPI get_recordset(IDispatch **p) = 0;
    virtual HRESULT WINAPI namedRecordset(BSTR dataMember,VARIANT *hierarchy,IDispatch **ppRecordset) = 0;
  };
#else
  typedef struct IHTMLGenericElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLGenericElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLGenericElement *This);
      ULONG (WINAPI *Release)(IHTMLGenericElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLGenericElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLGenericElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLGenericElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLGenericElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_recordset)(IHTMLGenericElement *This,IDispatch **p);
      HRESULT (WINAPI *namedRecordset)(IHTMLGenericElement *This,BSTR dataMember,VARIANT *hierarchy,IDispatch **ppRecordset);
    END_INTERFACE
  } IHTMLGenericElementVtbl;
  interface IHTMLGenericElement {
    CONST_VTBL struct IHTMLGenericElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLGenericElement_get_recordset_Proxy(IHTMLGenericElement *This,IDispatch **p);
  void __RPC_STUB IHTMLGenericElement_get_recordset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLGenericElement_namedRecordset_Proxy(IHTMLGenericElement *This,BSTR dataMember,VARIANT *hierarchy,IDispatch **ppRecordset);
  void __RPC_STUB IHTMLGenericElement_namedRecordset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLGenericElement_DISPINTERFACE_DEFINED__
#define __DispHTMLGenericElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLGenericElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLGenericElement : public IDispatch {
  };
#else
  typedef struct DispHTMLGenericElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLGenericElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLGenericElement *This);
      ULONG (WINAPI *Release)(DispHTMLGenericElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLGenericElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLGenericElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLGenericElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLGenericElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLGenericElement;
#ifdef __cplusplus
  class HTMLGenericElement;
#endif

#ifndef __IHTMLStyleSheetRule_INTERFACE_DEFINED__
#define __IHTMLStyleSheetRule_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLStyleSheetRule;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLStyleSheetRule : public IDispatch {
  public:
    virtual HRESULT WINAPI put_selectorText(BSTR v) = 0;
    virtual HRESULT WINAPI get_selectorText(BSTR *p) = 0;
    virtual HRESULT WINAPI get_style(IHTMLRuleStyle **p) = 0;
    virtual HRESULT WINAPI get_readOnly(VARIANT_BOOL *p) = 0;
  };
#else
  typedef struct IHTMLStyleSheetRuleVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLStyleSheetRule *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLStyleSheetRule *This);
      ULONG (WINAPI *Release)(IHTMLStyleSheetRule *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLStyleSheetRule *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLStyleSheetRule *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLStyleSheetRule *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLStyleSheetRule *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_selectorText)(IHTMLStyleSheetRule *This,BSTR v);
      HRESULT (WINAPI *get_selectorText)(IHTMLStyleSheetRule *This,BSTR *p);
      HRESULT (WINAPI *get_style)(IHTMLStyleSheetRule *This,IHTMLRuleStyle **p);
      HRESULT (WINAPI *get_readOnly)(IHTMLStyleSheetRule *This,VARIANT_BOOL *p);
    END_INTERFACE
  } IHTMLStyleSheetRuleVtbl;
  interface IHTMLStyleSheetRule {
    CONST_VTBL struct IHTMLStyleSheetRuleVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLStyleSheetRule_put_selectorText_Proxy(IHTMLStyleSheetRule *This,BSTR v);
  void __RPC_STUB IHTMLStyleSheetRule_put_selectorText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheetRule_get_selectorText_Proxy(IHTMLStyleSheetRule *This,BSTR *p);
  void __RPC_STUB IHTMLStyleSheetRule_get_selectorText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheetRule_get_style_Proxy(IHTMLStyleSheetRule *This,IHTMLRuleStyle **p);
  void __RPC_STUB IHTMLStyleSheetRule_get_style_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheetRule_get_readOnly_Proxy(IHTMLStyleSheetRule *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLStyleSheetRule_get_readOnly_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLStyleSheetRulesCollection_INTERFACE_DEFINED__
#define __IHTMLStyleSheetRulesCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLStyleSheetRulesCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLStyleSheetRulesCollection : public IDispatch {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI item(long index,IHTMLStyleSheetRule **ppHTMLStyleSheetRule) = 0;
  };
#else
  typedef struct IHTMLStyleSheetRulesCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLStyleSheetRulesCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLStyleSheetRulesCollection *This);
      ULONG (WINAPI *Release)(IHTMLStyleSheetRulesCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLStyleSheetRulesCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLStyleSheetRulesCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLStyleSheetRulesCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLStyleSheetRulesCollection *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_length)(IHTMLStyleSheetRulesCollection *This,long *p);
      HRESULT (WINAPI *item)(IHTMLStyleSheetRulesCollection *This,long index,IHTMLStyleSheetRule **ppHTMLStyleSheetRule);
    END_INTERFACE
  } IHTMLStyleSheetRulesCollectionVtbl;
  interface IHTMLStyleSheetRulesCollection {
    CONST_VTBL struct IHTMLStyleSheetRulesCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLStyleSheetRulesCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLStyleSheetRulesCollection_item(This,index,ppHTMLStyleSheetRule) (This)->lpVtbl->item(This,index,ppHTMLStyleSheetRule)
#endif
#endif
  HRESULT WINAPI IHTMLStyleSheetRulesCollection_get_length_Proxy(IHTMLStyleSheetRulesCollection *This,long *p);
  void __RPC_STUB IHTMLStyleSheetRulesCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheetRulesCollection_item_Proxy(IHTMLStyleSheetRulesCollection *This,long index,IHTMLStyleSheetRule **ppHTMLStyleSheetRule);
  void __RPC_STUB IHTMLStyleSheetRulesCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif
  EXTERN_C const CLSID CLSID_HTMLStyleSheetRule;
#ifdef __cplusplus
  class HTMLStyleSheetRule;
#endif
  EXTERN_C const CLSID CLSID_HTMLStyleSheetRulesCollection;
#ifdef __cplusplus
  class HTMLStyleSheetRulesCollection;
#endif

#ifndef __IHTMLStyleSheetPage_INTERFACE_DEFINED__
#define __IHTMLStyleSheetPage_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLStyleSheetPage;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLStyleSheetPage : public IDispatch {
  public:
    virtual HRESULT WINAPI get_selector(BSTR *p) = 0;
    virtual HRESULT WINAPI get_pseudoClass(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLStyleSheetPageVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLStyleSheetPage *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLStyleSheetPage *This);
      ULONG (WINAPI *Release)(IHTMLStyleSheetPage *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLStyleSheetPage *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLStyleSheetPage *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLStyleSheetPage *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLStyleSheetPage *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_selector)(IHTMLStyleSheetPage *This,BSTR *p);
      HRESULT (WINAPI *get_pseudoClass)(IHTMLStyleSheetPage *This,BSTR *p);
    END_INTERFACE
  } IHTMLStyleSheetPageVtbl;
  interface IHTMLStyleSheetPage {
    CONST_VTBL struct IHTMLStyleSheetPageVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLStyleSheetPage_get_selector(This,p) (This)->lpVtbl->get_selector(This,p)
#define IHTMLStyleSheetPage_get_pseudoClass(This,p) (This)->lpVtbl->get_pseudoClass(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLStyleSheetPage_get_selector_Proxy(IHTMLStyleSheetPage *This,BSTR *p);
  void __RPC_STUB IHTMLStyleSheetPage_get_selector_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheetPage_get_pseudoClass_Proxy(IHTMLStyleSheetPage *This,BSTR *p);
  void __RPC_STUB IHTMLStyleSheetPage_get_pseudoClass_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLStyleSheetPagesCollection_INTERFACE_DEFINED__
#define __IHTMLStyleSheetPagesCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLStyleSheetPagesCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLStyleSheetPagesCollection : public IDispatch {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI item(long index,IHTMLStyleSheetPage **ppHTMLStyleSheetPage) = 0;
  };
#else
  typedef struct IHTMLStyleSheetPagesCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLStyleSheetPagesCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLStyleSheetPagesCollection *This);
      ULONG (WINAPI *Release)(IHTMLStyleSheetPagesCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLStyleSheetPagesCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLStyleSheetPagesCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLStyleSheetPagesCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLStyleSheetPagesCollection *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_length)(IHTMLStyleSheetPagesCollection *This,long *p);
      HRESULT (WINAPI *item)(IHTMLStyleSheetPagesCollection *This,long index,IHTMLStyleSheetPage **ppHTMLStyleSheetPage);
    END_INTERFACE
  } IHTMLStyleSheetPagesCollectionVtbl;
  interface IHTMLStyleSheetPagesCollection {
    CONST_VTBL struct IHTMLStyleSheetPagesCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLStyleSheetPagesCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLStyleSheetPagesCollection_item(This,index,ppHTMLStyleSheetPage) (This)->lpVtbl->item(This,index,ppHTMLStyleSheetPage)
#endif
#endif
  HRESULT WINAPI IHTMLStyleSheetPagesCollection_get_length_Proxy(IHTMLStyleSheetPagesCollection *This,long *p);
  void __RPC_STUB IHTMLStyleSheetPagesCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheetPagesCollection_item_Proxy(IHTMLStyleSheetPagesCollection *This,long index,IHTMLStyleSheetPage **ppHTMLStyleSheetPage);
  void __RPC_STUB IHTMLStyleSheetPagesCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif
  EXTERN_C const CLSID CLSID_HTMLStyleSheetPage;
#ifdef __cplusplus
  class HTMLStyleSheetPage;
#endif
  EXTERN_C const CLSID CLSID_HTMLStyleSheetPagesCollection;
#ifdef __cplusplus
  class HTMLStyleSheetPagesCollection;
#endif

#ifndef __IHTMLStyleSheetsCollection_INTERFACE_DEFINED__
#define __IHTMLStyleSheetsCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLStyleSheetsCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLStyleSheetsCollection : public IDispatch {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;
    virtual HRESULT WINAPI item(VARIANT *pvarIndex,VARIANT *pvarResult) = 0;
  };
#else
  typedef struct IHTMLStyleSheetsCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLStyleSheetsCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLStyleSheetsCollection *This);
      ULONG (WINAPI *Release)(IHTMLStyleSheetsCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLStyleSheetsCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLStyleSheetsCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLStyleSheetsCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLStyleSheetsCollection *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_length)(IHTMLStyleSheetsCollection *This,long *p);
      HRESULT (WINAPI *get__newEnum)(IHTMLStyleSheetsCollection *This,IUnknown **p);
      HRESULT (WINAPI *item)(IHTMLStyleSheetsCollection *This,VARIANT *pvarIndex,VARIANT *pvarResult);
    END_INTERFACE
  } IHTMLStyleSheetsCollectionVtbl;
  interface IHTMLStyleSheetsCollection {
    CONST_VTBL struct IHTMLStyleSheetsCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLStyleSheetsCollection_get_length_Proxy(IHTMLStyleSheetsCollection *This,long *p);
  void __RPC_STUB IHTMLStyleSheetsCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheetsCollection_get__newEnum_Proxy(IHTMLStyleSheetsCollection *This,IUnknown **p);
  void __RPC_STUB IHTMLStyleSheetsCollection_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheetsCollection_item_Proxy(IHTMLStyleSheetsCollection *This,VARIANT *pvarIndex,VARIANT *pvarResult);
  void __RPC_STUB IHTMLStyleSheetsCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLStyleSheet_INTERFACE_DEFINED__
#define __IHTMLStyleSheet_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLStyleSheet;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLStyleSheet : public IDispatch {
  public:
    virtual HRESULT WINAPI put_title(BSTR v) = 0;
    virtual HRESULT WINAPI get_title(BSTR *p) = 0;
    virtual HRESULT WINAPI get_parentStyleSheet(IHTMLStyleSheet **p) = 0;
    virtual HRESULT WINAPI get_owningElement(IHTMLElement **p) = 0;
    virtual HRESULT WINAPI put_disabled(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_disabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_readOnly(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_imports(IHTMLStyleSheetsCollection **p) = 0;
    virtual HRESULT WINAPI put_href(BSTR v) = 0;
    virtual HRESULT WINAPI get_href(BSTR *p) = 0;
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI get_id(BSTR *p) = 0;
    virtual HRESULT WINAPI addImport(BSTR bstrURL,long lIndex,long *plIndex) = 0;
    virtual HRESULT WINAPI addRule(BSTR bstrSelector,BSTR bstrStyle,long lIndex,long *plNewIndex) = 0;
    virtual HRESULT WINAPI removeImport(long lIndex) = 0;
    virtual HRESULT WINAPI removeRule(long lIndex) = 0;
    virtual HRESULT WINAPI put_media(BSTR v) = 0;
    virtual HRESULT WINAPI get_media(BSTR *p) = 0;
    virtual HRESULT WINAPI put_cssText(BSTR v) = 0;
    virtual HRESULT WINAPI get_cssText(BSTR *p) = 0;
    virtual HRESULT WINAPI get_rules(IHTMLStyleSheetRulesCollection **p) = 0;
  };
#else
  typedef struct IHTMLStyleSheetVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLStyleSheet *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLStyleSheet *This);
      ULONG (WINAPI *Release)(IHTMLStyleSheet *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLStyleSheet *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLStyleSheet *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLStyleSheet *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLStyleSheet *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_title)(IHTMLStyleSheet *This,BSTR v);
      HRESULT (WINAPI *get_title)(IHTMLStyleSheet *This,BSTR *p);
      HRESULT (WINAPI *get_parentStyleSheet)(IHTMLStyleSheet *This,IHTMLStyleSheet **p);
      HRESULT (WINAPI *get_owningElement)(IHTMLStyleSheet *This,IHTMLElement **p);
      HRESULT (WINAPI *put_disabled)(IHTMLStyleSheet *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_disabled)(IHTMLStyleSheet *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_readOnly)(IHTMLStyleSheet *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_imports)(IHTMLStyleSheet *This,IHTMLStyleSheetsCollection **p);
      HRESULT (WINAPI *put_href)(IHTMLStyleSheet *This,BSTR v);
      HRESULT (WINAPI *get_href)(IHTMLStyleSheet *This,BSTR *p);
      HRESULT (WINAPI *get_type)(IHTMLStyleSheet *This,BSTR *p);
      HRESULT (WINAPI *get_id)(IHTMLStyleSheet *This,BSTR *p);
      HRESULT (WINAPI *addImport)(IHTMLStyleSheet *This,BSTR bstrURL,long lIndex,long *plIndex);
      HRESULT (WINAPI *addRule)(IHTMLStyleSheet *This,BSTR bstrSelector,BSTR bstrStyle,long lIndex,long *plNewIndex);
      HRESULT (WINAPI *removeImport)(IHTMLStyleSheet *This,long lIndex);
      HRESULT (WINAPI *removeRule)(IHTMLStyleSheet *This,long lIndex);
      HRESULT (WINAPI *put_media)(IHTMLStyleSheet *This,BSTR v);
      HRESULT (WINAPI *get_media)(IHTMLStyleSheet *This,BSTR *p);
      HRESULT (WINAPI *put_cssText)(IHTMLStyleSheet *This,BSTR v);
      HRESULT (WINAPI *get_cssText)(IHTMLStyleSheet *This,BSTR *p);
      HRESULT (WINAPI *get_rules)(IHTMLStyleSheet *This,IHTMLStyleSheetRulesCollection **p);
    END_INTERFACE
  } IHTMLStyleSheetVtbl;
  interface IHTMLStyleSheet {
    CONST_VTBL struct IHTMLStyleSheetVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLStyleSheet_put_title_Proxy(IHTMLStyleSheet *This,BSTR v);
  void __RPC_STUB IHTMLStyleSheet_put_title_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_get_title_Proxy(IHTMLStyleSheet *This,BSTR *p);
  void __RPC_STUB IHTMLStyleSheet_get_title_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_get_parentStyleSheet_Proxy(IHTMLStyleSheet *This,IHTMLStyleSheet **p);
  void __RPC_STUB IHTMLStyleSheet_get_parentStyleSheet_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_get_owningElement_Proxy(IHTMLStyleSheet *This,IHTMLElement **p);
  void __RPC_STUB IHTMLStyleSheet_get_owningElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_put_disabled_Proxy(IHTMLStyleSheet *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLStyleSheet_put_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_get_disabled_Proxy(IHTMLStyleSheet *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLStyleSheet_get_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_get_readOnly_Proxy(IHTMLStyleSheet *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLStyleSheet_get_readOnly_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_get_imports_Proxy(IHTMLStyleSheet *This,IHTMLStyleSheetsCollection **p);
  void __RPC_STUB IHTMLStyleSheet_get_imports_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_put_href_Proxy(IHTMLStyleSheet *This,BSTR v);
  void __RPC_STUB IHTMLStyleSheet_put_href_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_get_href_Proxy(IHTMLStyleSheet *This,BSTR *p);
  void __RPC_STUB IHTMLStyleSheet_get_href_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_get_type_Proxy(IHTMLStyleSheet *This,BSTR *p);
  void __RPC_STUB IHTMLStyleSheet_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_get_id_Proxy(IHTMLStyleSheet *This,BSTR *p);
  void __RPC_STUB IHTMLStyleSheet_get_id_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_addImport_Proxy(IHTMLStyleSheet *This,BSTR bstrURL,long lIndex,long *plIndex);
  void __RPC_STUB IHTMLStyleSheet_addImport_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_addRule_Proxy(IHTMLStyleSheet *This,BSTR bstrSelector,BSTR bstrStyle,long lIndex,long *plNewIndex);
  void __RPC_STUB IHTMLStyleSheet_addRule_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_removeImport_Proxy(IHTMLStyleSheet *This,long lIndex);
  void __RPC_STUB IHTMLStyleSheet_removeImport_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_removeRule_Proxy(IHTMLStyleSheet *This,long lIndex);
  void __RPC_STUB IHTMLStyleSheet_removeRule_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_put_media_Proxy(IHTMLStyleSheet *This,BSTR v);
  void __RPC_STUB IHTMLStyleSheet_put_media_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_get_media_Proxy(IHTMLStyleSheet *This,BSTR *p);
  void __RPC_STUB IHTMLStyleSheet_get_media_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_put_cssText_Proxy(IHTMLStyleSheet *This,BSTR v);
  void __RPC_STUB IHTMLStyleSheet_put_cssText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_get_cssText_Proxy(IHTMLStyleSheet *This,BSTR *p);
  void __RPC_STUB IHTMLStyleSheet_get_cssText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet_get_rules_Proxy(IHTMLStyleSheet *This,IHTMLStyleSheetRulesCollection **p);
  void __RPC_STUB IHTMLStyleSheet_get_rules_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLStyleSheet2_INTERFACE_DEFINED__
#define __IHTMLStyleSheet2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLStyleSheet2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLStyleSheet2 : public IDispatch {
  public:
    virtual HRESULT WINAPI get_pages(IHTMLStyleSheetPagesCollection **p) = 0;
    virtual HRESULT WINAPI addPageRule(BSTR bstrSelector,BSTR bstrStyle,long lIndex,long *plNewIndex) = 0;
  };
#else
  typedef struct IHTMLStyleSheet2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLStyleSheet2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLStyleSheet2 *This);
      ULONG (WINAPI *Release)(IHTMLStyleSheet2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLStyleSheet2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLStyleSheet2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLStyleSheet2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLStyleSheet2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_pages)(IHTMLStyleSheet2 *This,IHTMLStyleSheetPagesCollection **p);
      HRESULT (WINAPI *addPageRule)(IHTMLStyleSheet2 *This,BSTR bstrSelector,BSTR bstrStyle,long lIndex,long *plNewIndex);
    END_INTERFACE
  } IHTMLStyleSheet2Vtbl;
  interface IHTMLStyleSheet2 {
    CONST_VTBL struct IHTMLStyleSheet2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLStyleSheet2_get_pages_Proxy(IHTMLStyleSheet2 *This,IHTMLStyleSheetPagesCollection **p);
  void __RPC_STUB IHTMLStyleSheet2_get_pages_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLStyleSheet2_addPageRule_Proxy(IHTMLStyleSheet2 *This,BSTR bstrSelector,BSTR bstrStyle,long lIndex,long *plNewIndex);
  void __RPC_STUB IHTMLStyleSheet2_addPageRule_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLStyleSheet_DISPINTERFACE_DEFINED__
#define __DispHTMLStyleSheet_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLStyleSheet;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct  DispHTMLStyleSheet : public IDispatch {
  };
#else
  typedef struct DispHTMLStyleSheetVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLStyleSheet *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLStyleSheet *This);
      ULONG (WINAPI *Release)(DispHTMLStyleSheet *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLStyleSheet *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLStyleSheet *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLStyleSheet *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLStyleSheetVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLStyleSheet;
#ifdef __cplusplus
  class HTMLStyleSheet;
#endif
  EXTERN_C const CLSID CLSID_HTMLStyleSheetsCollection;
#ifdef __cplusplus
  class HTMLStyleSheetsCollection;
#endif

#ifndef __HTMLLinkElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLLinkElementEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLLinkElementEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLLinkElementEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLLinkElementEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLLinkElementEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLLinkElementEvents2 *This);
      ULONG (WINAPI *Release)(HTMLLinkElementEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLLinkElementEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLLinkElementEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLLinkElementEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLLinkElementEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLLinkElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLLinkElementEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLLinkElementEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLLinkElementEvents : public IDispatch {
  };
#else
  typedef struct HTMLLinkElementEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLLinkElementEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLLinkElementEvents *This);
      ULONG (WINAPI *Release)(HTMLLinkElementEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLLinkElementEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLLinkElementEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLLinkElementEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLLinkElementEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __IHTMLLinkElement_INTERFACE_DEFINED__
#define __IHTMLLinkElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLLinkElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLLinkElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_href(BSTR v) = 0;
    virtual HRESULT WINAPI get_href(BSTR *p) = 0;
    virtual HRESULT WINAPI put_rel(BSTR v) = 0;
    virtual HRESULT WINAPI get_rel(BSTR *p) = 0;
    virtual HRESULT WINAPI put_rev(BSTR v) = 0;
    virtual HRESULT WINAPI get_rev(BSTR *p) = 0;
    virtual HRESULT WINAPI put_type(BSTR v) = 0;
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI get_readyState(BSTR *p) = 0;
    virtual HRESULT WINAPI put_onreadystatechange(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onreadystatechange(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onload(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onload(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onerror(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onerror(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_styleSheet(IHTMLStyleSheet **p) = 0;
    virtual HRESULT WINAPI put_disabled(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_disabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_media(BSTR v) = 0;
    virtual HRESULT WINAPI get_media(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLLinkElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLLinkElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLLinkElement *This);
      ULONG (WINAPI *Release)(IHTMLLinkElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLLinkElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLLinkElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLLinkElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLLinkElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_href)(IHTMLLinkElement *This,BSTR v);
      HRESULT (WINAPI *get_href)(IHTMLLinkElement *This,BSTR *p);
      HRESULT (WINAPI *put_rel)(IHTMLLinkElement *This,BSTR v);
      HRESULT (WINAPI *get_rel)(IHTMLLinkElement *This,BSTR *p);
      HRESULT (WINAPI *put_rev)(IHTMLLinkElement *This,BSTR v);
      HRESULT (WINAPI *get_rev)(IHTMLLinkElement *This,BSTR *p);
      HRESULT (WINAPI *put_type)(IHTMLLinkElement *This,BSTR v);
      HRESULT (WINAPI *get_type)(IHTMLLinkElement *This,BSTR *p);
      HRESULT (WINAPI *get_readyState)(IHTMLLinkElement *This,BSTR *p);
      HRESULT (WINAPI *put_onreadystatechange)(IHTMLLinkElement *This,VARIANT v);
      HRESULT (WINAPI *get_onreadystatechange)(IHTMLLinkElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onload)(IHTMLLinkElement *This,VARIANT v);
      HRESULT (WINAPI *get_onload)(IHTMLLinkElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onerror)(IHTMLLinkElement *This,VARIANT v);
      HRESULT (WINAPI *get_onerror)(IHTMLLinkElement *This,VARIANT *p);
      HRESULT (WINAPI *get_styleSheet)(IHTMLLinkElement *This,IHTMLStyleSheet **p);
      HRESULT (WINAPI *put_disabled)(IHTMLLinkElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_disabled)(IHTMLLinkElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_media)(IHTMLLinkElement *This,BSTR v);
      HRESULT (WINAPI *get_media)(IHTMLLinkElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLLinkElementVtbl;
  interface IHTMLLinkElement {
    CONST_VTBL struct IHTMLLinkElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLLinkElement_put_href_Proxy(IHTMLLinkElement *This,BSTR v);
  void __RPC_STUB IHTMLLinkElement_put_href_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_get_href_Proxy(IHTMLLinkElement *This,BSTR *p);
  void __RPC_STUB IHTMLLinkElement_get_href_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_put_rel_Proxy(IHTMLLinkElement *This,BSTR v);
  void __RPC_STUB IHTMLLinkElement_put_rel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_get_rel_Proxy(IHTMLLinkElement *This,BSTR *p);
  void __RPC_STUB IHTMLLinkElement_get_rel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_put_rev_Proxy(IHTMLLinkElement *This,BSTR v);
  void __RPC_STUB IHTMLLinkElement_put_rev_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_get_rev_Proxy(IHTMLLinkElement *This,BSTR *p);
  void __RPC_STUB IHTMLLinkElement_get_rev_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_put_type_Proxy(IHTMLLinkElement *This,BSTR v);
  void __RPC_STUB IHTMLLinkElement_put_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_get_type_Proxy(IHTMLLinkElement *This,BSTR *p);
  void __RPC_STUB IHTMLLinkElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_get_readyState_Proxy(IHTMLLinkElement *This,BSTR *p);
  void __RPC_STUB IHTMLLinkElement_get_readyState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_put_onreadystatechange_Proxy(IHTMLLinkElement *This,VARIANT v);
  void __RPC_STUB IHTMLLinkElement_put_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_get_onreadystatechange_Proxy(IHTMLLinkElement *This,VARIANT *p);
  void __RPC_STUB IHTMLLinkElement_get_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_put_onload_Proxy(IHTMLLinkElement *This,VARIANT v);
  void __RPC_STUB IHTMLLinkElement_put_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_get_onload_Proxy(IHTMLLinkElement *This,VARIANT *p);
  void __RPC_STUB IHTMLLinkElement_get_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_put_onerror_Proxy(IHTMLLinkElement *This,VARIANT v);
  void __RPC_STUB IHTMLLinkElement_put_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_get_onerror_Proxy(IHTMLLinkElement *This,VARIANT *p);
  void __RPC_STUB IHTMLLinkElement_get_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_get_styleSheet_Proxy(IHTMLLinkElement *This,IHTMLStyleSheet **p);
  void __RPC_STUB IHTMLLinkElement_get_styleSheet_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_put_disabled_Proxy(IHTMLLinkElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLLinkElement_put_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_get_disabled_Proxy(IHTMLLinkElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLLinkElement_get_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_put_media_Proxy(IHTMLLinkElement *This,BSTR v);
  void __RPC_STUB IHTMLLinkElement_put_media_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement_get_media_Proxy(IHTMLLinkElement *This,BSTR *p);
  void __RPC_STUB IHTMLLinkElement_get_media_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLLinkElement2_INTERFACE_DEFINED__
#define __IHTMLLinkElement2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLLinkElement2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLLinkElement2 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_target(BSTR v) = 0;
    virtual HRESULT WINAPI get_target(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLLinkElement2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLLinkElement2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLLinkElement2 *This);
      ULONG (WINAPI *Release)(IHTMLLinkElement2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLLinkElement2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLLinkElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLLinkElement2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLLinkElement2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_target)(IHTMLLinkElement2 *This,BSTR v);
      HRESULT (WINAPI *get_target)(IHTMLLinkElement2 *This,BSTR *p);
    END_INTERFACE
  } IHTMLLinkElement2Vtbl;
  interface IHTMLLinkElement2 {
    CONST_VTBL struct IHTMLLinkElement2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLLinkElement2_put_target(This,v) (This)->lpVtbl->put_target(This,v)
#define IHTMLLinkElement2_get_target(This,p) (This)->lpVtbl->get_target(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLLinkElement2_put_target_Proxy(IHTMLLinkElement2 *This,BSTR v);
  void __RPC_STUB IHTMLLinkElement2_put_target_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement2_get_target_Proxy(IHTMLLinkElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLLinkElement2_get_target_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLLinkElement3_INTERFACE_DEFINED__
#define __IHTMLLinkElement3_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLLinkElement3;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLLinkElement3 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_charset(BSTR v) = 0;
    virtual HRESULT WINAPI get_charset(BSTR *p) = 0;
    virtual HRESULT WINAPI put_hreflang(BSTR v) = 0;
    virtual HRESULT WINAPI get_hreflang(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLLinkElement3Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLLinkElement3 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLLinkElement3 *This);
      ULONG (WINAPI *Release)(IHTMLLinkElement3 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLLinkElement3 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLLinkElement3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLLinkElement3 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLLinkElement3 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_charset)(IHTMLLinkElement3 *This,BSTR v);
      HRESULT (WINAPI *get_charset)(IHTMLLinkElement3 *This,BSTR *p);
      HRESULT (WINAPI *put_hreflang)(IHTMLLinkElement3 *This,BSTR v);
      HRESULT (WINAPI *get_hreflang)(IHTMLLinkElement3 *This,BSTR *p);
    END_INTERFACE
  } IHTMLLinkElement3Vtbl;
  interface IHTMLLinkElement3 {
    CONST_VTBL struct IHTMLLinkElement3Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLLinkElement3_put_charset_Proxy(IHTMLLinkElement3 *This,BSTR v);
  void __RPC_STUB IHTMLLinkElement3_put_charset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement3_get_charset_Proxy(IHTMLLinkElement3 *This,BSTR *p);
  void __RPC_STUB IHTMLLinkElement3_get_charset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement3_put_hreflang_Proxy(IHTMLLinkElement3 *This,BSTR v);
  void __RPC_STUB IHTMLLinkElement3_put_hreflang_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLinkElement3_get_hreflang_Proxy(IHTMLLinkElement3 *This,BSTR *p);
  void __RPC_STUB IHTMLLinkElement3_get_hreflang_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLLinkElement_DISPINTERFACE_DEFINED__
#define __DispHTMLLinkElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLLinkElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLLinkElement : public IDispatch {
  };
#else
  typedef struct DispHTMLLinkElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLLinkElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLLinkElement *This);
      ULONG (WINAPI *Release)(DispHTMLLinkElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLLinkElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLLinkElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLLinkElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLLinkElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLLinkElement;
#ifdef __cplusplus
  class HTMLLinkElement;
#endif

#ifndef __IHTMLTxtRange_INTERFACE_DEFINED__
#define __IHTMLTxtRange_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLTxtRange;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLTxtRange : public IDispatch {
  public:
    virtual HRESULT WINAPI get_htmlText(BSTR *p) = 0;
    virtual HRESULT WINAPI put_text(BSTR v) = 0;
    virtual HRESULT WINAPI get_text(BSTR *p) = 0;
    virtual HRESULT WINAPI parentElement(IHTMLElement **parent) = 0;
    virtual HRESULT WINAPI duplicate(IHTMLTxtRange **Duplicate) = 0;
    virtual HRESULT WINAPI inRange(IHTMLTxtRange *Range,VARIANT_BOOL *InRange) = 0;
    virtual HRESULT WINAPI isEqual(IHTMLTxtRange *Range,VARIANT_BOOL *IsEqual) = 0;
    virtual HRESULT WINAPI scrollIntoView(VARIANT_BOOL fStart = -1) = 0;
    virtual HRESULT WINAPI collapse(VARIANT_BOOL Start = -1) = 0;
    virtual HRESULT WINAPI expand(BSTR Unit,VARIANT_BOOL *Success) = 0;
    virtual HRESULT WINAPI move(BSTR Unit,long Count,long *ActualCount) = 0;
    virtual HRESULT WINAPI moveStart(BSTR Unit,long Count,long *ActualCount) = 0;
    virtual HRESULT WINAPI moveEnd(BSTR Unit,long Count,long *ActualCount) = 0;
    virtual HRESULT WINAPI select(void) = 0;
    virtual HRESULT WINAPI pasteHTML(BSTR html) = 0;
    virtual HRESULT WINAPI moveToElementText(IHTMLElement *element) = 0;
    virtual HRESULT WINAPI setEndPoint(BSTR how,IHTMLTxtRange *SourceRange) = 0;
    virtual HRESULT WINAPI compareEndPoints(BSTR how,IHTMLTxtRange *SourceRange,long *ret) = 0;
    virtual HRESULT WINAPI findText(BSTR String,long count,long Flags,VARIANT_BOOL *Success) = 0;
    virtual HRESULT WINAPI moveToPoint(long x,long y) = 0;
    virtual HRESULT WINAPI getBookmark(BSTR *Boolmark) = 0;
    virtual HRESULT WINAPI moveToBookmark(BSTR Bookmark,VARIANT_BOOL *Success) = 0;
    virtual HRESULT WINAPI queryCommandSupported(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI queryCommandEnabled(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI queryCommandState(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI queryCommandIndeterm(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI queryCommandText(BSTR cmdID,BSTR *pcmdText) = 0;
    virtual HRESULT WINAPI queryCommandValue(BSTR cmdID,VARIANT *pcmdValue) = 0;
    virtual HRESULT WINAPI execCommand(BSTR cmdID,VARIANT_BOOL showUI,VARIANT value,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI execCommandShowHelp(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
  };
#else
  typedef struct IHTMLTxtRangeVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLTxtRange *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLTxtRange *This);
      ULONG (WINAPI *Release)(IHTMLTxtRange *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTxtRange *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLTxtRange *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLTxtRange *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLTxtRange *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_htmlText)(IHTMLTxtRange *This,BSTR *p);
      HRESULT (WINAPI *put_text)(IHTMLTxtRange *This,BSTR v);
      HRESULT (WINAPI *get_text)(IHTMLTxtRange *This,BSTR *p);
      HRESULT (WINAPI *parentElement)(IHTMLTxtRange *This,IHTMLElement **parent);
      HRESULT (WINAPI *duplicate)(IHTMLTxtRange *This,IHTMLTxtRange **Duplicate);
      HRESULT (WINAPI *inRange)(IHTMLTxtRange *This,IHTMLTxtRange *Range,VARIANT_BOOL *InRange);
      HRESULT (WINAPI *isEqual)(IHTMLTxtRange *This,IHTMLTxtRange *Range,VARIANT_BOOL *IsEqual);
      HRESULT (WINAPI *scrollIntoView)(IHTMLTxtRange *This,VARIANT_BOOL fStart);
      HRESULT (WINAPI *collapse)(IHTMLTxtRange *This,VARIANT_BOOL Start);
      HRESULT (WINAPI *expand)(IHTMLTxtRange *This,BSTR Unit,VARIANT_BOOL *Success);
      HRESULT (WINAPI *move)(IHTMLTxtRange *This,BSTR Unit,long Count,long *ActualCount);
      HRESULT (WINAPI *moveStart)(IHTMLTxtRange *This,BSTR Unit,long Count,long *ActualCount);
      HRESULT (WINAPI *moveEnd)(IHTMLTxtRange *This,BSTR Unit,long Count,long *ActualCount);
      HRESULT (WINAPI *select)(IHTMLTxtRange *This);
      HRESULT (WINAPI *pasteHTML)(IHTMLTxtRange *This,BSTR html);
      HRESULT (WINAPI *moveToElementText)(IHTMLTxtRange *This,IHTMLElement *element);
      HRESULT (WINAPI *setEndPoint)(IHTMLTxtRange *This,BSTR how,IHTMLTxtRange *SourceRange);
      HRESULT (WINAPI *compareEndPoints)(IHTMLTxtRange *This,BSTR how,IHTMLTxtRange *SourceRange,long *ret);
      HRESULT (WINAPI *findText)(IHTMLTxtRange *This,BSTR String,long count,long Flags,VARIANT_BOOL *Success);
      HRESULT (WINAPI *moveToPoint)(IHTMLTxtRange *This,long x,long y);
      HRESULT (WINAPI *getBookmark)(IHTMLTxtRange *This,BSTR *Boolmark);
      HRESULT (WINAPI *moveToBookmark)(IHTMLTxtRange *This,BSTR Bookmark,VARIANT_BOOL *Success);
      HRESULT (WINAPI *queryCommandSupported)(IHTMLTxtRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *queryCommandEnabled)(IHTMLTxtRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *queryCommandState)(IHTMLTxtRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *queryCommandIndeterm)(IHTMLTxtRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *queryCommandText)(IHTMLTxtRange *This,BSTR cmdID,BSTR *pcmdText);
      HRESULT (WINAPI *queryCommandValue)(IHTMLTxtRange *This,BSTR cmdID,VARIANT *pcmdValue);
      HRESULT (WINAPI *execCommand)(IHTMLTxtRange *This,BSTR cmdID,VARIANT_BOOL showUI,VARIANT value,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *execCommandShowHelp)(IHTMLTxtRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
    END_INTERFACE
  } IHTMLTxtRangeVtbl;
  interface IHTMLTxtRange {
    CONST_VTBL struct IHTMLTxtRangeVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLTxtRange_get_htmlText_Proxy(IHTMLTxtRange *This,BSTR *p);
  void __RPC_STUB IHTMLTxtRange_get_htmlText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_put_text_Proxy(IHTMLTxtRange *This,BSTR v);
  void __RPC_STUB IHTMLTxtRange_put_text_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_get_text_Proxy(IHTMLTxtRange *This,BSTR *p);
  void __RPC_STUB IHTMLTxtRange_get_text_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_parentElement_Proxy(IHTMLTxtRange *This,IHTMLElement **parent);
  void __RPC_STUB IHTMLTxtRange_parentElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_duplicate_Proxy(IHTMLTxtRange *This,IHTMLTxtRange **Duplicate);
  void __RPC_STUB IHTMLTxtRange_duplicate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_inRange_Proxy(IHTMLTxtRange *This,IHTMLTxtRange *Range,VARIANT_BOOL *InRange);
  void __RPC_STUB IHTMLTxtRange_inRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_isEqual_Proxy(IHTMLTxtRange *This,IHTMLTxtRange *Range,VARIANT_BOOL *IsEqual);
  void __RPC_STUB IHTMLTxtRange_isEqual_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_scrollIntoView_Proxy(IHTMLTxtRange *This,VARIANT_BOOL fStart);
  void __RPC_STUB IHTMLTxtRange_scrollIntoView_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_collapse_Proxy(IHTMLTxtRange *This,VARIANT_BOOL Start);
  void __RPC_STUB IHTMLTxtRange_collapse_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_expand_Proxy(IHTMLTxtRange *This,BSTR Unit,VARIANT_BOOL *Success);
  void __RPC_STUB IHTMLTxtRange_expand_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_move_Proxy(IHTMLTxtRange *This,BSTR Unit,long Count,long *ActualCount);
  void __RPC_STUB IHTMLTxtRange_move_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_moveStart_Proxy(IHTMLTxtRange *This,BSTR Unit,long Count,long *ActualCount);
  void __RPC_STUB IHTMLTxtRange_moveStart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_moveEnd_Proxy(IHTMLTxtRange *This,BSTR Unit,long Count,long *ActualCount);
  void __RPC_STUB IHTMLTxtRange_moveEnd_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_select_Proxy(IHTMLTxtRange *This);
  void __RPC_STUB IHTMLTxtRange_select_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_pasteHTML_Proxy(IHTMLTxtRange *This,BSTR html);
  void __RPC_STUB IHTMLTxtRange_pasteHTML_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_moveToElementText_Proxy(IHTMLTxtRange *This,IHTMLElement *element);
  void __RPC_STUB IHTMLTxtRange_moveToElementText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_setEndPoint_Proxy(IHTMLTxtRange *This,BSTR how,IHTMLTxtRange *SourceRange);
  void __RPC_STUB IHTMLTxtRange_setEndPoint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_compareEndPoints_Proxy(IHTMLTxtRange *This,BSTR how,IHTMLTxtRange *SourceRange,long *ret);
  void __RPC_STUB IHTMLTxtRange_compareEndPoints_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_findText_Proxy(IHTMLTxtRange *This,BSTR String,long count,long Flags,VARIANT_BOOL *Success);
  void __RPC_STUB IHTMLTxtRange_findText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_moveToPoint_Proxy(IHTMLTxtRange *This,long x,long y);
  void __RPC_STUB IHTMLTxtRange_moveToPoint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_getBookmark_Proxy(IHTMLTxtRange *This,BSTR *Boolmark);
  void __RPC_STUB IHTMLTxtRange_getBookmark_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_moveToBookmark_Proxy(IHTMLTxtRange *This,BSTR Bookmark,VARIANT_BOOL *Success);
  void __RPC_STUB IHTMLTxtRange_moveToBookmark_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_queryCommandSupported_Proxy(IHTMLTxtRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLTxtRange_queryCommandSupported_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_queryCommandEnabled_Proxy(IHTMLTxtRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLTxtRange_queryCommandEnabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_queryCommandState_Proxy(IHTMLTxtRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLTxtRange_queryCommandState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_queryCommandIndeterm_Proxy(IHTMLTxtRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLTxtRange_queryCommandIndeterm_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_queryCommandText_Proxy(IHTMLTxtRange *This,BSTR cmdID,BSTR *pcmdText);
  void __RPC_STUB IHTMLTxtRange_queryCommandText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_queryCommandValue_Proxy(IHTMLTxtRange *This,BSTR cmdID,VARIANT *pcmdValue);
  void __RPC_STUB IHTMLTxtRange_queryCommandValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_execCommand_Proxy(IHTMLTxtRange *This,BSTR cmdID,VARIANT_BOOL showUI,VARIANT value,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLTxtRange_execCommand_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRange_execCommandShowHelp_Proxy(IHTMLTxtRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLTxtRange_execCommandShowHelp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTextRangeMetrics_INTERFACE_DEFINED__
#define __IHTMLTextRangeMetrics_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLTextRangeMetrics;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLTextRangeMetrics : public IDispatch {
  public:
    virtual HRESULT WINAPI get_offsetTop(long *p) = 0;
    virtual HRESULT WINAPI get_offsetLeft(long *p) = 0;
    virtual HRESULT WINAPI get_boundingTop(long *p) = 0;
    virtual HRESULT WINAPI get_boundingLeft(long *p) = 0;
    virtual HRESULT WINAPI get_boundingWidth(long *p) = 0;
    virtual HRESULT WINAPI get_boundingHeight(long *p) = 0;
  };
#else
  typedef struct IHTMLTextRangeMetricsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLTextRangeMetrics *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLTextRangeMetrics *This);
      ULONG (WINAPI *Release)(IHTMLTextRangeMetrics *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTextRangeMetrics *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLTextRangeMetrics *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLTextRangeMetrics *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLTextRangeMetrics *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_offsetTop)(IHTMLTextRangeMetrics *This,long *p);
      HRESULT (WINAPI *get_offsetLeft)(IHTMLTextRangeMetrics *This,long *p);
      HRESULT (WINAPI *get_boundingTop)(IHTMLTextRangeMetrics *This,long *p);
      HRESULT (WINAPI *get_boundingLeft)(IHTMLTextRangeMetrics *This,long *p);
      HRESULT (WINAPI *get_boundingWidth)(IHTMLTextRangeMetrics *This,long *p);
      HRESULT (WINAPI *get_boundingHeight)(IHTMLTextRangeMetrics *This,long *p);
    END_INTERFACE
  } IHTMLTextRangeMetricsVtbl;
  interface IHTMLTextRangeMetrics {
    CONST_VTBL struct IHTMLTextRangeMetricsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLTextRangeMetrics_get_offsetTop_Proxy(IHTMLTextRangeMetrics *This,long *p);
  void __RPC_STUB IHTMLTextRangeMetrics_get_offsetTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextRangeMetrics_get_offsetLeft_Proxy(IHTMLTextRangeMetrics *This,long *p);
  void __RPC_STUB IHTMLTextRangeMetrics_get_offsetLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextRangeMetrics_get_boundingTop_Proxy(IHTMLTextRangeMetrics *This,long *p);
  void __RPC_STUB IHTMLTextRangeMetrics_get_boundingTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextRangeMetrics_get_boundingLeft_Proxy(IHTMLTextRangeMetrics *This,long *p);
  void __RPC_STUB IHTMLTextRangeMetrics_get_boundingLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextRangeMetrics_get_boundingWidth_Proxy(IHTMLTextRangeMetrics *This,long *p);
  void __RPC_STUB IHTMLTextRangeMetrics_get_boundingWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextRangeMetrics_get_boundingHeight_Proxy(IHTMLTextRangeMetrics *This,long *p);
  void __RPC_STUB IHTMLTextRangeMetrics_get_boundingHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTextRangeMetrics2_INTERFACE_DEFINED__
#define __IHTMLTextRangeMetrics2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLTextRangeMetrics2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLTextRangeMetrics2 : public IDispatch {
  public:
    virtual HRESULT WINAPI getClientRects(IHTMLRectCollection **pRectCol) = 0;
    virtual HRESULT WINAPI getBoundingClientRect(IHTMLRect **pRect) = 0;
  };
#else
  typedef struct IHTMLTextRangeMetrics2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLTextRangeMetrics2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLTextRangeMetrics2 *This);
      ULONG (WINAPI *Release)(IHTMLTextRangeMetrics2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTextRangeMetrics2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLTextRangeMetrics2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLTextRangeMetrics2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLTextRangeMetrics2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *getClientRects)(IHTMLTextRangeMetrics2 *This,IHTMLRectCollection **pRectCol);
      HRESULT (WINAPI *getBoundingClientRect)(IHTMLTextRangeMetrics2 *This,IHTMLRect **pRect);
    END_INTERFACE
  } IHTMLTextRangeMetrics2Vtbl;
  interface IHTMLTextRangeMetrics2 {
    CONST_VTBL struct IHTMLTextRangeMetrics2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLTextRangeMetrics2_getClientRects(This,pRectCol) (This)->lpVtbl->getClientRects(This,pRectCol)
#define IHTMLTextRangeMetrics2_getBoundingClientRect(This,pRect) (This)->lpVtbl->getBoundingClientRect(This,pRect)
#endif
#endif
  HRESULT WINAPI IHTMLTextRangeMetrics2_getClientRects_Proxy(IHTMLTextRangeMetrics2 *This,IHTMLRectCollection **pRectCol);
  void __RPC_STUB IHTMLTextRangeMetrics2_getClientRects_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextRangeMetrics2_getBoundingClientRect_Proxy(IHTMLTextRangeMetrics2 *This,IHTMLRect **pRect);
  void __RPC_STUB IHTMLTextRangeMetrics2_getBoundingClientRect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTxtRangeCollection_INTERFACE_DEFINED__
#define __IHTMLTxtRangeCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLTxtRangeCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLTxtRangeCollection : public IDispatch {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;
    virtual HRESULT WINAPI item(VARIANT *pvarIndex,VARIANT *pvarResult) = 0;
  };
#else
  typedef struct IHTMLTxtRangeCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLTxtRangeCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLTxtRangeCollection *This);
      ULONG (WINAPI *Release)(IHTMLTxtRangeCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTxtRangeCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLTxtRangeCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLTxtRangeCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLTxtRangeCollection *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_length)(IHTMLTxtRangeCollection *This,long *p);
      HRESULT (WINAPI *get__newEnum)(IHTMLTxtRangeCollection *This,IUnknown **p);
      HRESULT (WINAPI *item)(IHTMLTxtRangeCollection *This,VARIANT *pvarIndex,VARIANT *pvarResult);
    END_INTERFACE
  } IHTMLTxtRangeCollectionVtbl;
  interface IHTMLTxtRangeCollection {
    CONST_VTBL struct IHTMLTxtRangeCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLTxtRangeCollection_get_length_Proxy(IHTMLTxtRangeCollection *This,long *p);
  void __RPC_STUB IHTMLTxtRangeCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRangeCollection_get__newEnum_Proxy(IHTMLTxtRangeCollection *This,IUnknown **p);
  void __RPC_STUB IHTMLTxtRangeCollection_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTxtRangeCollection_item_Proxy(IHTMLTxtRangeCollection *This,VARIANT *pvarIndex,VARIANT *pvarResult);
  void __RPC_STUB IHTMLTxtRangeCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __HTMLFormElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLFormElementEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLFormElementEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLFormElementEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLFormElementEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLFormElementEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLFormElementEvents2 *This);
      ULONG (WINAPI *Release)(HTMLFormElementEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLFormElementEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLFormElementEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLFormElementEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLFormElementEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLFormElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLFormElementEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLFormElementEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLFormElementEvents : public IDispatch {
  };
#else
  typedef struct HTMLFormElementEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLFormElementEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLFormElementEvents *This);
      ULONG (WINAPI *Release)(HTMLFormElementEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLFormElementEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLFormElementEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLFormElementEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLFormElementEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __IHTMLFormElement_INTERFACE_DEFINED__
#define __IHTMLFormElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLFormElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLFormElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_action(BSTR v) = 0;
    virtual HRESULT WINAPI get_action(BSTR *p) = 0;
    virtual HRESULT WINAPI put_dir(BSTR v) = 0;
    virtual HRESULT WINAPI get_dir(BSTR *p) = 0;
    virtual HRESULT WINAPI put_encoding(BSTR v) = 0;
    virtual HRESULT WINAPI get_encoding(BSTR *p) = 0;
    virtual HRESULT WINAPI put_method(BSTR v) = 0;
    virtual HRESULT WINAPI get_method(BSTR *p) = 0;
    virtual HRESULT WINAPI get_elements(IDispatch **p) = 0;
    virtual HRESULT WINAPI put_target(BSTR v) = 0;
    virtual HRESULT WINAPI get_target(BSTR *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_onsubmit(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onsubmit(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onreset(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onreset(VARIANT *p) = 0;
    virtual HRESULT WINAPI submit(void) = 0;
    virtual HRESULT WINAPI reset(void) = 0;
    virtual HRESULT WINAPI put_length(long v) = 0;
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;
    virtual HRESULT WINAPI item(VARIANT name,VARIANT index,IDispatch **pdisp) = 0;
    virtual HRESULT WINAPI tags(VARIANT tagName,IDispatch **pdisp) = 0;
  };
#else
  typedef struct IHTMLFormElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLFormElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLFormElement *This);
      ULONG (WINAPI *Release)(IHTMLFormElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFormElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLFormElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLFormElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLFormElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_action)(IHTMLFormElement *This,BSTR v);
      HRESULT (WINAPI *get_action)(IHTMLFormElement *This,BSTR *p);
      HRESULT (WINAPI *put_dir)(IHTMLFormElement *This,BSTR v);
      HRESULT (WINAPI *get_dir)(IHTMLFormElement *This,BSTR *p);
      HRESULT (WINAPI *put_encoding)(IHTMLFormElement *This,BSTR v);
      HRESULT (WINAPI *get_encoding)(IHTMLFormElement *This,BSTR *p);
      HRESULT (WINAPI *put_method)(IHTMLFormElement *This,BSTR v);
      HRESULT (WINAPI *get_method)(IHTMLFormElement *This,BSTR *p);
      HRESULT (WINAPI *get_elements)(IHTMLFormElement *This,IDispatch **p);
      HRESULT (WINAPI *put_target)(IHTMLFormElement *This,BSTR v);
      HRESULT (WINAPI *get_target)(IHTMLFormElement *This,BSTR *p);
      HRESULT (WINAPI *put_name)(IHTMLFormElement *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLFormElement *This,BSTR *p);
      HRESULT (WINAPI *put_onsubmit)(IHTMLFormElement *This,VARIANT v);
      HRESULT (WINAPI *get_onsubmit)(IHTMLFormElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onreset)(IHTMLFormElement *This,VARIANT v);
      HRESULT (WINAPI *get_onreset)(IHTMLFormElement *This,VARIANT *p);
      HRESULT (WINAPI *submit)(IHTMLFormElement *This);
      HRESULT (WINAPI *reset)(IHTMLFormElement *This);
      HRESULT (WINAPI *put_length)(IHTMLFormElement *This,long v);
      HRESULT (WINAPI *get_length)(IHTMLFormElement *This,long *p);
      HRESULT (WINAPI *get__newEnum)(IHTMLFormElement *This,IUnknown **p);
      HRESULT (WINAPI *item)(IHTMLFormElement *This,VARIANT name,VARIANT index,IDispatch **pdisp);
      HRESULT (WINAPI *tags)(IHTMLFormElement *This,VARIANT tagName,IDispatch **pdisp);
    END_INTERFACE
  } IHTMLFormElementVtbl;
  interface IHTMLFormElement {
    CONST_VTBL struct IHTMLFormElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLFormElement_put_action_Proxy(IHTMLFormElement *This,BSTR v);
  void __RPC_STUB IHTMLFormElement_put_action_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_get_action_Proxy(IHTMLFormElement *This,BSTR *p);
  void __RPC_STUB IHTMLFormElement_get_action_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_put_dir_Proxy(IHTMLFormElement *This,BSTR v);
  void __RPC_STUB IHTMLFormElement_put_dir_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_get_dir_Proxy(IHTMLFormElement *This,BSTR *p);
  void __RPC_STUB IHTMLFormElement_get_dir_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_put_encoding_Proxy(IHTMLFormElement *This,BSTR v);
  void __RPC_STUB IHTMLFormElement_put_encoding_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_get_encoding_Proxy(IHTMLFormElement *This,BSTR *p);
  void __RPC_STUB IHTMLFormElement_get_encoding_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_put_method_Proxy(IHTMLFormElement *This,BSTR v);
  void __RPC_STUB IHTMLFormElement_put_method_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_get_method_Proxy(IHTMLFormElement *This,BSTR *p);
  void __RPC_STUB IHTMLFormElement_get_method_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_get_elements_Proxy(IHTMLFormElement *This,IDispatch **p);
  void __RPC_STUB IHTMLFormElement_get_elements_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_put_target_Proxy(IHTMLFormElement *This,BSTR v);
  void __RPC_STUB IHTMLFormElement_put_target_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_get_target_Proxy(IHTMLFormElement *This,BSTR *p);
  void __RPC_STUB IHTMLFormElement_get_target_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_put_name_Proxy(IHTMLFormElement *This,BSTR v);
  void __RPC_STUB IHTMLFormElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_get_name_Proxy(IHTMLFormElement *This,BSTR *p);
  void __RPC_STUB IHTMLFormElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_put_onsubmit_Proxy(IHTMLFormElement *This,VARIANT v);
  void __RPC_STUB IHTMLFormElement_put_onsubmit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_get_onsubmit_Proxy(IHTMLFormElement *This,VARIANT *p);
  void __RPC_STUB IHTMLFormElement_get_onsubmit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_put_onreset_Proxy(IHTMLFormElement *This,VARIANT v);
  void __RPC_STUB IHTMLFormElement_put_onreset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_get_onreset_Proxy(IHTMLFormElement *This,VARIANT *p);
  void __RPC_STUB IHTMLFormElement_get_onreset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_submit_Proxy(IHTMLFormElement *This);
  void __RPC_STUB IHTMLFormElement_submit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_reset_Proxy(IHTMLFormElement *This);
  void __RPC_STUB IHTMLFormElement_reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_put_length_Proxy(IHTMLFormElement *This,long v);
  void __RPC_STUB IHTMLFormElement_put_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_get_length_Proxy(IHTMLFormElement *This,long *p);
  void __RPC_STUB IHTMLFormElement_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_get__newEnum_Proxy(IHTMLFormElement *This,IUnknown **p);
  void __RPC_STUB IHTMLFormElement_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_item_Proxy(IHTMLFormElement *This,VARIANT name,VARIANT index,IDispatch **pdisp);
  void __RPC_STUB IHTMLFormElement_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement_tags_Proxy(IHTMLFormElement *This,VARIANT tagName,IDispatch **pdisp);
  void __RPC_STUB IHTMLFormElement_tags_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLFormElement2_INTERFACE_DEFINED__
#define __IHTMLFormElement2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLFormElement2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLFormElement2 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_acceptCharset(BSTR v) = 0;
    virtual HRESULT WINAPI get_acceptCharset(BSTR *p) = 0;
    virtual HRESULT WINAPI urns(VARIANT urn,IDispatch **pdisp) = 0;
  };
#else
  typedef struct IHTMLFormElement2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLFormElement2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLFormElement2 *This);
      ULONG (WINAPI *Release)(IHTMLFormElement2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFormElement2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLFormElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLFormElement2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLFormElement2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_acceptCharset)(IHTMLFormElement2 *This,BSTR v);
      HRESULT (WINAPI *get_acceptCharset)(IHTMLFormElement2 *This,BSTR *p);
      HRESULT (WINAPI *urns)(IHTMLFormElement2 *This,VARIANT urn,IDispatch **pdisp);
    END_INTERFACE
  } IHTMLFormElement2Vtbl;
  interface IHTMLFormElement2 {
    CONST_VTBL struct IHTMLFormElement2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLFormElement2_put_acceptCharset_Proxy(IHTMLFormElement2 *This,BSTR v);
  void __RPC_STUB IHTMLFormElement2_put_acceptCharset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement2_get_acceptCharset_Proxy(IHTMLFormElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLFormElement2_get_acceptCharset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFormElement2_urns_Proxy(IHTMLFormElement2 *This,VARIANT urn,IDispatch **pdisp);
  void __RPC_STUB IHTMLFormElement2_urns_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLFormElement3_INTERFACE_DEFINED__
#define __IHTMLFormElement3_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLFormElement3;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLFormElement3 : public IDispatch {
  public:
    virtual HRESULT WINAPI namedItem(BSTR name,IDispatch **pdisp) = 0;
  };
#else
  typedef struct IHTMLFormElement3Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLFormElement3 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLFormElement3 *This);
      ULONG (WINAPI *Release)(IHTMLFormElement3 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFormElement3 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLFormElement3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLFormElement3 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLFormElement3 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *namedItem)(IHTMLFormElement3 *This,BSTR name,IDispatch **pdisp);
    END_INTERFACE
  } IHTMLFormElement3Vtbl;
  interface IHTMLFormElement3 {
    CONST_VTBL struct IHTMLFormElement3Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLFormElement3_namedItem(This,name,pdisp) (This)->lpVtbl->namedItem(This,name,pdisp)
#endif
#endif
  HRESULT WINAPI IHTMLFormElement3_namedItem_Proxy(IHTMLFormElement3 *This,BSTR name,IDispatch **pdisp);
  void __RPC_STUB IHTMLFormElement3_namedItem_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLSubmitData_INTERFACE_DEFINED__
#define __IHTMLSubmitData_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLSubmitData;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLSubmitData : public IDispatch {
  public:
    virtual HRESULT WINAPI appendNameValuePair(BSTR name = L"",BSTR value = L"") = 0;
    virtual HRESULT WINAPI appendNameFilePair(BSTR name = L"",BSTR filename = L"") = 0;
    virtual HRESULT WINAPI appendItemSeparator(void) = 0;
  };
#else
  typedef struct IHTMLSubmitDataVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLSubmitData *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLSubmitData *This);
      ULONG (WINAPI *Release)(IHTMLSubmitData *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLSubmitData *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLSubmitData *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLSubmitData *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLSubmitData *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *appendNameValuePair)(IHTMLSubmitData *This,BSTR name,BSTR value);
      HRESULT (WINAPI *appendNameFilePair)(IHTMLSubmitData *This,BSTR name,BSTR filename);
      HRESULT (WINAPI *appendItemSeparator)(IHTMLSubmitData *This);
    END_INTERFACE
  } IHTMLSubmitDataVtbl;
  interface IHTMLSubmitData {
    CONST_VTBL struct IHTMLSubmitDataVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLSubmitData_appendNameValuePair_Proxy(IHTMLSubmitData *This,BSTR name,BSTR value);
  void __RPC_STUB IHTMLSubmitData_appendNameValuePair_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSubmitData_appendNameFilePair_Proxy(IHTMLSubmitData *This,BSTR name,BSTR filename);
  void __RPC_STUB IHTMLSubmitData_appendNameFilePair_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSubmitData_appendItemSeparator_Proxy(IHTMLSubmitData *This);
  void __RPC_STUB IHTMLSubmitData_appendItemSeparator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLFormElement_DISPINTERFACE_DEFINED__
#define __DispHTMLFormElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLFormElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLFormElement : public IDispatch {
  };
#else
  typedef struct DispHTMLFormElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLFormElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLFormElement *This);
      ULONG (WINAPI *Release)(DispHTMLFormElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLFormElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLFormElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLFormElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLFormElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLFormElement;
#ifdef __cplusplus
  class HTMLFormElement;
#endif

#ifndef __HTMLControlElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLControlElementEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLControlElementEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLControlElementEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLControlElementEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLControlElementEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLControlElementEvents2 *This);
      ULONG (WINAPI *Release)(HTMLControlElementEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLControlElementEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLControlElementEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLControlElementEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLControlElementEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLControlElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLControlElementEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLControlElementEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLControlElementEvents : public IDispatch {
  };
#else
  typedef struct HTMLControlElementEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLControlElementEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLControlElementEvents *This);
      ULONG (WINAPI *Release)(HTMLControlElementEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLControlElementEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLControlElementEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLControlElementEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLControlElementEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __IHTMLControlElement_INTERFACE_DEFINED__
#define __IHTMLControlElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLControlElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLControlElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_tabIndex(short v) = 0;
    virtual HRESULT WINAPI get_tabIndex(short *p) = 0;
    virtual HRESULT WINAPI focus(void) = 0;
    virtual HRESULT WINAPI put_accessKey(BSTR v) = 0;
    virtual HRESULT WINAPI get_accessKey(BSTR *p) = 0;
    virtual HRESULT WINAPI put_onblur(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onblur(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onfocus(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onfocus(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onresize(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onresize(VARIANT *p) = 0;
    virtual HRESULT WINAPI blur(void) = 0;
    virtual HRESULT WINAPI addFilter(IUnknown *pUnk) = 0;
    virtual HRESULT WINAPI removeFilter(IUnknown *pUnk) = 0;
    virtual HRESULT WINAPI get_clientHeight(long *p) = 0;
    virtual HRESULT WINAPI get_clientWidth(long *p) = 0;
    virtual HRESULT WINAPI get_clientTop(long *p) = 0;
    virtual HRESULT WINAPI get_clientLeft(long *p) = 0;
  };
#else
  typedef struct IHTMLControlElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLControlElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLControlElement *This);
      ULONG (WINAPI *Release)(IHTMLControlElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLControlElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLControlElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLControlElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLControlElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_tabIndex)(IHTMLControlElement *This,short v);
      HRESULT (WINAPI *get_tabIndex)(IHTMLControlElement *This,short *p);
      HRESULT (WINAPI *focus)(IHTMLControlElement *This);
      HRESULT (WINAPI *put_accessKey)(IHTMLControlElement *This,BSTR v);
      HRESULT (WINAPI *get_accessKey)(IHTMLControlElement *This,BSTR *p);
      HRESULT (WINAPI *put_onblur)(IHTMLControlElement *This,VARIANT v);
      HRESULT (WINAPI *get_onblur)(IHTMLControlElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onfocus)(IHTMLControlElement *This,VARIANT v);
      HRESULT (WINAPI *get_onfocus)(IHTMLControlElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onresize)(IHTMLControlElement *This,VARIANT v);
      HRESULT (WINAPI *get_onresize)(IHTMLControlElement *This,VARIANT *p);
      HRESULT (WINAPI *blur)(IHTMLControlElement *This);
      HRESULT (WINAPI *addFilter)(IHTMLControlElement *This,IUnknown *pUnk);
      HRESULT (WINAPI *removeFilter)(IHTMLControlElement *This,IUnknown *pUnk);
      HRESULT (WINAPI *get_clientHeight)(IHTMLControlElement *This,long *p);
      HRESULT (WINAPI *get_clientWidth)(IHTMLControlElement *This,long *p);
      HRESULT (WINAPI *get_clientTop)(IHTMLControlElement *This,long *p);
      HRESULT (WINAPI *get_clientLeft)(IHTMLControlElement *This,long *p);
    END_INTERFACE
  } IHTMLControlElementVtbl;
  interface IHTMLControlElement {
    CONST_VTBL struct IHTMLControlElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLControlElement_put_tabIndex_Proxy(IHTMLControlElement *This,short v);
  void __RPC_STUB IHTMLControlElement_put_tabIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_get_tabIndex_Proxy(IHTMLControlElement *This,short *p);
  void __RPC_STUB IHTMLControlElement_get_tabIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_focus_Proxy(IHTMLControlElement *This);
  void __RPC_STUB IHTMLControlElement_focus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_put_accessKey_Proxy(IHTMLControlElement *This,BSTR v);
  void __RPC_STUB IHTMLControlElement_put_accessKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_get_accessKey_Proxy(IHTMLControlElement *This,BSTR *p);
  void __RPC_STUB IHTMLControlElement_get_accessKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_put_onblur_Proxy(IHTMLControlElement *This,VARIANT v);
  void __RPC_STUB IHTMLControlElement_put_onblur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_get_onblur_Proxy(IHTMLControlElement *This,VARIANT *p);
  void __RPC_STUB IHTMLControlElement_get_onblur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_put_onfocus_Proxy(IHTMLControlElement *This,VARIANT v);
  void __RPC_STUB IHTMLControlElement_put_onfocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_get_onfocus_Proxy(IHTMLControlElement *This,VARIANT *p);
  void __RPC_STUB IHTMLControlElement_get_onfocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_put_onresize_Proxy(IHTMLControlElement *This,VARIANT v);
  void __RPC_STUB IHTMLControlElement_put_onresize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_get_onresize_Proxy(IHTMLControlElement *This,VARIANT *p);
  void __RPC_STUB IHTMLControlElement_get_onresize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_blur_Proxy(IHTMLControlElement *This);
  void __RPC_STUB IHTMLControlElement_blur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_addFilter_Proxy(IHTMLControlElement *This,IUnknown *pUnk);
  void __RPC_STUB IHTMLControlElement_addFilter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_removeFilter_Proxy(IHTMLControlElement *This,IUnknown *pUnk);
  void __RPC_STUB IHTMLControlElement_removeFilter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_get_clientHeight_Proxy(IHTMLControlElement *This,long *p);
  void __RPC_STUB IHTMLControlElement_get_clientHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_get_clientWidth_Proxy(IHTMLControlElement *This,long *p);
  void __RPC_STUB IHTMLControlElement_get_clientWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_get_clientTop_Proxy(IHTMLControlElement *This,long *p);
  void __RPC_STUB IHTMLControlElement_get_clientTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlElement_get_clientLeft_Proxy(IHTMLControlElement *This,long *p);
  void __RPC_STUB IHTMLControlElement_get_clientLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTextElement_INTERFACE_DEFINED__
#define __IHTMLTextElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLTextElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLTextElement : public IDispatch {
  };
#else
  typedef struct IHTMLTextElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLTextElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLTextElement *This);
      ULONG (WINAPI *Release)(IHTMLTextElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTextElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLTextElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLTextElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct IHTMLTextElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __DispHTMLTextElement_DISPINTERFACE_DEFINED__
#define __DispHTMLTextElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLTextElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLTextElement : public IDispatch {
  };
#else
  typedef struct DispHTMLTextElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLTextElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLTextElement *This);
      ULONG (WINAPI *Release)(DispHTMLTextElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLTextElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLTextElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLTextElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLTextElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLTextElement;
#ifdef __cplusplus
  class HTMLTextElement;
#endif

#ifndef __HTMLTextContainerEvents2_DISPINTERFACE_DEFINED__
#define __HTMLTextContainerEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLTextContainerEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLTextContainerEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLTextContainerEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLTextContainerEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLTextContainerEvents2 *This);
      ULONG (WINAPI *Release)(HTMLTextContainerEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLTextContainerEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLTextContainerEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLTextContainerEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLTextContainerEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLTextContainerEvents_DISPINTERFACE_DEFINED__
#define __HTMLTextContainerEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLTextContainerEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLTextContainerEvents : public IDispatch {
  };
#else
  typedef struct HTMLTextContainerEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLTextContainerEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLTextContainerEvents *This);
      ULONG (WINAPI *Release)(HTMLTextContainerEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLTextContainerEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLTextContainerEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLTextContainerEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLTextContainerEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __IHTMLTextContainer_INTERFACE_DEFINED__
#define __IHTMLTextContainer_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLTextContainer;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLTextContainer : public IDispatch {
  public:
    virtual HRESULT WINAPI createControlRange(IDispatch **range) = 0;
    virtual HRESULT WINAPI get_scrollHeight(long *p) = 0;
    virtual HRESULT WINAPI get_scrollWidth(long *p) = 0;
    virtual HRESULT WINAPI put_scrollTop(long v) = 0;
    virtual HRESULT WINAPI get_scrollTop(long *p) = 0;
    virtual HRESULT WINAPI put_scrollLeft(long v) = 0;
    virtual HRESULT WINAPI get_scrollLeft(long *p) = 0;
    virtual HRESULT WINAPI put_onscroll(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onscroll(VARIANT *p) = 0;
  };
#else
  typedef struct IHTMLTextContainerVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLTextContainer *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLTextContainer *This);
      ULONG (WINAPI *Release)(IHTMLTextContainer *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTextContainer *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLTextContainer *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLTextContainer *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLTextContainer *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *createControlRange)(IHTMLTextContainer *This,IDispatch **range);
      HRESULT (WINAPI *get_scrollHeight)(IHTMLTextContainer *This,long *p);
      HRESULT (WINAPI *get_scrollWidth)(IHTMLTextContainer *This,long *p);
      HRESULT (WINAPI *put_scrollTop)(IHTMLTextContainer *This,long v);
      HRESULT (WINAPI *get_scrollTop)(IHTMLTextContainer *This,long *p);
      HRESULT (WINAPI *put_scrollLeft)(IHTMLTextContainer *This,long v);
      HRESULT (WINAPI *get_scrollLeft)(IHTMLTextContainer *This,long *p);
      HRESULT (WINAPI *put_onscroll)(IHTMLTextContainer *This,VARIANT v);
      HRESULT (WINAPI *get_onscroll)(IHTMLTextContainer *This,VARIANT *p);
    END_INTERFACE
  } IHTMLTextContainerVtbl;
  interface IHTMLTextContainer {
    CONST_VTBL struct IHTMLTextContainerVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLTextContainer_createControlRange_Proxy(IHTMLTextContainer *This,IDispatch **range);
  void __RPC_STUB IHTMLTextContainer_createControlRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextContainer_get_scrollHeight_Proxy(IHTMLTextContainer *This,long *p);
  void __RPC_STUB IHTMLTextContainer_get_scrollHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextContainer_get_scrollWidth_Proxy(IHTMLTextContainer *This,long *p);
  void __RPC_STUB IHTMLTextContainer_get_scrollWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextContainer_put_scrollTop_Proxy(IHTMLTextContainer *This,long v);
  void __RPC_STUB IHTMLTextContainer_put_scrollTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextContainer_get_scrollTop_Proxy(IHTMLTextContainer *This,long *p);
  void __RPC_STUB IHTMLTextContainer_get_scrollTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextContainer_put_scrollLeft_Proxy(IHTMLTextContainer *This,long v);
  void __RPC_STUB IHTMLTextContainer_put_scrollLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextContainer_get_scrollLeft_Proxy(IHTMLTextContainer *This,long *p);
  void __RPC_STUB IHTMLTextContainer_get_scrollLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextContainer_put_onscroll_Proxy(IHTMLTextContainer *This,VARIANT v);
  void __RPC_STUB IHTMLTextContainer_put_onscroll_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextContainer_get_onscroll_Proxy(IHTMLTextContainer *This,VARIANT *p);
  void __RPC_STUB IHTMLTextContainer_get_onscroll_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLControlRange_INTERFACE_DEFINED__
#define __IHTMLControlRange_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLControlRange;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLControlRange : public IDispatch {
  public:
    virtual HRESULT WINAPI select(void) = 0;
    virtual HRESULT WINAPI add(IHTMLControlElement *item) = 0;
    virtual HRESULT WINAPI remove(long index) = 0;
    virtual HRESULT WINAPI item(long index,IHTMLElement **pdisp) = 0;
    virtual HRESULT WINAPI scrollIntoView(VARIANT varargStart) = 0;
    virtual HRESULT WINAPI queryCommandSupported(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI queryCommandEnabled(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI queryCommandState(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI queryCommandIndeterm(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI queryCommandText(BSTR cmdID,BSTR *pcmdText) = 0;
    virtual HRESULT WINAPI queryCommandValue(BSTR cmdID,VARIANT *pcmdValue) = 0;
    virtual HRESULT WINAPI execCommand(BSTR cmdID,VARIANT_BOOL showUI,VARIANT value,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI execCommandShowHelp(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI commonParentElement(IHTMLElement **parent) = 0;
    virtual HRESULT WINAPI get_length(long *p) = 0;
  };
#else
  typedef struct IHTMLControlRangeVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLControlRange *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLControlRange *This);
      ULONG (WINAPI *Release)(IHTMLControlRange *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLControlRange *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLControlRange *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLControlRange *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLControlRange *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *select)(IHTMLControlRange *This);
      HRESULT (WINAPI *add)(IHTMLControlRange *This,IHTMLControlElement *item);
      HRESULT (WINAPI *remove)(IHTMLControlRange *This,long index);
      HRESULT (WINAPI *item)(IHTMLControlRange *This,long index,IHTMLElement **pdisp);
      HRESULT (WINAPI *scrollIntoView)(IHTMLControlRange *This,VARIANT varargStart);
      HRESULT (WINAPI *queryCommandSupported)(IHTMLControlRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *queryCommandEnabled)(IHTMLControlRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *queryCommandState)(IHTMLControlRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *queryCommandIndeterm)(IHTMLControlRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *queryCommandText)(IHTMLControlRange *This,BSTR cmdID,BSTR *pcmdText);
      HRESULT (WINAPI *queryCommandValue)(IHTMLControlRange *This,BSTR cmdID,VARIANT *pcmdValue);
      HRESULT (WINAPI *execCommand)(IHTMLControlRange *This,BSTR cmdID,VARIANT_BOOL showUI,VARIANT value,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *execCommandShowHelp)(IHTMLControlRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *commonParentElement)(IHTMLControlRange *This,IHTMLElement **parent);
      HRESULT (WINAPI *get_length)(IHTMLControlRange *This,long *p);
    END_INTERFACE
  } IHTMLControlRangeVtbl;
  interface IHTMLControlRange {
    CONST_VTBL struct IHTMLControlRangeVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLControlRange_select_Proxy(IHTMLControlRange *This);
  void __RPC_STUB IHTMLControlRange_select_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlRange_add_Proxy(IHTMLControlRange *This,IHTMLControlElement *item);
  void __RPC_STUB IHTMLControlRange_add_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlRange_remove_Proxy(IHTMLControlRange *This,long index);
  void __RPC_STUB IHTMLControlRange_remove_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlRange_item_Proxy(IHTMLControlRange *This,long index,IHTMLElement **pdisp);
  void __RPC_STUB IHTMLControlRange_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlRange_scrollIntoView_Proxy(IHTMLControlRange *This,VARIANT varargStart);
  void __RPC_STUB IHTMLControlRange_scrollIntoView_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlRange_queryCommandSupported_Proxy(IHTMLControlRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLControlRange_queryCommandSupported_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlRange_queryCommandEnabled_Proxy(IHTMLControlRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLControlRange_queryCommandEnabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlRange_queryCommandState_Proxy(IHTMLControlRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLControlRange_queryCommandState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlRange_queryCommandIndeterm_Proxy(IHTMLControlRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLControlRange_queryCommandIndeterm_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlRange_queryCommandText_Proxy(IHTMLControlRange *This,BSTR cmdID,BSTR *pcmdText);
  void __RPC_STUB IHTMLControlRange_queryCommandText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlRange_queryCommandValue_Proxy(IHTMLControlRange *This,BSTR cmdID,VARIANT *pcmdValue);
  void __RPC_STUB IHTMLControlRange_queryCommandValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlRange_execCommand_Proxy(IHTMLControlRange *This,BSTR cmdID,VARIANT_BOOL showUI,VARIANT value,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLControlRange_execCommand_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlRange_execCommandShowHelp_Proxy(IHTMLControlRange *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLControlRange_execCommandShowHelp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlRange_commonParentElement_Proxy(IHTMLControlRange *This,IHTMLElement **parent);
  void __RPC_STUB IHTMLControlRange_commonParentElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLControlRange_get_length_Proxy(IHTMLControlRange *This,long *p);
  void __RPC_STUB IHTMLControlRange_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLControlRange2_INTERFACE_DEFINED__
#define __IHTMLControlRange2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLControlRange2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLControlRange2 : public IDispatch {
  public:
    virtual HRESULT WINAPI addElement(IHTMLElement *item) = 0;
  };
#else
  typedef struct IHTMLControlRange2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLControlRange2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLControlRange2 *This);
      ULONG (WINAPI *Release)(IHTMLControlRange2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLControlRange2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLControlRange2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLControlRange2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLControlRange2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *addElement)(IHTMLControlRange2 *This,IHTMLElement *item);
    END_INTERFACE
  } IHTMLControlRange2Vtbl;
  interface IHTMLControlRange2 {
    CONST_VTBL struct IHTMLControlRange2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLControlRange2_addElement(This,item) (This)->lpVtbl->addElement(This,item)
#endif
#endif
  HRESULT WINAPI IHTMLControlRange2_addElement_Proxy(IHTMLControlRange2 *This,IHTMLElement *item);
  void __RPC_STUB IHTMLControlRange2_addElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __HTMLImgEvents2_DISPINTERFACE_DEFINED__
#define __HTMLImgEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLImgEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLImgEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLImgEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLImgEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLImgEvents2 *This);
      ULONG (WINAPI *Release)(HTMLImgEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLImgEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLImgEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLImgEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLImgEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLImgEvents_DISPINTERFACE_DEFINED__
#define __HTMLImgEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLImgEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLImgEvents : public IDispatch {
  };
#else
  typedef struct HTMLImgEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLImgEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLImgEvents *This);
      ULONG (WINAPI *Release)(HTMLImgEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLImgEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLImgEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLImgEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLImgEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __IHTMLImgElement_INTERFACE_DEFINED__
#define __IHTMLImgElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLImgElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLImgElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_isMap(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_isMap(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_useMap(BSTR v) = 0;
    virtual HRESULT WINAPI get_useMap(BSTR *p) = 0;
    virtual HRESULT WINAPI get_mimeType(BSTR *p) = 0;
    virtual HRESULT WINAPI get_fileSize(BSTR *p) = 0;
    virtual HRESULT WINAPI get_fileCreatedDate(BSTR *p) = 0;
    virtual HRESULT WINAPI get_fileModifiedDate(BSTR *p) = 0;
    virtual HRESULT WINAPI get_fileUpdatedDate(BSTR *p) = 0;
    virtual HRESULT WINAPI get_protocol(BSTR *p) = 0;
    virtual HRESULT WINAPI get_href(BSTR *p) = 0;
    virtual HRESULT WINAPI get_nameProp(BSTR *p) = 0;
    virtual HRESULT WINAPI put_border(VARIANT v) = 0;
    virtual HRESULT WINAPI get_border(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_vspace(long v) = 0;
    virtual HRESULT WINAPI get_vspace(long *p) = 0;
    virtual HRESULT WINAPI put_hspace(long v) = 0;
    virtual HRESULT WINAPI get_hspace(long *p) = 0;
    virtual HRESULT WINAPI put_alt(BSTR v) = 0;
    virtual HRESULT WINAPI get_alt(BSTR *p) = 0;
    virtual HRESULT WINAPI put_src(BSTR v) = 0;
    virtual HRESULT WINAPI get_src(BSTR *p) = 0;
    virtual HRESULT WINAPI put_lowsrc(BSTR v) = 0;
    virtual HRESULT WINAPI get_lowsrc(BSTR *p) = 0;
    virtual HRESULT WINAPI put_vrml(BSTR v) = 0;
    virtual HRESULT WINAPI get_vrml(BSTR *p) = 0;
    virtual HRESULT WINAPI put_dynsrc(BSTR v) = 0;
    virtual HRESULT WINAPI get_dynsrc(BSTR *p) = 0;
    virtual HRESULT WINAPI get_readyState(BSTR *p) = 0;
    virtual HRESULT WINAPI get_complete(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_loop(VARIANT v) = 0;
    virtual HRESULT WINAPI get_loop(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_align(BSTR v) = 0;
    virtual HRESULT WINAPI get_align(BSTR *p) = 0;
    virtual HRESULT WINAPI put_onload(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onload(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onerror(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onerror(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onabort(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onabort(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_width(long v) = 0;
    virtual HRESULT WINAPI get_width(long *p) = 0;
    virtual HRESULT WINAPI put_height(long v) = 0;
    virtual HRESULT WINAPI get_height(long *p) = 0;
    virtual HRESULT WINAPI put_start(BSTR v) = 0;
    virtual HRESULT WINAPI get_start(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLImgElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLImgElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLImgElement *This);
      ULONG (WINAPI *Release)(IHTMLImgElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLImgElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLImgElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLImgElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLImgElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_isMap)(IHTMLImgElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_isMap)(IHTMLImgElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_useMap)(IHTMLImgElement *This,BSTR v);
      HRESULT (WINAPI *get_useMap)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *get_mimeType)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *get_fileSize)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *get_fileCreatedDate)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *get_fileModifiedDate)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *get_fileUpdatedDate)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *get_protocol)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *get_href)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *get_nameProp)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *put_border)(IHTMLImgElement *This,VARIANT v);
      HRESULT (WINAPI *get_border)(IHTMLImgElement *This,VARIANT *p);
      HRESULT (WINAPI *put_vspace)(IHTMLImgElement *This,long v);
      HRESULT (WINAPI *get_vspace)(IHTMLImgElement *This,long *p);
      HRESULT (WINAPI *put_hspace)(IHTMLImgElement *This,long v);
      HRESULT (WINAPI *get_hspace)(IHTMLImgElement *This,long *p);
      HRESULT (WINAPI *put_alt)(IHTMLImgElement *This,BSTR v);
      HRESULT (WINAPI *get_alt)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *put_src)(IHTMLImgElement *This,BSTR v);
      HRESULT (WINAPI *get_src)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *put_lowsrc)(IHTMLImgElement *This,BSTR v);
      HRESULT (WINAPI *get_lowsrc)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *put_vrml)(IHTMLImgElement *This,BSTR v);
      HRESULT (WINAPI *get_vrml)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *put_dynsrc)(IHTMLImgElement *This,BSTR v);
      HRESULT (WINAPI *get_dynsrc)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *get_readyState)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *get_complete)(IHTMLImgElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_loop)(IHTMLImgElement *This,VARIANT v);
      HRESULT (WINAPI *get_loop)(IHTMLImgElement *This,VARIANT *p);
      HRESULT (WINAPI *put_align)(IHTMLImgElement *This,BSTR v);
      HRESULT (WINAPI *get_align)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *put_onload)(IHTMLImgElement *This,VARIANT v);
      HRESULT (WINAPI *get_onload)(IHTMLImgElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onerror)(IHTMLImgElement *This,VARIANT v);
      HRESULT (WINAPI *get_onerror)(IHTMLImgElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onabort)(IHTMLImgElement *This,VARIANT v);
      HRESULT (WINAPI *get_onabort)(IHTMLImgElement *This,VARIANT *p);
      HRESULT (WINAPI *put_name)(IHTMLImgElement *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLImgElement *This,BSTR *p);
      HRESULT (WINAPI *put_width)(IHTMLImgElement *This,long v);
      HRESULT (WINAPI *get_width)(IHTMLImgElement *This,long *p);
      HRESULT (WINAPI *put_height)(IHTMLImgElement *This,long v);
      HRESULT (WINAPI *get_height)(IHTMLImgElement *This,long *p);
      HRESULT (WINAPI *put_start)(IHTMLImgElement *This,BSTR v);
      HRESULT (WINAPI *get_start)(IHTMLImgElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLImgElementVtbl;
  interface IHTMLImgElement {
    CONST_VTBL struct IHTMLImgElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLImgElement_put_isMap_Proxy(IHTMLImgElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLImgElement_put_isMap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_isMap_Proxy(IHTMLImgElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLImgElement_get_isMap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_useMap_Proxy(IHTMLImgElement *This,BSTR v);
  void __RPC_STUB IHTMLImgElement_put_useMap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_useMap_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_useMap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_mimeType_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_mimeType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_fileSize_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_fileSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_fileCreatedDate_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_fileCreatedDate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_fileModifiedDate_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_fileModifiedDate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_fileUpdatedDate_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_fileUpdatedDate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_protocol_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_protocol_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_href_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_href_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_nameProp_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_nameProp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_border_Proxy(IHTMLImgElement *This,VARIANT v);
  void __RPC_STUB IHTMLImgElement_put_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_border_Proxy(IHTMLImgElement *This,VARIANT *p);
  void __RPC_STUB IHTMLImgElement_get_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_vspace_Proxy(IHTMLImgElement *This,long v);
  void __RPC_STUB IHTMLImgElement_put_vspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_vspace_Proxy(IHTMLImgElement *This,long *p);
  void __RPC_STUB IHTMLImgElement_get_vspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_hspace_Proxy(IHTMLImgElement *This,long v);
  void __RPC_STUB IHTMLImgElement_put_hspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_hspace_Proxy(IHTMLImgElement *This,long *p);
  void __RPC_STUB IHTMLImgElement_get_hspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_alt_Proxy(IHTMLImgElement *This,BSTR v);
  void __RPC_STUB IHTMLImgElement_put_alt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_alt_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_alt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_src_Proxy(IHTMLImgElement *This,BSTR v);
  void __RPC_STUB IHTMLImgElement_put_src_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_src_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_src_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_lowsrc_Proxy(IHTMLImgElement *This,BSTR v);
  void __RPC_STUB IHTMLImgElement_put_lowsrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_lowsrc_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_lowsrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_vrml_Proxy(IHTMLImgElement *This,BSTR v);
  void __RPC_STUB IHTMLImgElement_put_vrml_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_vrml_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_vrml_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_dynsrc_Proxy(IHTMLImgElement *This,BSTR v);
  void __RPC_STUB IHTMLImgElement_put_dynsrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_dynsrc_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_dynsrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_readyState_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_readyState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_complete_Proxy(IHTMLImgElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLImgElement_get_complete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_loop_Proxy(IHTMLImgElement *This,VARIANT v);
  void __RPC_STUB IHTMLImgElement_put_loop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_loop_Proxy(IHTMLImgElement *This,VARIANT *p);
  void __RPC_STUB IHTMLImgElement_get_loop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_align_Proxy(IHTMLImgElement *This,BSTR v);
  void __RPC_STUB IHTMLImgElement_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_align_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_onload_Proxy(IHTMLImgElement *This,VARIANT v);
  void __RPC_STUB IHTMLImgElement_put_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_onload_Proxy(IHTMLImgElement *This,VARIANT *p);
  void __RPC_STUB IHTMLImgElement_get_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_onerror_Proxy(IHTMLImgElement *This,VARIANT v);
  void __RPC_STUB IHTMLImgElement_put_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_onerror_Proxy(IHTMLImgElement *This,VARIANT *p);
  void __RPC_STUB IHTMLImgElement_get_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_onabort_Proxy(IHTMLImgElement *This,VARIANT v);
  void __RPC_STUB IHTMLImgElement_put_onabort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_onabort_Proxy(IHTMLImgElement *This,VARIANT *p);
  void __RPC_STUB IHTMLImgElement_get_onabort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_name_Proxy(IHTMLImgElement *This,BSTR v);
  void __RPC_STUB IHTMLImgElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_name_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_width_Proxy(IHTMLImgElement *This,long v);
  void __RPC_STUB IHTMLImgElement_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_width_Proxy(IHTMLImgElement *This,long *p);
  void __RPC_STUB IHTMLImgElement_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_height_Proxy(IHTMLImgElement *This,long v);
  void __RPC_STUB IHTMLImgElement_put_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_height_Proxy(IHTMLImgElement *This,long *p);
  void __RPC_STUB IHTMLImgElement_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_put_start_Proxy(IHTMLImgElement *This,BSTR v);
  void __RPC_STUB IHTMLImgElement_put_start_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement_get_start_Proxy(IHTMLImgElement *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement_get_start_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLImgElement2_INTERFACE_DEFINED__
#define __IHTMLImgElement2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLImgElement2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLImgElement2 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_longDesc(BSTR v) = 0;
    virtual HRESULT WINAPI get_longDesc(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLImgElement2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLImgElement2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLImgElement2 *This);
      ULONG (WINAPI *Release)(IHTMLImgElement2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLImgElement2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLImgElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLImgElement2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLImgElement2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_longDesc)(IHTMLImgElement2 *This,BSTR v);
      HRESULT (WINAPI *get_longDesc)(IHTMLImgElement2 *This,BSTR *p);
    END_INTERFACE
  } IHTMLImgElement2Vtbl;
  interface IHTMLImgElement2 {
    CONST_VTBL struct IHTMLImgElement2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLImgElement2_put_longDesc(This,v) (This)->lpVtbl->put_longDesc(This,v)
#define IHTMLImgElement2_get_longDesc(This,p) (This)->lpVtbl->get_longDesc(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLImgElement2_put_longDesc_Proxy(IHTMLImgElement2 *This,BSTR v);
  void __RPC_STUB IHTMLImgElement2_put_longDesc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLImgElement2_get_longDesc_Proxy(IHTMLImgElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLImgElement2_get_longDesc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLImageElementFactory_INTERFACE_DEFINED__
#define __IHTMLImageElementFactory_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLImageElementFactory;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLImageElementFactory : public IDispatch {
  public:
    virtual HRESULT WINAPI create(VARIANT width,VARIANT height,IHTMLImgElement **__MIDL_0011) = 0;
  };
#else
  typedef struct IHTMLImageElementFactoryVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLImageElementFactory *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLImageElementFactory *This);
      ULONG (WINAPI *Release)(IHTMLImageElementFactory *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLImageElementFactory *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLImageElementFactory *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLImageElementFactory *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLImageElementFactory *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *create)(IHTMLImageElementFactory *This,VARIANT width,VARIANT height,IHTMLImgElement **__MIDL_0011);
    END_INTERFACE
  } IHTMLImageElementFactoryVtbl;
  interface IHTMLImageElementFactory {
    CONST_VTBL struct IHTMLImageElementFactoryVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLImageElementFactory_create(This,width,height,__MIDL_0011) (This)->lpVtbl->create(This,width,height,__MIDL_0011)
#endif
#endif
  HRESULT WINAPI IHTMLImageElementFactory_create_Proxy(IHTMLImageElementFactory *This,VARIANT width,VARIANT height,IHTMLImgElement **__MIDL_0011);
  void __RPC_STUB IHTMLImageElementFactory_create_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLImg_DISPINTERFACE_DEFINED__
#define __DispHTMLImg_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLImg;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLImg : public IDispatch {
  };
#else
  typedef struct DispHTMLImgVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLImg *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLImg *This);
      ULONG (WINAPI *Release)(DispHTMLImg *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLImg *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLImg *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLImg *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLImgVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLImg;
#ifdef __cplusplus
  class HTMLImg;
#endif
  EXTERN_C const CLSID CLSID_HTMLImageElementFactory;
#ifdef __cplusplus
  class HTMLImageElementFactory;
#endif

#ifndef __IHTMLBodyElement_INTERFACE_DEFINED__
#define __IHTMLBodyElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLBodyElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLBodyElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_background(BSTR v) = 0;
    virtual HRESULT WINAPI get_background(BSTR *p) = 0;
    virtual HRESULT WINAPI put_bgProperties(BSTR v) = 0;
    virtual HRESULT WINAPI get_bgProperties(BSTR *p) = 0;
    virtual HRESULT WINAPI put_leftMargin(VARIANT v) = 0;
    virtual HRESULT WINAPI get_leftMargin(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_topMargin(VARIANT v) = 0;
    virtual HRESULT WINAPI get_topMargin(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_rightMargin(VARIANT v) = 0;
    virtual HRESULT WINAPI get_rightMargin(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_bottomMargin(VARIANT v) = 0;
    virtual HRESULT WINAPI get_bottomMargin(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_noWrap(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_noWrap(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_bgColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_bgColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_text(VARIANT v) = 0;
    virtual HRESULT WINAPI get_text(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_link(VARIANT v) = 0;
    virtual HRESULT WINAPI get_link(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_vLink(VARIANT v) = 0;
    virtual HRESULT WINAPI get_vLink(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_aLink(VARIANT v) = 0;
    virtual HRESULT WINAPI get_aLink(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onload(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onload(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onunload(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onunload(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scroll(BSTR v) = 0;
    virtual HRESULT WINAPI get_scroll(BSTR *p) = 0;
    virtual HRESULT WINAPI put_onselect(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onselect(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onbeforeunload(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onbeforeunload(VARIANT *p) = 0;
    virtual HRESULT WINAPI createTextRange(IHTMLTxtRange **range) = 0;
  };
#else
  typedef struct IHTMLBodyElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLBodyElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLBodyElement *This);
      ULONG (WINAPI *Release)(IHTMLBodyElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLBodyElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLBodyElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLBodyElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLBodyElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_background)(IHTMLBodyElement *This,BSTR v);
      HRESULT (WINAPI *get_background)(IHTMLBodyElement *This,BSTR *p);
      HRESULT (WINAPI *put_bgProperties)(IHTMLBodyElement *This,BSTR v);
      HRESULT (WINAPI *get_bgProperties)(IHTMLBodyElement *This,BSTR *p);
      HRESULT (WINAPI *put_leftMargin)(IHTMLBodyElement *This,VARIANT v);
      HRESULT (WINAPI *get_leftMargin)(IHTMLBodyElement *This,VARIANT *p);
      HRESULT (WINAPI *put_topMargin)(IHTMLBodyElement *This,VARIANT v);
      HRESULT (WINAPI *get_topMargin)(IHTMLBodyElement *This,VARIANT *p);
      HRESULT (WINAPI *put_rightMargin)(IHTMLBodyElement *This,VARIANT v);
      HRESULT (WINAPI *get_rightMargin)(IHTMLBodyElement *This,VARIANT *p);
      HRESULT (WINAPI *put_bottomMargin)(IHTMLBodyElement *This,VARIANT v);
      HRESULT (WINAPI *get_bottomMargin)(IHTMLBodyElement *This,VARIANT *p);
      HRESULT (WINAPI *put_noWrap)(IHTMLBodyElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_noWrap)(IHTMLBodyElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_bgColor)(IHTMLBodyElement *This,VARIANT v);
      HRESULT (WINAPI *get_bgColor)(IHTMLBodyElement *This,VARIANT *p);
      HRESULT (WINAPI *put_text)(IHTMLBodyElement *This,VARIANT v);
      HRESULT (WINAPI *get_text)(IHTMLBodyElement *This,VARIANT *p);
      HRESULT (WINAPI *put_link)(IHTMLBodyElement *This,VARIANT v);
      HRESULT (WINAPI *get_link)(IHTMLBodyElement *This,VARIANT *p);
      HRESULT (WINAPI *put_vLink)(IHTMLBodyElement *This,VARIANT v);
      HRESULT (WINAPI *get_vLink)(IHTMLBodyElement *This,VARIANT *p);
      HRESULT (WINAPI *put_aLink)(IHTMLBodyElement *This,VARIANT v);
      HRESULT (WINAPI *get_aLink)(IHTMLBodyElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onload)(IHTMLBodyElement *This,VARIANT v);
      HRESULT (WINAPI *get_onload)(IHTMLBodyElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onunload)(IHTMLBodyElement *This,VARIANT v);
      HRESULT (WINAPI *get_onunload)(IHTMLBodyElement *This,VARIANT *p);
      HRESULT (WINAPI *put_scroll)(IHTMLBodyElement *This,BSTR v);
      HRESULT (WINAPI *get_scroll)(IHTMLBodyElement *This,BSTR *p);
      HRESULT (WINAPI *put_onselect)(IHTMLBodyElement *This,VARIANT v);
      HRESULT (WINAPI *get_onselect)(IHTMLBodyElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onbeforeunload)(IHTMLBodyElement *This,VARIANT v);
      HRESULT (WINAPI *get_onbeforeunload)(IHTMLBodyElement *This,VARIANT *p);
      HRESULT (WINAPI *createTextRange)(IHTMLBodyElement *This,IHTMLTxtRange **range);
    END_INTERFACE
  } IHTMLBodyElementVtbl;
  interface IHTMLBodyElement {
    CONST_VTBL struct IHTMLBodyElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLBodyElement_put_background_Proxy(IHTMLBodyElement *This,BSTR v);
  void __RPC_STUB IHTMLBodyElement_put_background_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_background_Proxy(IHTMLBodyElement *This,BSTR *p);
  void __RPC_STUB IHTMLBodyElement_get_background_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_bgProperties_Proxy(IHTMLBodyElement *This,BSTR v);
  void __RPC_STUB IHTMLBodyElement_put_bgProperties_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_bgProperties_Proxy(IHTMLBodyElement *This,BSTR *p);
  void __RPC_STUB IHTMLBodyElement_get_bgProperties_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_leftMargin_Proxy(IHTMLBodyElement *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement_put_leftMargin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_leftMargin_Proxy(IHTMLBodyElement *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement_get_leftMargin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_topMargin_Proxy(IHTMLBodyElement *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement_put_topMargin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_topMargin_Proxy(IHTMLBodyElement *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement_get_topMargin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_rightMargin_Proxy(IHTMLBodyElement *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement_put_rightMargin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_rightMargin_Proxy(IHTMLBodyElement *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement_get_rightMargin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_bottomMargin_Proxy(IHTMLBodyElement *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement_put_bottomMargin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_bottomMargin_Proxy(IHTMLBodyElement *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement_get_bottomMargin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_noWrap_Proxy(IHTMLBodyElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLBodyElement_put_noWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_noWrap_Proxy(IHTMLBodyElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLBodyElement_get_noWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_bgColor_Proxy(IHTMLBodyElement *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement_put_bgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_bgColor_Proxy(IHTMLBodyElement *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement_get_bgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_text_Proxy(IHTMLBodyElement *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement_put_text_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_text_Proxy(IHTMLBodyElement *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement_get_text_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_link_Proxy(IHTMLBodyElement *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement_put_link_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_link_Proxy(IHTMLBodyElement *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement_get_link_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_vLink_Proxy(IHTMLBodyElement *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement_put_vLink_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_vLink_Proxy(IHTMLBodyElement *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement_get_vLink_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_aLink_Proxy(IHTMLBodyElement *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement_put_aLink_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_aLink_Proxy(IHTMLBodyElement *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement_get_aLink_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_onload_Proxy(IHTMLBodyElement *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement_put_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_onload_Proxy(IHTMLBodyElement *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement_get_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_onunload_Proxy(IHTMLBodyElement *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement_put_onunload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_onunload_Proxy(IHTMLBodyElement *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement_get_onunload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_scroll_Proxy(IHTMLBodyElement *This,BSTR v);
  void __RPC_STUB IHTMLBodyElement_put_scroll_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_scroll_Proxy(IHTMLBodyElement *This,BSTR *p);
  void __RPC_STUB IHTMLBodyElement_get_scroll_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_onselect_Proxy(IHTMLBodyElement *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement_put_onselect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_onselect_Proxy(IHTMLBodyElement *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement_get_onselect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_put_onbeforeunload_Proxy(IHTMLBodyElement *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement_put_onbeforeunload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_get_onbeforeunload_Proxy(IHTMLBodyElement *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement_get_onbeforeunload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement_createTextRange_Proxy(IHTMLBodyElement *This,IHTMLTxtRange **range);
  void __RPC_STUB IHTMLBodyElement_createTextRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLBodyElement2_INTERFACE_DEFINED__
#define __IHTMLBodyElement2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLBodyElement2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLBodyElement2 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_onbeforeprint(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onbeforeprint(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onafterprint(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onafterprint(VARIANT *p) = 0;
  };
#else
  typedef struct IHTMLBodyElement2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLBodyElement2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLBodyElement2 *This);
      ULONG (WINAPI *Release)(IHTMLBodyElement2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLBodyElement2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLBodyElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLBodyElement2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLBodyElement2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_onbeforeprint)(IHTMLBodyElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onbeforeprint)(IHTMLBodyElement2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onafterprint)(IHTMLBodyElement2 *This,VARIANT v);
      HRESULT (WINAPI *get_onafterprint)(IHTMLBodyElement2 *This,VARIANT *p);
    END_INTERFACE
  } IHTMLBodyElement2Vtbl;
  interface IHTMLBodyElement2 {
    CONST_VTBL struct IHTMLBodyElement2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLBodyElement2_put_onbeforeprint_Proxy(IHTMLBodyElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement2_put_onbeforeprint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement2_get_onbeforeprint_Proxy(IHTMLBodyElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement2_get_onbeforeprint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement2_put_onafterprint_Proxy(IHTMLBodyElement2 *This,VARIANT v);
  void __RPC_STUB IHTMLBodyElement2_put_onafterprint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBodyElement2_get_onafterprint_Proxy(IHTMLBodyElement2 *This,VARIANT *p);
  void __RPC_STUB IHTMLBodyElement2_get_onafterprint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLBody_DISPINTERFACE_DEFINED__
#define __DispHTMLBody_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLBody;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLBody : public IDispatch {
  };
#else
  typedef struct DispHTMLBodyVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLBody *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLBody *This);
      ULONG (WINAPI *Release)(DispHTMLBody *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLBody *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLBody *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLBody *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLBodyVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLBody;
#ifdef __cplusplus
  class HTMLBody;
#endif

#ifndef __IHTMLFontElement_INTERFACE_DEFINED__
#define __IHTMLFontElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLFontElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLFontElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_color(VARIANT v) = 0;
    virtual HRESULT WINAPI get_color(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_face(BSTR v) = 0;
    virtual HRESULT WINAPI get_face(BSTR *p) = 0;
    virtual HRESULT WINAPI put_size(VARIANT v) = 0;
    virtual HRESULT WINAPI get_size(VARIANT *p) = 0;
  };
#else
  typedef struct IHTMLFontElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLFontElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLFontElement *This);
      ULONG (WINAPI *Release)(IHTMLFontElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFontElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLFontElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLFontElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLFontElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_color)(IHTMLFontElement *This,VARIANT v);
      HRESULT (WINAPI *get_color)(IHTMLFontElement *This,VARIANT *p);
      HRESULT (WINAPI *put_face)(IHTMLFontElement *This,BSTR v);
      HRESULT (WINAPI *get_face)(IHTMLFontElement *This,BSTR *p);
      HRESULT (WINAPI *put_size)(IHTMLFontElement *This,VARIANT v);
      HRESULT (WINAPI *get_size)(IHTMLFontElement *This,VARIANT *p);
    END_INTERFACE
  } IHTMLFontElementVtbl;
  interface IHTMLFontElement {
    CONST_VTBL struct IHTMLFontElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLFontElement_put_color_Proxy(IHTMLFontElement *This,VARIANT v);
  void __RPC_STUB IHTMLFontElement_put_color_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFontElement_get_color_Proxy(IHTMLFontElement *This,VARIANT *p);
  void __RPC_STUB IHTMLFontElement_get_color_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFontElement_put_face_Proxy(IHTMLFontElement *This,BSTR v);
  void __RPC_STUB IHTMLFontElement_put_face_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFontElement_get_face_Proxy(IHTMLFontElement *This,BSTR *p);
  void __RPC_STUB IHTMLFontElement_get_face_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFontElement_put_size_Proxy(IHTMLFontElement *This,VARIANT v);
  void __RPC_STUB IHTMLFontElement_put_size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFontElement_get_size_Proxy(IHTMLFontElement *This,VARIANT *p);
  void __RPC_STUB IHTMLFontElement_get_size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLFontElement_DISPINTERFACE_DEFINED__
#define __DispHTMLFontElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLFontElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLFontElement : public IDispatch {
  };
#else
  typedef struct DispHTMLFontElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLFontElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLFontElement *This);
      ULONG (WINAPI *Release)(DispHTMLFontElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLFontElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLFontElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLFontElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLFontElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLFontElement;
#ifdef __cplusplus
  class HTMLFontElement;
#endif

#ifndef __HTMLAnchorEvents2_DISPINTERFACE_DEFINED__
#define __HTMLAnchorEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLAnchorEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLAnchorEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLAnchorEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLAnchorEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLAnchorEvents2 *This);
      ULONG (WINAPI *Release)(HTMLAnchorEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLAnchorEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLAnchorEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLAnchorEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLAnchorEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLAnchorEvents_DISPINTERFACE_DEFINED__
#define __HTMLAnchorEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLAnchorEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLAnchorEvents : public IDispatch {
  };
#else
  typedef struct HTMLAnchorEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLAnchorEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLAnchorEvents *This);
      ULONG (WINAPI *Release)(HTMLAnchorEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLAnchorEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLAnchorEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLAnchorEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLAnchorEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __IHTMLAnchorElement_INTERFACE_DEFINED__
#define __IHTMLAnchorElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLAnchorElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLAnchorElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_href(BSTR v) = 0;
    virtual HRESULT WINAPI get_href(BSTR *p) = 0;
    virtual HRESULT WINAPI put_target(BSTR v) = 0;
    virtual HRESULT WINAPI get_target(BSTR *p) = 0;
    virtual HRESULT WINAPI put_rel(BSTR v) = 0;
    virtual HRESULT WINAPI get_rel(BSTR *p) = 0;
    virtual HRESULT WINAPI put_rev(BSTR v) = 0;
    virtual HRESULT WINAPI get_rev(BSTR *p) = 0;
    virtual HRESULT WINAPI put_urn(BSTR v) = 0;
    virtual HRESULT WINAPI get_urn(BSTR *p) = 0;
    virtual HRESULT WINAPI put_Methods(BSTR v) = 0;
    virtual HRESULT WINAPI get_Methods(BSTR *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_host(BSTR v) = 0;
    virtual HRESULT WINAPI get_host(BSTR *p) = 0;
    virtual HRESULT WINAPI put_hostname(BSTR v) = 0;
    virtual HRESULT WINAPI get_hostname(BSTR *p) = 0;
    virtual HRESULT WINAPI put_pathname(BSTR v) = 0;
    virtual HRESULT WINAPI get_pathname(BSTR *p) = 0;
    virtual HRESULT WINAPI put_port(BSTR v) = 0;
    virtual HRESULT WINAPI get_port(BSTR *p) = 0;
    virtual HRESULT WINAPI put_protocol(BSTR v) = 0;
    virtual HRESULT WINAPI get_protocol(BSTR *p) = 0;
    virtual HRESULT WINAPI put_search(BSTR v) = 0;
    virtual HRESULT WINAPI get_search(BSTR *p) = 0;
    virtual HRESULT WINAPI put_hash(BSTR v) = 0;
    virtual HRESULT WINAPI get_hash(BSTR *p) = 0;
    virtual HRESULT WINAPI put_onblur(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onblur(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onfocus(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onfocus(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_accessKey(BSTR v) = 0;
    virtual HRESULT WINAPI get_accessKey(BSTR *p) = 0;
    virtual HRESULT WINAPI get_protocolLong(BSTR *p) = 0;
    virtual HRESULT WINAPI get_mimeType(BSTR *p) = 0;
    virtual HRESULT WINAPI get_nameProp(BSTR *p) = 0;
    virtual HRESULT WINAPI put_tabIndex(short v) = 0;
    virtual HRESULT WINAPI get_tabIndex(short *p) = 0;
    virtual HRESULT WINAPI focus(void) = 0;
    virtual HRESULT WINAPI blur(void) = 0;
  };
#else
  typedef struct IHTMLAnchorElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLAnchorElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLAnchorElement *This);
      ULONG (WINAPI *Release)(IHTMLAnchorElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLAnchorElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLAnchorElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLAnchorElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLAnchorElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_href)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_href)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_target)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_target)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_rel)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_rel)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_rev)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_rev)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_urn)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_urn)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_Methods)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_Methods)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_name)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_host)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_host)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_hostname)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_hostname)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_pathname)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_pathname)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_port)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_port)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_protocol)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_protocol)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_search)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_search)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_hash)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_hash)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_onblur)(IHTMLAnchorElement *This,VARIANT v);
      HRESULT (WINAPI *get_onblur)(IHTMLAnchorElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onfocus)(IHTMLAnchorElement *This,VARIANT v);
      HRESULT (WINAPI *get_onfocus)(IHTMLAnchorElement *This,VARIANT *p);
      HRESULT (WINAPI *put_accessKey)(IHTMLAnchorElement *This,BSTR v);
      HRESULT (WINAPI *get_accessKey)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *get_protocolLong)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *get_mimeType)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *get_nameProp)(IHTMLAnchorElement *This,BSTR *p);
      HRESULT (WINAPI *put_tabIndex)(IHTMLAnchorElement *This,short v);
      HRESULT (WINAPI *get_tabIndex)(IHTMLAnchorElement *This,short *p);
      HRESULT (WINAPI *focus)(IHTMLAnchorElement *This);
      HRESULT (WINAPI *blur)(IHTMLAnchorElement *This);
    END_INTERFACE
  } IHTMLAnchorElementVtbl;
  interface IHTMLAnchorElement {
    CONST_VTBL struct IHTMLAnchorElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLAnchorElement_put_href_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_href_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_href_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_href_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_target_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_target_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_target_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_target_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_rel_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_rel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_rel_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_rel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_rev_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_rev_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_rev_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_rev_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_urn_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_urn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_urn_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_urn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_Methods_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_Methods_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_Methods_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_Methods_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_name_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_name_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_host_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_host_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_host_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_host_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_hostname_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_hostname_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_hostname_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_hostname_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_pathname_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_pathname_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_pathname_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_pathname_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_port_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_port_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_port_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_port_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_protocol_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_protocol_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_protocol_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_protocol_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_search_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_search_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_search_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_search_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_hash_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_hash_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_hash_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_hash_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_onblur_Proxy(IHTMLAnchorElement *This,VARIANT v);
  void __RPC_STUB IHTMLAnchorElement_put_onblur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_onblur_Proxy(IHTMLAnchorElement *This,VARIANT *p);
  void __RPC_STUB IHTMLAnchorElement_get_onblur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_onfocus_Proxy(IHTMLAnchorElement *This,VARIANT v);
  void __RPC_STUB IHTMLAnchorElement_put_onfocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_onfocus_Proxy(IHTMLAnchorElement *This,VARIANT *p);
  void __RPC_STUB IHTMLAnchorElement_get_onfocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_accessKey_Proxy(IHTMLAnchorElement *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement_put_accessKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_accessKey_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_accessKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_protocolLong_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_protocolLong_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_mimeType_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_mimeType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_nameProp_Proxy(IHTMLAnchorElement *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement_get_nameProp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_put_tabIndex_Proxy(IHTMLAnchorElement *This,short v);
  void __RPC_STUB IHTMLAnchorElement_put_tabIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_get_tabIndex_Proxy(IHTMLAnchorElement *This,short *p);
  void __RPC_STUB IHTMLAnchorElement_get_tabIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_focus_Proxy(IHTMLAnchorElement *This);
  void __RPC_STUB IHTMLAnchorElement_focus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement_blur_Proxy(IHTMLAnchorElement *This);
  void __RPC_STUB IHTMLAnchorElement_blur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLAnchorElement2_INTERFACE_DEFINED__
#define __IHTMLAnchorElement2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLAnchorElement2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLAnchorElement2 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_charset(BSTR v) = 0;
    virtual HRESULT WINAPI get_charset(BSTR *p) = 0;
    virtual HRESULT WINAPI put_coords(BSTR v) = 0;
    virtual HRESULT WINAPI get_coords(BSTR *p) = 0;
    virtual HRESULT WINAPI put_hreflang(BSTR v) = 0;
    virtual HRESULT WINAPI get_hreflang(BSTR *p) = 0;
    virtual HRESULT WINAPI put_shape(BSTR v) = 0;
    virtual HRESULT WINAPI get_shape(BSTR *p) = 0;
    virtual HRESULT WINAPI put_type(BSTR v) = 0;
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLAnchorElement2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLAnchorElement2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLAnchorElement2 *This);
      ULONG (WINAPI *Release)(IHTMLAnchorElement2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLAnchorElement2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLAnchorElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLAnchorElement2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLAnchorElement2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_charset)(IHTMLAnchorElement2 *This,BSTR v);
      HRESULT (WINAPI *get_charset)(IHTMLAnchorElement2 *This,BSTR *p);
      HRESULT (WINAPI *put_coords)(IHTMLAnchorElement2 *This,BSTR v);
      HRESULT (WINAPI *get_coords)(IHTMLAnchorElement2 *This,BSTR *p);
      HRESULT (WINAPI *put_hreflang)(IHTMLAnchorElement2 *This,BSTR v);
      HRESULT (WINAPI *get_hreflang)(IHTMLAnchorElement2 *This,BSTR *p);
      HRESULT (WINAPI *put_shape)(IHTMLAnchorElement2 *This,BSTR v);
      HRESULT (WINAPI *get_shape)(IHTMLAnchorElement2 *This,BSTR *p);
      HRESULT (WINAPI *put_type)(IHTMLAnchorElement2 *This,BSTR v);
      HRESULT (WINAPI *get_type)(IHTMLAnchorElement2 *This,BSTR *p);
    END_INTERFACE
  } IHTMLAnchorElement2Vtbl;
  interface IHTMLAnchorElement2 {
    CONST_VTBL struct IHTMLAnchorElement2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLAnchorElement2_put_charset_Proxy(IHTMLAnchorElement2 *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement2_put_charset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement2_get_charset_Proxy(IHTMLAnchorElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement2_get_charset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement2_put_coords_Proxy(IHTMLAnchorElement2 *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement2_put_coords_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement2_get_coords_Proxy(IHTMLAnchorElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement2_get_coords_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement2_put_hreflang_Proxy(IHTMLAnchorElement2 *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement2_put_hreflang_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement2_get_hreflang_Proxy(IHTMLAnchorElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement2_get_hreflang_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement2_put_shape_Proxy(IHTMLAnchorElement2 *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement2_put_shape_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement2_get_shape_Proxy(IHTMLAnchorElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement2_get_shape_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement2_put_type_Proxy(IHTMLAnchorElement2 *This,BSTR v);
  void __RPC_STUB IHTMLAnchorElement2_put_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLAnchorElement2_get_type_Proxy(IHTMLAnchorElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLAnchorElement2_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLAnchorElement_DISPINTERFACE_DEFINED__
#define __DispHTMLAnchorElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLAnchorElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLAnchorElement : public IDispatch {
  };
#else
  typedef struct DispHTMLAnchorElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLAnchorElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLAnchorElement *This);
      ULONG (WINAPI *Release)(DispHTMLAnchorElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLAnchorElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLAnchorElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLAnchorElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLAnchorElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLAnchorElement;
#ifdef __cplusplus
  class HTMLAnchorElement;
#endif

#ifndef __HTMLLabelEvents2_DISPINTERFACE_DEFINED__
#define __HTMLLabelEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLLabelEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLLabelEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLLabelEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLLabelEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLLabelEvents2 *This);
      ULONG (WINAPI *Release)(HTMLLabelEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLLabelEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLLabelEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLLabelEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLLabelEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLLabelEvents_DISPINTERFACE_DEFINED__
#define __HTMLLabelEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLLabelEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLLabelEvents : public IDispatch {
  };
#else
  typedef struct HTMLLabelEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLLabelEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLLabelEvents *This);
      ULONG (WINAPI *Release)(HTMLLabelEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLLabelEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLLabelEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLLabelEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLLabelEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __IHTMLLabelElement_INTERFACE_DEFINED__
#define __IHTMLLabelElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLLabelElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLLabelElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_htmlFor(BSTR v) = 0;
    virtual HRESULT WINAPI get_htmlFor(BSTR *p) = 0;
    virtual HRESULT WINAPI put_accessKey(BSTR v) = 0;
    virtual HRESULT WINAPI get_accessKey(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLLabelElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLLabelElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLLabelElement *This);
      ULONG (WINAPI *Release)(IHTMLLabelElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLLabelElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLLabelElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLLabelElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLLabelElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_htmlFor)(IHTMLLabelElement *This,BSTR v);
      HRESULT (WINAPI *get_htmlFor)(IHTMLLabelElement *This,BSTR *p);
      HRESULT (WINAPI *put_accessKey)(IHTMLLabelElement *This,BSTR v);
      HRESULT (WINAPI *get_accessKey)(IHTMLLabelElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLLabelElementVtbl;
  interface IHTMLLabelElement {
    CONST_VTBL struct IHTMLLabelElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLLabelElement_put_htmlFor_Proxy(IHTMLLabelElement *This,BSTR v);
  void __RPC_STUB IHTMLLabelElement_put_htmlFor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLabelElement_get_htmlFor_Proxy(IHTMLLabelElement *This,BSTR *p);
  void __RPC_STUB IHTMLLabelElement_get_htmlFor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLabelElement_put_accessKey_Proxy(IHTMLLabelElement *This,BSTR v);
  void __RPC_STUB IHTMLLabelElement_put_accessKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLabelElement_get_accessKey_Proxy(IHTMLLabelElement *This,BSTR *p);
  void __RPC_STUB IHTMLLabelElement_get_accessKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLLabelElement2_INTERFACE_DEFINED__
#define __IHTMLLabelElement2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLLabelElement2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLLabelElement2 : public IDispatch {
  public:
    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;
  };
#else
  typedef struct IHTMLLabelElement2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLLabelElement2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLLabelElement2 *This);
      ULONG (WINAPI *Release)(IHTMLLabelElement2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLLabelElement2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLLabelElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLLabelElement2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLLabelElement2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_form)(IHTMLLabelElement2 *This,IHTMLFormElement **p);
    END_INTERFACE
  } IHTMLLabelElement2Vtbl;
  interface IHTMLLabelElement2 {
    CONST_VTBL struct IHTMLLabelElement2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLLabelElement2_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLLabelElement2_get_form_Proxy(IHTMLLabelElement2 *This,IHTMLFormElement **p);
  void __RPC_STUB IHTMLLabelElement2_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLLabelElement_DISPINTERFACE_DEFINED__
#define __DispHTMLLabelElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLLabelElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLLabelElement : public IDispatch {
  };
#else
  typedef struct DispHTMLLabelElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLLabelElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLLabelElement *This);
      ULONG (WINAPI *Release)(DispHTMLLabelElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLLabelElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLLabelElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLLabelElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLLabelElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLLabelElement;
#ifdef __cplusplus
  class HTMLLabelElement;
#endif

#ifndef __IHTMLListElement_INTERFACE_DEFINED__
#define __IHTMLListElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLListElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLListElement : public IDispatch {
  };
#else
  typedef struct IHTMLListElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLListElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLListElement *This);
      ULONG (WINAPI *Release)(IHTMLListElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLListElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLListElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLListElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct IHTMLListElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __IHTMLListElement2_INTERFACE_DEFINED__
#define __IHTMLListElement2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLListElement2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLListElement2 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_compact(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_compact(VARIANT_BOOL *p) = 0;
  };
#else
  typedef struct IHTMLListElement2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLListElement2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLListElement2 *This);
      ULONG (WINAPI *Release)(IHTMLListElement2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLListElement2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLListElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLListElement2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLListElement2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_compact)(IHTMLListElement2 *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_compact)(IHTMLListElement2 *This,VARIANT_BOOL *p);
    END_INTERFACE
  } IHTMLListElement2Vtbl;
  interface IHTMLListElement2 {
    CONST_VTBL struct IHTMLListElement2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLListElement2_put_compact(This,v) (This)->lpVtbl->put_compact(This,v)
#define IHTMLListElement2_get_compact(This,p) (This)->lpVtbl->get_compact(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLListElement2_put_compact_Proxy(IHTMLListElement2 *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLListElement2_put_compact_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLListElement2_get_compact_Proxy(IHTMLListElement2 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLListElement2_get_compact_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLListElement_DISPINTERFACE_DEFINED__
#define __DispHTMLListElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLListElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLListElement : public IDispatch {
  };
#else
  typedef struct DispHTMLListElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLListElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLListElement *This);
      ULONG (WINAPI *Release)(DispHTMLListElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLListElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLListElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLListElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLListElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLListElement;
#ifdef __cplusplus
  class HTMLListElement;
#endif

#ifndef __IHTMLUListElement_INTERFACE_DEFINED__
#define __IHTMLUListElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLUListElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLUListElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_compact(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_compact(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_type(BSTR v) = 0;
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLUListElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLUListElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLUListElement *This);
      ULONG (WINAPI *Release)(IHTMLUListElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLUListElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLUListElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLUListElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLUListElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_compact)(IHTMLUListElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_compact)(IHTMLUListElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_type)(IHTMLUListElement *This,BSTR v);
      HRESULT (WINAPI *get_type)(IHTMLUListElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLUListElementVtbl;
  interface IHTMLUListElement {
    CONST_VTBL struct IHTMLUListElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLUListElement_put_compact_Proxy(IHTMLUListElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLUListElement_put_compact_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLUListElement_get_compact_Proxy(IHTMLUListElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLUListElement_get_compact_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLUListElement_put_type_Proxy(IHTMLUListElement *This,BSTR v);
  void __RPC_STUB IHTMLUListElement_put_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLUListElement_get_type_Proxy(IHTMLUListElement *This,BSTR *p);
  void __RPC_STUB IHTMLUListElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLUListElement_DISPINTERFACE_DEFINED__
#define __DispHTMLUListElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLUListElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLUListElement : public IDispatch {
  };
#else
  typedef struct DispHTMLUListElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLUListElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLUListElement *This);
      ULONG (WINAPI *Release)(DispHTMLUListElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLUListElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLUListElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLUListElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLUListElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLUListElement;
#ifdef __cplusplus
  class HTMLUListElement;
#endif

#ifndef __IHTMLOListElement_INTERFACE_DEFINED__
#define __IHTMLOListElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLOListElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLOListElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_compact(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_compact(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_start(long v) = 0;
    virtual HRESULT WINAPI get_start(long *p) = 0;
    virtual HRESULT WINAPI put_type(BSTR v) = 0;
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLOListElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLOListElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLOListElement *This);
      ULONG (WINAPI *Release)(IHTMLOListElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLOListElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLOListElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLOListElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLOListElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_compact)(IHTMLOListElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_compact)(IHTMLOListElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_start)(IHTMLOListElement *This,long v);
      HRESULT (WINAPI *get_start)(IHTMLOListElement *This,long *p);
      HRESULT (WINAPI *put_type)(IHTMLOListElement *This,BSTR v);
      HRESULT (WINAPI *get_type)(IHTMLOListElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLOListElementVtbl;
  interface IHTMLOListElement {
    CONST_VTBL struct IHTMLOListElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLOListElement_put_compact_Proxy(IHTMLOListElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLOListElement_put_compact_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOListElement_get_compact_Proxy(IHTMLOListElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLOListElement_get_compact_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOListElement_put_start_Proxy(IHTMLOListElement *This,long v);
  void __RPC_STUB IHTMLOListElement_put_start_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOListElement_get_start_Proxy(IHTMLOListElement *This,long *p);
  void __RPC_STUB IHTMLOListElement_get_start_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOListElement_put_type_Proxy(IHTMLOListElement *This,BSTR v);
  void __RPC_STUB IHTMLOListElement_put_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOListElement_get_type_Proxy(IHTMLOListElement *This,BSTR *p);
  void __RPC_STUB IHTMLOListElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLOListElement_DISPINTERFACE_DEFINED__
#define __DispHTMLOListElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLOListElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLOListElement : public IDispatch {
  };
#else
  typedef struct DispHTMLOListElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLOListElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLOListElement *This);
      ULONG (WINAPI *Release)(DispHTMLOListElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLOListElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLOListElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLOListElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLOListElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLOListElement;
#ifdef __cplusplus
  class HTMLOListElement;
#endif

#ifndef __IHTMLLIElement_INTERFACE_DEFINED__
#define __IHTMLLIElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLLIElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLLIElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_type(BSTR v) = 0;
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI put_value(long v) = 0;
    virtual HRESULT WINAPI get_value(long *p) = 0;
  };
#else
  typedef struct IHTMLLIElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLLIElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLLIElement *This);
      ULONG (WINAPI *Release)(IHTMLLIElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLLIElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLLIElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLLIElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLLIElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_type)(IHTMLLIElement *This,BSTR v);
      HRESULT (WINAPI *get_type)(IHTMLLIElement *This,BSTR *p);
      HRESULT (WINAPI *put_value)(IHTMLLIElement *This,long v);
      HRESULT (WINAPI *get_value)(IHTMLLIElement *This,long *p);
    END_INTERFACE
  } IHTMLLIElementVtbl;
  interface IHTMLLIElement {
    CONST_VTBL struct IHTMLLIElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLLIElement_put_type_Proxy(IHTMLLIElement *This,BSTR v);
  void __RPC_STUB IHTMLLIElement_put_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLIElement_get_type_Proxy(IHTMLLIElement *This,BSTR *p);
  void __RPC_STUB IHTMLLIElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLIElement_put_value_Proxy(IHTMLLIElement *This,long v);
  void __RPC_STUB IHTMLLIElement_put_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLIElement_get_value_Proxy(IHTMLLIElement *This,long *p);
  void __RPC_STUB IHTMLLIElement_get_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLLIElement_DISPINTERFACE_DEFINED__
#define __DispHTMLLIElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLLIElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLLIElement : public IDispatch {
  };
#else
  typedef struct DispHTMLLIElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLLIElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLLIElement *This);
      ULONG (WINAPI *Release)(DispHTMLLIElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLLIElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLLIElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLLIElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLLIElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLLIElement;
#ifdef __cplusplus
  class HTMLLIElement;
#endif

#ifndef __IHTMLBlockElement_INTERFACE_DEFINED__
#define __IHTMLBlockElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLBlockElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLBlockElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_clear(BSTR v) = 0;
    virtual HRESULT WINAPI get_clear(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLBlockElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLBlockElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLBlockElement *This);
      ULONG (WINAPI *Release)(IHTMLBlockElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLBlockElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLBlockElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLBlockElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLBlockElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_clear)(IHTMLBlockElement *This,BSTR v);
      HRESULT (WINAPI *get_clear)(IHTMLBlockElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLBlockElementVtbl;
  interface IHTMLBlockElement {
    CONST_VTBL struct IHTMLBlockElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLBlockElement_put_clear(This,v) (This)->lpVtbl->put_clear(This,v)
#define IHTMLBlockElement_get_clear(This,p) (This)->lpVtbl->get_clear(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLBlockElement_put_clear_Proxy(IHTMLBlockElement *This,BSTR v);
  void __RPC_STUB IHTMLBlockElement_put_clear_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBlockElement_get_clear_Proxy(IHTMLBlockElement *This,BSTR *p);
  void __RPC_STUB IHTMLBlockElement_get_clear_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLBlockElement2_INTERFACE_DEFINED__
#define __IHTMLBlockElement2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLBlockElement2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLBlockElement2 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_cite(BSTR v) = 0;
    virtual HRESULT WINAPI get_cite(BSTR *p) = 0;
    virtual HRESULT WINAPI put_width(BSTR v) = 0;
    virtual HRESULT WINAPI get_width(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLBlockElement2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLBlockElement2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLBlockElement2 *This);
      ULONG (WINAPI *Release)(IHTMLBlockElement2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLBlockElement2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLBlockElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLBlockElement2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLBlockElement2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_cite)(IHTMLBlockElement2 *This,BSTR v);
      HRESULT (WINAPI *get_cite)(IHTMLBlockElement2 *This,BSTR *p);
      HRESULT (WINAPI *put_width)(IHTMLBlockElement2 *This,BSTR v);
      HRESULT (WINAPI *get_width)(IHTMLBlockElement2 *This,BSTR *p);
    END_INTERFACE
  } IHTMLBlockElement2Vtbl;
  interface IHTMLBlockElement2 {
    CONST_VTBL struct IHTMLBlockElement2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLBlockElement2_put_cite_Proxy(IHTMLBlockElement2 *This,BSTR v);
  void __RPC_STUB IHTMLBlockElement2_put_cite_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBlockElement2_get_cite_Proxy(IHTMLBlockElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLBlockElement2_get_cite_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBlockElement2_put_width_Proxy(IHTMLBlockElement2 *This,BSTR v);
  void __RPC_STUB IHTMLBlockElement2_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBlockElement2_get_width_Proxy(IHTMLBlockElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLBlockElement2_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLBlockElement_DISPINTERFACE_DEFINED__
#define __DispHTMLBlockElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLBlockElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLBlockElement : public IDispatch {
  };
#else
  typedef struct DispHTMLBlockElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLBlockElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLBlockElement *This);
      ULONG (WINAPI *Release)(DispHTMLBlockElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLBlockElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLBlockElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLBlockElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLBlockElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLBlockElement;
#ifdef __cplusplus
  class HTMLBlockElement;
#endif

#ifndef __IHTMLDivElement_INTERFACE_DEFINED__
#define __IHTMLDivElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDivElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDivElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_align(BSTR v) = 0;
    virtual HRESULT WINAPI get_align(BSTR *p) = 0;
    virtual HRESULT WINAPI put_noWrap(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_noWrap(VARIANT_BOOL *p) = 0;
  };
#else
  typedef struct IHTMLDivElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDivElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDivElement *This);
      ULONG (WINAPI *Release)(IHTMLDivElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDivElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDivElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDivElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDivElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_align)(IHTMLDivElement *This,BSTR v);
      HRESULT (WINAPI *get_align)(IHTMLDivElement *This,BSTR *p);
      HRESULT (WINAPI *put_noWrap)(IHTMLDivElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_noWrap)(IHTMLDivElement *This,VARIANT_BOOL *p);
    END_INTERFACE
  } IHTMLDivElementVtbl;
  interface IHTMLDivElement {
    CONST_VTBL struct IHTMLDivElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLDivElement_put_align_Proxy(IHTMLDivElement *This,BSTR v);
  void __RPC_STUB IHTMLDivElement_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDivElement_get_align_Proxy(IHTMLDivElement *This,BSTR *p);
  void __RPC_STUB IHTMLDivElement_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDivElement_put_noWrap_Proxy(IHTMLDivElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLDivElement_put_noWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDivElement_get_noWrap_Proxy(IHTMLDivElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLDivElement_get_noWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLDivElement_DISPINTERFACE_DEFINED__
#define __DispHTMLDivElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLDivElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLDivElement : public IDispatch {
  };
#else
  typedef struct DispHTMLDivElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLDivElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLDivElement *This);
      ULONG (WINAPI *Release)(DispHTMLDivElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLDivElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLDivElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLDivElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLDivElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLDivElement;
#ifdef __cplusplus
  class HTMLDivElement;
#endif

#ifndef __IHTMLDDElement_INTERFACE_DEFINED__
#define __IHTMLDDElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDDElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDDElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_noWrap(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_noWrap(VARIANT_BOOL *p) = 0;
  };
#else
  typedef struct IHTMLDDElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDDElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDDElement *This);
      ULONG (WINAPI *Release)(IHTMLDDElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDDElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDDElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDDElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDDElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_noWrap)(IHTMLDDElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_noWrap)(IHTMLDDElement *This,VARIANT_BOOL *p);
    END_INTERFACE
  } IHTMLDDElementVtbl;
  interface IHTMLDDElement {
    CONST_VTBL struct IHTMLDDElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLDDElement_put_noWrap(This,v) (This)->lpVtbl->put_noWrap(This,v)
#define IHTMLDDElement_get_noWrap(This,p) (This)->lpVtbl->get_noWrap(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLDDElement_put_noWrap_Proxy(IHTMLDDElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLDDElement_put_noWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDDElement_get_noWrap_Proxy(IHTMLDDElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLDDElement_get_noWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLDDElement_DISPINTERFACE_DEFINED__
#define __DispHTMLDDElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLDDElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLDDElement : public IDispatch {
  };
#else
  typedef struct DispHTMLDDElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLDDElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLDDElement *This);
      ULONG (WINAPI *Release)(DispHTMLDDElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLDDElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLDDElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLDDElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLDDElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLDDElement;
#ifdef __cplusplus
  class HTMLDDElement;
#endif

#ifndef __IHTMLDTElement_INTERFACE_DEFINED__
#define __IHTMLDTElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDTElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDTElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_noWrap(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_noWrap(VARIANT_BOOL *p) = 0;
  };
#else
  typedef struct IHTMLDTElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDTElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDTElement *This);
      ULONG (WINAPI *Release)(IHTMLDTElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDTElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDTElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDTElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDTElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_noWrap)(IHTMLDTElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_noWrap)(IHTMLDTElement *This,VARIANT_BOOL *p);
    END_INTERFACE
  } IHTMLDTElementVtbl;
  interface IHTMLDTElement {
    CONST_VTBL struct IHTMLDTElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLDTElement_put_noWrap(This,v) (This)->lpVtbl->put_noWrap(This,v)
#define IHTMLDTElement_get_noWrap(This,p) (This)->lpVtbl->get_noWrap(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLDTElement_put_noWrap_Proxy(IHTMLDTElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLDTElement_put_noWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDTElement_get_noWrap_Proxy(IHTMLDTElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLDTElement_get_noWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLDTElement_DISPINTERFACE_DEFINED__
#define __DispHTMLDTElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLDTElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLDTElement : public IDispatch {
  };
#else
  typedef struct DispHTMLDTElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLDTElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLDTElement *This);
      ULONG (WINAPI *Release)(DispHTMLDTElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLDTElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLDTElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLDTElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLDTElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLDTElement;
#ifdef __cplusplus
  class HTMLDTElement;
#endif

#ifndef __IHTMLBRElement_INTERFACE_DEFINED__
#define __IHTMLBRElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLBRElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLBRElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_clear(BSTR v) = 0;
    virtual HRESULT WINAPI get_clear(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLBRElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLBRElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLBRElement *This);
      ULONG (WINAPI *Release)(IHTMLBRElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLBRElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLBRElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLBRElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLBRElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_clear)(IHTMLBRElement *This,BSTR v);
      HRESULT (WINAPI *get_clear)(IHTMLBRElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLBRElementVtbl;
  interface IHTMLBRElement {
    CONST_VTBL struct IHTMLBRElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLBRElement_put_clear(This,v) (This)->lpVtbl->put_clear(This,v)
#define IHTMLBRElement_get_clear(This,p) (This)->lpVtbl->get_clear(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLBRElement_put_clear_Proxy(IHTMLBRElement *This,BSTR v);
  void __RPC_STUB IHTMLBRElement_put_clear_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBRElement_get_clear_Proxy(IHTMLBRElement *This,BSTR *p);
  void __RPC_STUB IHTMLBRElement_get_clear_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLBRElement_DISPINTERFACE_DEFINED__
#define __DispHTMLBRElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLBRElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLBRElement : public IDispatch {
  };
#else
  typedef struct DispHTMLBRElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLBRElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLBRElement *This);
      ULONG (WINAPI *Release)(DispHTMLBRElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLBRElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLBRElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLBRElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLBRElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLBRElement;
#ifdef __cplusplus
  class HTMLBRElement;
#endif

#ifndef __IHTMLDListElement_INTERFACE_DEFINED__
#define __IHTMLDListElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDListElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDListElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_compact(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_compact(VARIANT_BOOL *p) = 0;
  };
#else
  typedef struct IHTMLDListElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDListElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDListElement *This);
      ULONG (WINAPI *Release)(IHTMLDListElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDListElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDListElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDListElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDListElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_compact)(IHTMLDListElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_compact)(IHTMLDListElement *This,VARIANT_BOOL *p);
    END_INTERFACE
  } IHTMLDListElementVtbl;
  interface IHTMLDListElement {
    CONST_VTBL struct IHTMLDListElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLDListElement_put_compact(This,v) (This)->lpVtbl->put_compact(This,v)
#define IHTMLDListElement_get_compact(This,p) (This)->lpVtbl->get_compact(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLDListElement_put_compact_Proxy(IHTMLDListElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLDListElement_put_compact_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDListElement_get_compact_Proxy(IHTMLDListElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLDListElement_get_compact_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLDListElement_DISPINTERFACE_DEFINED__
#define __DispHTMLDListElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLDListElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLDListElement : public IDispatch {
  };
#else
  typedef struct DispHTMLDListElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLDListElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLDListElement *This);
      ULONG (WINAPI *Release)(DispHTMLDListElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLDListElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLDListElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLDListElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLDListElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLDListElement;
#ifdef __cplusplus
  class HTMLDListElement;
#endif

#ifndef __IHTMLHRElement_INTERFACE_DEFINED__
#define __IHTMLHRElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLHRElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLHRElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_align(BSTR v) = 0;
    virtual HRESULT WINAPI get_align(BSTR *p) = 0;
    virtual HRESULT WINAPI put_color(VARIANT v) = 0;
    virtual HRESULT WINAPI get_color(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_noShade(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_noShade(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_width(VARIANT v) = 0;
    virtual HRESULT WINAPI get_width(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_size(VARIANT v) = 0;
    virtual HRESULT WINAPI get_size(VARIANT *p) = 0;
  };
#else
  typedef struct IHTMLHRElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLHRElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLHRElement *This);
      ULONG (WINAPI *Release)(IHTMLHRElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLHRElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLHRElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLHRElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLHRElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_align)(IHTMLHRElement *This,BSTR v);
      HRESULT (WINAPI *get_align)(IHTMLHRElement *This,BSTR *p);
      HRESULT (WINAPI *put_color)(IHTMLHRElement *This,VARIANT v);
      HRESULT (WINAPI *get_color)(IHTMLHRElement *This,VARIANT *p);
      HRESULT (WINAPI *put_noShade)(IHTMLHRElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_noShade)(IHTMLHRElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_width)(IHTMLHRElement *This,VARIANT v);
      HRESULT (WINAPI *get_width)(IHTMLHRElement *This,VARIANT *p);
      HRESULT (WINAPI *put_size)(IHTMLHRElement *This,VARIANT v);
      HRESULT (WINAPI *get_size)(IHTMLHRElement *This,VARIANT *p);
    END_INTERFACE
  } IHTMLHRElementVtbl;
  interface IHTMLHRElement {
    CONST_VTBL struct IHTMLHRElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLHRElement_put_align_Proxy(IHTMLHRElement *This,BSTR v);
  void __RPC_STUB IHTMLHRElement_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLHRElement_get_align_Proxy(IHTMLHRElement *This,BSTR *p);
  void __RPC_STUB IHTMLHRElement_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLHRElement_put_color_Proxy(IHTMLHRElement *This,VARIANT v);
  void __RPC_STUB IHTMLHRElement_put_color_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLHRElement_get_color_Proxy(IHTMLHRElement *This,VARIANT *p);
  void __RPC_STUB IHTMLHRElement_get_color_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLHRElement_put_noShade_Proxy(IHTMLHRElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLHRElement_put_noShade_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLHRElement_get_noShade_Proxy(IHTMLHRElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLHRElement_get_noShade_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLHRElement_put_width_Proxy(IHTMLHRElement *This,VARIANT v);
  void __RPC_STUB IHTMLHRElement_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLHRElement_get_width_Proxy(IHTMLHRElement *This,VARIANT *p);
  void __RPC_STUB IHTMLHRElement_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLHRElement_put_size_Proxy(IHTMLHRElement *This,VARIANT v);
  void __RPC_STUB IHTMLHRElement_put_size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLHRElement_get_size_Proxy(IHTMLHRElement *This,VARIANT *p);
  void __RPC_STUB IHTMLHRElement_get_size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLHRElement_DISPINTERFACE_DEFINED__
#define __DispHTMLHRElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLHRElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLHRElement : public IDispatch {
  };
#else
  typedef struct DispHTMLHRElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLHRElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLHRElement *This);
      ULONG (WINAPI *Release)(DispHTMLHRElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLHRElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLHRElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLHRElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLHRElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLHRElement;
#ifdef __cplusplus
  class HTMLHRElement;
#endif

#ifndef __IHTMLParaElement_INTERFACE_DEFINED__
#define __IHTMLParaElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLParaElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLParaElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_align(BSTR v) = 0;
    virtual HRESULT WINAPI get_align(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLParaElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLParaElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLParaElement *This);
      ULONG (WINAPI *Release)(IHTMLParaElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLParaElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLParaElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLParaElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLParaElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_align)(IHTMLParaElement *This,BSTR v);
      HRESULT (WINAPI *get_align)(IHTMLParaElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLParaElementVtbl;
  interface IHTMLParaElement {
    CONST_VTBL struct IHTMLParaElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLParaElement_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLParaElement_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLParaElement_put_align_Proxy(IHTMLParaElement *This,BSTR v);
  void __RPC_STUB IHTMLParaElement_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLParaElement_get_align_Proxy(IHTMLParaElement *This,BSTR *p);
  void __RPC_STUB IHTMLParaElement_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLParaElement_DISPINTERFACE_DEFINED__
#define __DispHTMLParaElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLParaElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLParaElement : public IDispatch {
  };
#else
  typedef struct DispHTMLParaElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLParaElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLParaElement *This);
      ULONG (WINAPI *Release)(DispHTMLParaElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLParaElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLParaElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLParaElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLParaElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLParaElement;
#ifdef __cplusplus
  class HTMLParaElement;
#endif

#ifndef __IHTMLElementCollection2_INTERFACE_DEFINED__
#define __IHTMLElementCollection2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLElementCollection2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLElementCollection2 : public IDispatch {
  public:
    virtual HRESULT WINAPI urns(VARIANT urn,IDispatch **pdisp) = 0;
  };
#else
  typedef struct IHTMLElementCollection2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLElementCollection2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLElementCollection2 *This);
      ULONG (WINAPI *Release)(IHTMLElementCollection2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLElementCollection2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLElementCollection2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLElementCollection2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLElementCollection2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *urns)(IHTMLElementCollection2 *This,VARIANT urn,IDispatch **pdisp);
    END_INTERFACE
  } IHTMLElementCollection2Vtbl;
  interface IHTMLElementCollection2 {
    CONST_VTBL struct IHTMLElementCollection2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLElementCollection2_urns(This,urn,pdisp) (This)->lpVtbl->urns(This,urn,pdisp)
#endif
#endif
  HRESULT WINAPI IHTMLElementCollection2_urns_Proxy(IHTMLElementCollection2 *This,VARIANT urn,IDispatch **pdisp);
  void __RPC_STUB IHTMLElementCollection2_urns_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLElementCollection3_INTERFACE_DEFINED__
#define __IHTMLElementCollection3_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLElementCollection3;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLElementCollection3 : public IDispatch {
  public:
    virtual HRESULT WINAPI namedItem(BSTR name,IDispatch **pdisp) = 0;
  };
#else
  typedef struct IHTMLElementCollection3Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLElementCollection3 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLElementCollection3 *This);
      ULONG (WINAPI *Release)(IHTMLElementCollection3 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLElementCollection3 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLElementCollection3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLElementCollection3 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLElementCollection3 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *namedItem)(IHTMLElementCollection3 *This,BSTR name,IDispatch **pdisp);
    END_INTERFACE
  } IHTMLElementCollection3Vtbl;
  interface IHTMLElementCollection3 {
    CONST_VTBL struct IHTMLElementCollection3Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLElementCollection3_namedItem(This,name,pdisp) (This)->lpVtbl->namedItem(This,name,pdisp)
#endif
#endif
  HRESULT WINAPI IHTMLElementCollection3_namedItem_Proxy(IHTMLElementCollection3 *This,BSTR name,IDispatch **pdisp);
  void __RPC_STUB IHTMLElementCollection3_namedItem_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLElementCollection_DISPINTERFACE_DEFINED__
#define __DispHTMLElementCollection_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLElementCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLElementCollection : public IDispatch {
  };
#else
  typedef struct DispHTMLElementCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLElementCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLElementCollection *This);
      ULONG (WINAPI *Release)(DispHTMLElementCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLElementCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLElementCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLElementCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLElementCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLElementCollection;
#ifdef __cplusplus
  class HTMLElementCollection;
#endif

#ifndef __IHTMLHeaderElement_INTERFACE_DEFINED__
#define __IHTMLHeaderElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLHeaderElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLHeaderElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_align(BSTR v) = 0;
    virtual HRESULT WINAPI get_align(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLHeaderElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLHeaderElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLHeaderElement *This);
      ULONG (WINAPI *Release)(IHTMLHeaderElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLHeaderElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLHeaderElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLHeaderElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLHeaderElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_align)(IHTMLHeaderElement *This,BSTR v);
      HRESULT (WINAPI *get_align)(IHTMLHeaderElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLHeaderElementVtbl;
  interface IHTMLHeaderElement {
    CONST_VTBL struct IHTMLHeaderElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLHeaderElement_put_align(This,v) (This)->lpVtbl->put_align(This,v)
#define IHTMLHeaderElement_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLHeaderElement_put_align_Proxy(IHTMLHeaderElement *This,BSTR v);
  void __RPC_STUB IHTMLHeaderElement_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLHeaderElement_get_align_Proxy(IHTMLHeaderElement *This,BSTR *p);
  void __RPC_STUB IHTMLHeaderElement_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLHeaderElement_DISPINTERFACE_DEFINED__
#define __DispHTMLHeaderElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLHeaderElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLHeaderElement : public IDispatch {
  };
#else
  typedef struct DispHTMLHeaderElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLHeaderElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLHeaderElement *This);
      ULONG (WINAPI *Release)(DispHTMLHeaderElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLHeaderElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLHeaderElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLHeaderElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLHeaderElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLHeaderElement;
#ifdef __cplusplus
  class HTMLHeaderElement;
#endif

#ifndef __HTMLSelectElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLSelectElementEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLSelectElementEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLSelectElementEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLSelectElementEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLSelectElementEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLSelectElementEvents2 *This);
      ULONG (WINAPI *Release)(HTMLSelectElementEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLSelectElementEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLSelectElementEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLSelectElementEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLSelectElementEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLSelectElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLSelectElementEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLSelectElementEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLSelectElementEvents : public IDispatch {
  };
#else
  typedef struct HTMLSelectElementEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLSelectElementEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLSelectElementEvents *This);
      ULONG (WINAPI *Release)(HTMLSelectElementEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLSelectElementEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLSelectElementEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLSelectElementEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLSelectElementEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __IHTMLSelectElement_INTERFACE_DEFINED__
#define __IHTMLSelectElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLSelectElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLSelectElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_size(long v) = 0;
    virtual HRESULT WINAPI get_size(long *p) = 0;
    virtual HRESULT WINAPI put_multiple(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_multiple(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI get_options(IDispatch **p) = 0;
    virtual HRESULT WINAPI put_onchange(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onchange(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_selectedIndex(long v) = 0;
    virtual HRESULT WINAPI get_selectedIndex(long *p) = 0;
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI put_value(BSTR v) = 0;
    virtual HRESULT WINAPI get_value(BSTR *p) = 0;
    virtual HRESULT WINAPI put_disabled(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_disabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;
    virtual HRESULT WINAPI add(IHTMLElement *element,VARIANT before) = 0;
    virtual HRESULT WINAPI remove(long index = -1) = 0;
    virtual HRESULT WINAPI put_length(long v) = 0;
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;
    virtual HRESULT WINAPI item(VARIANT name,VARIANT index,IDispatch **pdisp) = 0;
    virtual HRESULT WINAPI tags(VARIANT tagName,IDispatch **pdisp) = 0;
  };
#else
  typedef struct IHTMLSelectElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLSelectElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLSelectElement *This);
      ULONG (WINAPI *Release)(IHTMLSelectElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLSelectElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLSelectElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLSelectElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLSelectElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_size)(IHTMLSelectElement *This,long v);
      HRESULT (WINAPI *get_size)(IHTMLSelectElement *This,long *p);
      HRESULT (WINAPI *put_multiple)(IHTMLSelectElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_multiple)(IHTMLSelectElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_name)(IHTMLSelectElement *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLSelectElement *This,BSTR *p);
      HRESULT (WINAPI *get_options)(IHTMLSelectElement *This,IDispatch **p);
      HRESULT (WINAPI *put_onchange)(IHTMLSelectElement *This,VARIANT v);
      HRESULT (WINAPI *get_onchange)(IHTMLSelectElement *This,VARIANT *p);
      HRESULT (WINAPI *put_selectedIndex)(IHTMLSelectElement *This,long v);
      HRESULT (WINAPI *get_selectedIndex)(IHTMLSelectElement *This,long *p);
      HRESULT (WINAPI *get_type)(IHTMLSelectElement *This,BSTR *p);
      HRESULT (WINAPI *put_value)(IHTMLSelectElement *This,BSTR v);
      HRESULT (WINAPI *get_value)(IHTMLSelectElement *This,BSTR *p);
      HRESULT (WINAPI *put_disabled)(IHTMLSelectElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_disabled)(IHTMLSelectElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_form)(IHTMLSelectElement *This,IHTMLFormElement **p);
      HRESULT (WINAPI *add)(IHTMLSelectElement *This,IHTMLElement *element,VARIANT before);
      HRESULT (WINAPI *remove)(IHTMLSelectElement *This,long index);
      HRESULT (WINAPI *put_length)(IHTMLSelectElement *This,long v);
      HRESULT (WINAPI *get_length)(IHTMLSelectElement *This,long *p);
      HRESULT (WINAPI *get__newEnum)(IHTMLSelectElement *This,IUnknown **p);
      HRESULT (WINAPI *item)(IHTMLSelectElement *This,VARIANT name,VARIANT index,IDispatch **pdisp);
      HRESULT (WINAPI *tags)(IHTMLSelectElement *This,VARIANT tagName,IDispatch **pdisp);
    END_INTERFACE
  } IHTMLSelectElementVtbl;
  interface IHTMLSelectElement {
    CONST_VTBL struct IHTMLSelectElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLSelectElement_put_size_Proxy(IHTMLSelectElement *This,long v);
  void __RPC_STUB IHTMLSelectElement_put_size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_get_size_Proxy(IHTMLSelectElement *This,long *p);
  void __RPC_STUB IHTMLSelectElement_get_size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_put_multiple_Proxy(IHTMLSelectElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLSelectElement_put_multiple_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_get_multiple_Proxy(IHTMLSelectElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLSelectElement_get_multiple_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_put_name_Proxy(IHTMLSelectElement *This,BSTR v);
  void __RPC_STUB IHTMLSelectElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_get_name_Proxy(IHTMLSelectElement *This,BSTR *p);
  void __RPC_STUB IHTMLSelectElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_get_options_Proxy(IHTMLSelectElement *This,IDispatch **p);
  void __RPC_STUB IHTMLSelectElement_get_options_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_put_onchange_Proxy(IHTMLSelectElement *This,VARIANT v);
  void __RPC_STUB IHTMLSelectElement_put_onchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_get_onchange_Proxy(IHTMLSelectElement *This,VARIANT *p);
  void __RPC_STUB IHTMLSelectElement_get_onchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_put_selectedIndex_Proxy(IHTMLSelectElement *This,long v);
  void __RPC_STUB IHTMLSelectElement_put_selectedIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_get_selectedIndex_Proxy(IHTMLSelectElement *This,long *p);
  void __RPC_STUB IHTMLSelectElement_get_selectedIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_get_type_Proxy(IHTMLSelectElement *This,BSTR *p);
  void __RPC_STUB IHTMLSelectElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_put_value_Proxy(IHTMLSelectElement *This,BSTR v);
  void __RPC_STUB IHTMLSelectElement_put_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_get_value_Proxy(IHTMLSelectElement *This,BSTR *p);
  void __RPC_STUB IHTMLSelectElement_get_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_put_disabled_Proxy(IHTMLSelectElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLSelectElement_put_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_get_disabled_Proxy(IHTMLSelectElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLSelectElement_get_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_get_form_Proxy(IHTMLSelectElement *This,IHTMLFormElement **p);
  void __RPC_STUB IHTMLSelectElement_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_add_Proxy(IHTMLSelectElement *This,IHTMLElement *element,VARIANT before);
  void __RPC_STUB IHTMLSelectElement_add_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_remove_Proxy(IHTMLSelectElement *This,long index);
  void __RPC_STUB IHTMLSelectElement_remove_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_put_length_Proxy(IHTMLSelectElement *This,long v);
  void __RPC_STUB IHTMLSelectElement_put_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_get_length_Proxy(IHTMLSelectElement *This,long *p);
  void __RPC_STUB IHTMLSelectElement_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_get__newEnum_Proxy(IHTMLSelectElement *This,IUnknown **p);
  void __RPC_STUB IHTMLSelectElement_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_item_Proxy(IHTMLSelectElement *This,VARIANT name,VARIANT index,IDispatch **pdisp);
  void __RPC_STUB IHTMLSelectElement_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectElement_tags_Proxy(IHTMLSelectElement *This,VARIANT tagName,IDispatch **pdisp);
  void __RPC_STUB IHTMLSelectElement_tags_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLSelectElement2_INTERFACE_DEFINED__
#define __IHTMLSelectElement2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLSelectElement2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLSelectElement2 : public IDispatch {
  public:
    virtual HRESULT WINAPI urns(VARIANT urn,IDispatch **pdisp) = 0;
  };
#else
  typedef struct IHTMLSelectElement2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLSelectElement2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLSelectElement2 *This);
      ULONG (WINAPI *Release)(IHTMLSelectElement2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLSelectElement2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLSelectElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLSelectElement2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLSelectElement2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *urns)(IHTMLSelectElement2 *This,VARIANT urn,IDispatch **pdisp);
    END_INTERFACE
  } IHTMLSelectElement2Vtbl;
  interface IHTMLSelectElement2 {
    CONST_VTBL struct IHTMLSelectElement2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLSelectElement2_urns(This,urn,pdisp) (This)->lpVtbl->urns(This,urn,pdisp)
#endif
#endif
  HRESULT WINAPI IHTMLSelectElement2_urns_Proxy(IHTMLSelectElement2 *This,VARIANT urn,IDispatch **pdisp);
  void __RPC_STUB IHTMLSelectElement2_urns_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLSelectElement4_INTERFACE_DEFINED__
#define __IHTMLSelectElement4_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLSelectElement4;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLSelectElement4 : public IDispatch {
  public:
    virtual HRESULT WINAPI namedItem(BSTR name,IDispatch **pdisp) = 0;
  };
#else
  typedef struct IHTMLSelectElement4Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLSelectElement4 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLSelectElement4 *This);
      ULONG (WINAPI *Release)(IHTMLSelectElement4 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLSelectElement4 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLSelectElement4 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLSelectElement4 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLSelectElement4 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *namedItem)(IHTMLSelectElement4 *This,BSTR name,IDispatch **pdisp);
    END_INTERFACE
  } IHTMLSelectElement4Vtbl;
  interface IHTMLSelectElement4 {
    CONST_VTBL struct IHTMLSelectElement4Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLSelectElement4_namedItem(This,name,pdisp) (This)->lpVtbl->namedItem(This,name,pdisp)
#endif
#endif
  HRESULT WINAPI IHTMLSelectElement4_namedItem_Proxy(IHTMLSelectElement4 *This,BSTR name,IDispatch **pdisp);
  void __RPC_STUB IHTMLSelectElement4_namedItem_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLSelectElement_DISPINTERFACE_DEFINED__
#define __DispHTMLSelectElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLSelectElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLSelectElement : public IDispatch {
  };
#else
  typedef struct DispHTMLSelectElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLSelectElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLSelectElement *This);
      ULONG (WINAPI *Release)(DispHTMLSelectElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLSelectElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLSelectElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLSelectElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLSelectElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLSelectElement;
#ifdef __cplusplus
  class HTMLSelectElement;
#endif

#ifndef __IHTMLSelectionObject_INTERFACE_DEFINED__
#define __IHTMLSelectionObject_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLSelectionObject;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLSelectionObject : public IDispatch {
  public:
    virtual HRESULT WINAPI createRange(IDispatch **range) = 0;
    virtual HRESULT WINAPI empty(void) = 0;
    virtual HRESULT WINAPI clear(void) = 0;
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLSelectionObjectVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLSelectionObject *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLSelectionObject *This);
      ULONG (WINAPI *Release)(IHTMLSelectionObject *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLSelectionObject *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLSelectionObject *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLSelectionObject *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLSelectionObject *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *createRange)(IHTMLSelectionObject *This,IDispatch **range);
      HRESULT (WINAPI *empty)(IHTMLSelectionObject *This);
      HRESULT (WINAPI *clear)(IHTMLSelectionObject *This);
      HRESULT (WINAPI *get_type)(IHTMLSelectionObject *This,BSTR *p);
    END_INTERFACE
  } IHTMLSelectionObjectVtbl;
  interface IHTMLSelectionObject {
    CONST_VTBL struct IHTMLSelectionObjectVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLSelectionObject_createRange_Proxy(IHTMLSelectionObject *This,IDispatch **range);
  void __RPC_STUB IHTMLSelectionObject_createRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectionObject_empty_Proxy(IHTMLSelectionObject *This);
  void __RPC_STUB IHTMLSelectionObject_empty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectionObject_clear_Proxy(IHTMLSelectionObject *This);
  void __RPC_STUB IHTMLSelectionObject_clear_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectionObject_get_type_Proxy(IHTMLSelectionObject *This,BSTR *p);
  void __RPC_STUB IHTMLSelectionObject_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLSelectionObject2_INTERFACE_DEFINED__
#define __IHTMLSelectionObject2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLSelectionObject2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLSelectionObject2 : public IDispatch {
  public:
    virtual HRESULT WINAPI createRangeCollection(IDispatch **rangeCollection) = 0;
    virtual HRESULT WINAPI get_typeDetail(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLSelectionObject2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLSelectionObject2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLSelectionObject2 *This);
      ULONG (WINAPI *Release)(IHTMLSelectionObject2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLSelectionObject2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLSelectionObject2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLSelectionObject2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLSelectionObject2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *createRangeCollection)(IHTMLSelectionObject2 *This,IDispatch **rangeCollection);
      HRESULT (WINAPI *get_typeDetail)(IHTMLSelectionObject2 *This,BSTR *p);
    END_INTERFACE
  } IHTMLSelectionObject2Vtbl;
  interface IHTMLSelectionObject2 {
    CONST_VTBL struct IHTMLSelectionObject2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLSelectionObject2_createRangeCollection(This,rangeCollection) (This)->lpVtbl->createRangeCollection(This,rangeCollection)
#define IHTMLSelectionObject2_get_typeDetail(This,p) (This)->lpVtbl->get_typeDetail(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLSelectionObject2_createRangeCollection_Proxy(IHTMLSelectionObject2 *This,IDispatch **rangeCollection);
  void __RPC_STUB IHTMLSelectionObject2_createRangeCollection_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLSelectionObject2_get_typeDetail_Proxy(IHTMLSelectionObject2 *This,BSTR *p);
  void __RPC_STUB IHTMLSelectionObject2_get_typeDetail_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLOptionElement_INTERFACE_DEFINED__
#define __IHTMLOptionElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLOptionElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLOptionElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_selected(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_selected(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_value(BSTR v) = 0;
    virtual HRESULT WINAPI get_value(BSTR *p) = 0;
    virtual HRESULT WINAPI put_defaultSelected(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_defaultSelected(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_index(LONG v) = 0;
    virtual HRESULT WINAPI get_index(LONG *p) = 0;
    virtual HRESULT WINAPI put_text(BSTR v) = 0;
    virtual HRESULT WINAPI get_text(BSTR *p) = 0;
    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;
  };
#else
  typedef struct IHTMLOptionElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLOptionElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLOptionElement *This);
      ULONG (WINAPI *Release)(IHTMLOptionElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLOptionElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLOptionElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLOptionElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLOptionElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_selected)(IHTMLOptionElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_selected)(IHTMLOptionElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_value)(IHTMLOptionElement *This,BSTR v);
      HRESULT (WINAPI *get_value)(IHTMLOptionElement *This,BSTR *p);
      HRESULT (WINAPI *put_defaultSelected)(IHTMLOptionElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_defaultSelected)(IHTMLOptionElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_index)(IHTMLOptionElement *This,LONG v);
      HRESULT (WINAPI *get_index)(IHTMLOptionElement *This,LONG *p);
      HRESULT (WINAPI *put_text)(IHTMLOptionElement *This,BSTR v);
      HRESULT (WINAPI *get_text)(IHTMLOptionElement *This,BSTR *p);
      HRESULT (WINAPI *get_form)(IHTMLOptionElement *This,IHTMLFormElement **p);
    END_INTERFACE
  } IHTMLOptionElementVtbl;
  interface IHTMLOptionElement {
    CONST_VTBL struct IHTMLOptionElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLOptionElement_put_selected_Proxy(IHTMLOptionElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLOptionElement_put_selected_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionElement_get_selected_Proxy(IHTMLOptionElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLOptionElement_get_selected_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionElement_put_value_Proxy(IHTMLOptionElement *This,BSTR v);
  void __RPC_STUB IHTMLOptionElement_put_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionElement_get_value_Proxy(IHTMLOptionElement *This,BSTR *p);
  void __RPC_STUB IHTMLOptionElement_get_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionElement_put_defaultSelected_Proxy(IHTMLOptionElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLOptionElement_put_defaultSelected_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionElement_get_defaultSelected_Proxy(IHTMLOptionElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLOptionElement_get_defaultSelected_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionElement_put_index_Proxy(IHTMLOptionElement *This,LONG v);
  void __RPC_STUB IHTMLOptionElement_put_index_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionElement_get_index_Proxy(IHTMLOptionElement *This,LONG *p);
  void __RPC_STUB IHTMLOptionElement_get_index_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionElement_put_text_Proxy(IHTMLOptionElement *This,BSTR v);
  void __RPC_STUB IHTMLOptionElement_put_text_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionElement_get_text_Proxy(IHTMLOptionElement *This,BSTR *p);
  void __RPC_STUB IHTMLOptionElement_get_text_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionElement_get_form_Proxy(IHTMLOptionElement *This,IHTMLFormElement **p);
  void __RPC_STUB IHTMLOptionElement_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLOptionElement3_INTERFACE_DEFINED__
#define __IHTMLOptionElement3_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLOptionElement3;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLOptionElement3 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_label(BSTR v) = 0;
    virtual HRESULT WINAPI get_label(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLOptionElement3Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLOptionElement3 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLOptionElement3 *This);
      ULONG (WINAPI *Release)(IHTMLOptionElement3 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLOptionElement3 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLOptionElement3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLOptionElement3 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLOptionElement3 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_label)(IHTMLOptionElement3 *This,BSTR v);
      HRESULT (WINAPI *get_label)(IHTMLOptionElement3 *This,BSTR *p);
    END_INTERFACE
  } IHTMLOptionElement3Vtbl;
  interface IHTMLOptionElement3 {
    CONST_VTBL struct IHTMLOptionElement3Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLOptionElement3_put_label(This,v) (This)->lpVtbl->put_label(This,v)
#define IHTMLOptionElement3_get_label(This,p) (This)->lpVtbl->get_label(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLOptionElement3_put_label_Proxy(IHTMLOptionElement3 *This,BSTR v);
  void __RPC_STUB IHTMLOptionElement3_put_label_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionElement3_get_label_Proxy(IHTMLOptionElement3 *This,BSTR *p);
  void __RPC_STUB IHTMLOptionElement3_get_label_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLOptionElementFactory_INTERFACE_DEFINED__
#define __IHTMLOptionElementFactory_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLOptionElementFactory;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLOptionElementFactory : public IDispatch {
  public:
    virtual HRESULT WINAPI create(VARIANT text,VARIANT value,VARIANT defaultselected,VARIANT selected,IHTMLOptionElement **__MIDL_0012) = 0;
  };
#else
  typedef struct IHTMLOptionElementFactoryVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLOptionElementFactory *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLOptionElementFactory *This);
      ULONG (WINAPI *Release)(IHTMLOptionElementFactory *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLOptionElementFactory *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLOptionElementFactory *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLOptionElementFactory *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLOptionElementFactory *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *create)(IHTMLOptionElementFactory *This,VARIANT text,VARIANT value,VARIANT defaultselected,VARIANT selected,IHTMLOptionElement **__MIDL_0012);
    END_INTERFACE
  } IHTMLOptionElementFactoryVtbl;
  interface IHTMLOptionElementFactory {
    CONST_VTBL struct IHTMLOptionElementFactoryVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLOptionElementFactory_create(This,text,value,defaultselected,selected,__MIDL_0012) (This)->lpVtbl->create(This,text,value,defaultselected,selected,__MIDL_0012)
#endif
#endif
  HRESULT WINAPI IHTMLOptionElementFactory_create_Proxy(IHTMLOptionElementFactory *This,VARIANT text,VARIANT value,VARIANT defaultselected,VARIANT selected,IHTMLOptionElement **__MIDL_0012);
  void __RPC_STUB IHTMLOptionElementFactory_create_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLOptionElement_DISPINTERFACE_DEFINED__
#define __DispHTMLOptionElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLOptionElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLOptionElement : public IDispatch {
  };
#else
  typedef struct DispHTMLOptionElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLOptionElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLOptionElement *This);
      ULONG (WINAPI *Release)(DispHTMLOptionElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLOptionElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLOptionElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLOptionElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLOptionElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLOptionElement;
#ifdef __cplusplus
  class HTMLOptionElement;
#endif
  EXTERN_C const CLSID CLSID_HTMLOptionElementFactory;
#ifdef __cplusplus
  class HTMLOptionElementFactory;
#endif

#ifndef __HTMLButtonElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLButtonElementEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLButtonElementEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLButtonElementEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLButtonElementEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLButtonElementEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLButtonElementEvents2 *This);
      ULONG (WINAPI *Release)(HTMLButtonElementEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLButtonElementEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLButtonElementEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLButtonElementEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLButtonElementEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLButtonElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLButtonElementEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLButtonElementEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLButtonElementEvents : public IDispatch {
  };
#else
  typedef struct HTMLButtonElementEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLButtonElementEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLButtonElementEvents *This);
      ULONG (WINAPI *Release)(HTMLButtonElementEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLButtonElementEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLButtonElementEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLButtonElementEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLButtonElementEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLInputTextElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLInputTextElementEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLInputTextElementEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLInputTextElementEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLInputTextElementEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLInputTextElementEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLInputTextElementEvents2 *This);
      ULONG (WINAPI *Release)(HTMLInputTextElementEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLInputTextElementEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLInputTextElementEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLInputTextElementEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLInputTextElementEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLOptionButtonElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLOptionButtonElementEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLOptionButtonElementEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLOptionButtonElementEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLOptionButtonElementEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLOptionButtonElementEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLOptionButtonElementEvents2 *This);
      ULONG (WINAPI *Release)(HTMLOptionButtonElementEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLOptionButtonElementEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLOptionButtonElementEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLOptionButtonElementEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLOptionButtonElementEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLInputFileElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLInputFileElementEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLInputFileElementEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLInputFileElementEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLInputFileElementEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLInputFileElementEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLInputFileElementEvents2 *This);
      ULONG (WINAPI *Release)(HTMLInputFileElementEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLInputFileElementEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLInputFileElementEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLInputFileElementEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLInputFileElementEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLInputImageEvents2_DISPINTERFACE_DEFINED__
#define __HTMLInputImageEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLInputImageEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLInputImageEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLInputImageEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLInputImageEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLInputImageEvents2 *This);
      ULONG (WINAPI *Release)(HTMLInputImageEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLInputImageEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLInputImageEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLInputImageEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLInputImageEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLInputTextElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLInputTextElementEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLInputTextElementEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLInputTextElementEvents : public IDispatch {
  };
#else
  typedef struct HTMLInputTextElementEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLInputTextElementEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLInputTextElementEvents *This);
      ULONG (WINAPI *Release)(HTMLInputTextElementEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLInputTextElementEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLInputTextElementEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLInputTextElementEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLInputTextElementEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLOptionButtonElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLOptionButtonElementEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLOptionButtonElementEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLOptionButtonElementEvents : public IDispatch {
  };
#else
  typedef struct HTMLOptionButtonElementEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLOptionButtonElementEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLOptionButtonElementEvents *This);
      ULONG (WINAPI *Release)(HTMLOptionButtonElementEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLOptionButtonElementEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLOptionButtonElementEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLOptionButtonElementEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLOptionButtonElementEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLInputFileElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLInputFileElementEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLInputFileElementEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLInputFileElementEvents : public IDispatch {
  };
#else
  typedef struct HTMLInputFileElementEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLInputFileElementEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLInputFileElementEvents *This);
      ULONG (WINAPI *Release)(HTMLInputFileElementEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLInputFileElementEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLInputFileElementEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLInputFileElementEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLInputFileElementEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLInputImageEvents_DISPINTERFACE_DEFINED__
#define __HTMLInputImageEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLInputImageEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLInputImageEvents : public IDispatch {
  };
#else
  typedef struct HTMLInputImageEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLInputImageEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLInputImageEvents *This);
      ULONG (WINAPI *Release)(HTMLInputImageEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLInputImageEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLInputImageEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLInputImageEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLInputImageEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __IHTMLInputElement_INTERFACE_DEFINED__
#define __IHTMLInputElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLInputElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLInputElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_type(BSTR v) = 0;
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI put_value(BSTR v) = 0;
    virtual HRESULT WINAPI get_value(BSTR *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_status(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_status(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_disabled(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_disabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;
    virtual HRESULT WINAPI put_size(long v) = 0;
    virtual HRESULT WINAPI get_size(long *p) = 0;
    virtual HRESULT WINAPI put_maxLength(long v) = 0;
    virtual HRESULT WINAPI get_maxLength(long *p) = 0;
    virtual HRESULT WINAPI select(void) = 0;
    virtual HRESULT WINAPI put_onchange(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onchange(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onselect(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onselect(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_defaultValue(BSTR v) = 0;
    virtual HRESULT WINAPI get_defaultValue(BSTR *p) = 0;
    virtual HRESULT WINAPI put_readOnly(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_readOnly(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI createTextRange(IHTMLTxtRange **range) = 0;
    virtual HRESULT WINAPI put_indeterminate(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_indeterminate(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_defaultChecked(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_defaultChecked(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_checked(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_checked(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_border(VARIANT v) = 0;
    virtual HRESULT WINAPI get_border(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_vspace(long v) = 0;
    virtual HRESULT WINAPI get_vspace(long *p) = 0;
    virtual HRESULT WINAPI put_hspace(long v) = 0;
    virtual HRESULT WINAPI get_hspace(long *p) = 0;
    virtual HRESULT WINAPI put_alt(BSTR v) = 0;
    virtual HRESULT WINAPI get_alt(BSTR *p) = 0;
    virtual HRESULT WINAPI put_src(BSTR v) = 0;
    virtual HRESULT WINAPI get_src(BSTR *p) = 0;
    virtual HRESULT WINAPI put_lowsrc(BSTR v) = 0;
    virtual HRESULT WINAPI get_lowsrc(BSTR *p) = 0;
    virtual HRESULT WINAPI put_vrml(BSTR v) = 0;
    virtual HRESULT WINAPI get_vrml(BSTR *p) = 0;
    virtual HRESULT WINAPI put_dynsrc(BSTR v) = 0;
    virtual HRESULT WINAPI get_dynsrc(BSTR *p) = 0;
    virtual HRESULT WINAPI get_readyState(BSTR *p) = 0;
    virtual HRESULT WINAPI get_complete(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_loop(VARIANT v) = 0;
    virtual HRESULT WINAPI get_loop(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_align(BSTR v) = 0;
    virtual HRESULT WINAPI get_align(BSTR *p) = 0;
    virtual HRESULT WINAPI put_onload(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onload(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onerror(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onerror(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onabort(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onabort(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_width(long v) = 0;
    virtual HRESULT WINAPI get_width(long *p) = 0;
    virtual HRESULT WINAPI put_height(long v) = 0;
    virtual HRESULT WINAPI get_height(long *p) = 0;
    virtual HRESULT WINAPI put_start(BSTR v) = 0;
    virtual HRESULT WINAPI get_start(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLInputElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLInputElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLInputElement *This);
      ULONG (WINAPI *Release)(IHTMLInputElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLInputElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLInputElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLInputElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLInputElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_type)(IHTMLInputElement *This,BSTR v);
      HRESULT (WINAPI *get_type)(IHTMLInputElement *This,BSTR *p);
      HRESULT (WINAPI *put_value)(IHTMLInputElement *This,BSTR v);
      HRESULT (WINAPI *get_value)(IHTMLInputElement *This,BSTR *p);
      HRESULT (WINAPI *put_name)(IHTMLInputElement *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLInputElement *This,BSTR *p);
      HRESULT (WINAPI *put_status)(IHTMLInputElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_status)(IHTMLInputElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_disabled)(IHTMLInputElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_disabled)(IHTMLInputElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_form)(IHTMLInputElement *This,IHTMLFormElement **p);
      HRESULT (WINAPI *put_size)(IHTMLInputElement *This,long v);
      HRESULT (WINAPI *get_size)(IHTMLInputElement *This,long *p);
      HRESULT (WINAPI *put_maxLength)(IHTMLInputElement *This,long v);
      HRESULT (WINAPI *get_maxLength)(IHTMLInputElement *This,long *p);
      HRESULT (WINAPI *select)(IHTMLInputElement *This);
      HRESULT (WINAPI *put_onchange)(IHTMLInputElement *This,VARIANT v);
      HRESULT (WINAPI *get_onchange)(IHTMLInputElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onselect)(IHTMLInputElement *This,VARIANT v);
      HRESULT (WINAPI *get_onselect)(IHTMLInputElement *This,VARIANT *p);
      HRESULT (WINAPI *put_defaultValue)(IHTMLInputElement *This,BSTR v);
      HRESULT (WINAPI *get_defaultValue)(IHTMLInputElement *This,BSTR *p);
      HRESULT (WINAPI *put_readOnly)(IHTMLInputElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_readOnly)(IHTMLInputElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *createTextRange)(IHTMLInputElement *This,IHTMLTxtRange **range);
      HRESULT (WINAPI *put_indeterminate)(IHTMLInputElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_indeterminate)(IHTMLInputElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_defaultChecked)(IHTMLInputElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_defaultChecked)(IHTMLInputElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_checked)(IHTMLInputElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_checked)(IHTMLInputElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_border)(IHTMLInputElement *This,VARIANT v);
      HRESULT (WINAPI *get_border)(IHTMLInputElement *This,VARIANT *p);
      HRESULT (WINAPI *put_vspace)(IHTMLInputElement *This,long v);
      HRESULT (WINAPI *get_vspace)(IHTMLInputElement *This,long *p);
      HRESULT (WINAPI *put_hspace)(IHTMLInputElement *This,long v);
      HRESULT (WINAPI *get_hspace)(IHTMLInputElement *This,long *p);
      HRESULT (WINAPI *put_alt)(IHTMLInputElement *This,BSTR v);
      HRESULT (WINAPI *get_alt)(IHTMLInputElement *This,BSTR *p);
      HRESULT (WINAPI *put_src)(IHTMLInputElement *This,BSTR v);
      HRESULT (WINAPI *get_src)(IHTMLInputElement *This,BSTR *p);
      HRESULT (WINAPI *put_lowsrc)(IHTMLInputElement *This,BSTR v);
      HRESULT (WINAPI *get_lowsrc)(IHTMLInputElement *This,BSTR *p);
      HRESULT (WINAPI *put_vrml)(IHTMLInputElement *This,BSTR v);
      HRESULT (WINAPI *get_vrml)(IHTMLInputElement *This,BSTR *p);
      HRESULT (WINAPI *put_dynsrc)(IHTMLInputElement *This,BSTR v);
      HRESULT (WINAPI *get_dynsrc)(IHTMLInputElement *This,BSTR *p);
      HRESULT (WINAPI *get_readyState)(IHTMLInputElement *This,BSTR *p);
      HRESULT (WINAPI *get_complete)(IHTMLInputElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_loop)(IHTMLInputElement *This,VARIANT v);
      HRESULT (WINAPI *get_loop)(IHTMLInputElement *This,VARIANT *p);
      HRESULT (WINAPI *put_align)(IHTMLInputElement *This,BSTR v);
      HRESULT (WINAPI *get_align)(IHTMLInputElement *This,BSTR *p);
      HRESULT (WINAPI *put_onload)(IHTMLInputElement *This,VARIANT v);
      HRESULT (WINAPI *get_onload)(IHTMLInputElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onerror)(IHTMLInputElement *This,VARIANT v);
      HRESULT (WINAPI *get_onerror)(IHTMLInputElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onabort)(IHTMLInputElement *This,VARIANT v);
      HRESULT (WINAPI *get_onabort)(IHTMLInputElement *This,VARIANT *p);
      HRESULT (WINAPI *put_width)(IHTMLInputElement *This,long v);
      HRESULT (WINAPI *get_width)(IHTMLInputElement *This,long *p);
      HRESULT (WINAPI *put_height)(IHTMLInputElement *This,long v);
      HRESULT (WINAPI *get_height)(IHTMLInputElement *This,long *p);
      HRESULT (WINAPI *put_start)(IHTMLInputElement *This,BSTR v);
      HRESULT (WINAPI *get_start)(IHTMLInputElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLInputElementVtbl;
  interface IHTMLInputElement {
    CONST_VTBL struct IHTMLInputElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLInputElement_put_type_Proxy(IHTMLInputElement *This,BSTR v);
  void __RPC_STUB IHTMLInputElement_put_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_type_Proxy(IHTMLInputElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_value_Proxy(IHTMLInputElement *This,BSTR v);
  void __RPC_STUB IHTMLInputElement_put_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_value_Proxy(IHTMLInputElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputElement_get_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_name_Proxy(IHTMLInputElement *This,BSTR v);
  void __RPC_STUB IHTMLInputElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_name_Proxy(IHTMLInputElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_status_Proxy(IHTMLInputElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLInputElement_put_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_status_Proxy(IHTMLInputElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLInputElement_get_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_disabled_Proxy(IHTMLInputElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLInputElement_put_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_disabled_Proxy(IHTMLInputElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLInputElement_get_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_form_Proxy(IHTMLInputElement *This,IHTMLFormElement **p);
  void __RPC_STUB IHTMLInputElement_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_size_Proxy(IHTMLInputElement *This,long v);
  void __RPC_STUB IHTMLInputElement_put_size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_size_Proxy(IHTMLInputElement *This,long *p);
  void __RPC_STUB IHTMLInputElement_get_size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_maxLength_Proxy(IHTMLInputElement *This,long v);
  void __RPC_STUB IHTMLInputElement_put_maxLength_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_maxLength_Proxy(IHTMLInputElement *This,long *p);
  void __RPC_STUB IHTMLInputElement_get_maxLength_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_select_Proxy(IHTMLInputElement *This);
  void __RPC_STUB IHTMLInputElement_select_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_onchange_Proxy(IHTMLInputElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputElement_put_onchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_onchange_Proxy(IHTMLInputElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputElement_get_onchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_onselect_Proxy(IHTMLInputElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputElement_put_onselect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_onselect_Proxy(IHTMLInputElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputElement_get_onselect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_defaultValue_Proxy(IHTMLInputElement *This,BSTR v);
  void __RPC_STUB IHTMLInputElement_put_defaultValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_defaultValue_Proxy(IHTMLInputElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputElement_get_defaultValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_readOnly_Proxy(IHTMLInputElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLInputElement_put_readOnly_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_readOnly_Proxy(IHTMLInputElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLInputElement_get_readOnly_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_createTextRange_Proxy(IHTMLInputElement *This,IHTMLTxtRange **range);
  void __RPC_STUB IHTMLInputElement_createTextRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_indeterminate_Proxy(IHTMLInputElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLInputElement_put_indeterminate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_indeterminate_Proxy(IHTMLInputElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLInputElement_get_indeterminate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_defaultChecked_Proxy(IHTMLInputElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLInputElement_put_defaultChecked_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_defaultChecked_Proxy(IHTMLInputElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLInputElement_get_defaultChecked_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_checked_Proxy(IHTMLInputElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLInputElement_put_checked_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_checked_Proxy(IHTMLInputElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLInputElement_get_checked_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_border_Proxy(IHTMLInputElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputElement_put_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_border_Proxy(IHTMLInputElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputElement_get_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_vspace_Proxy(IHTMLInputElement *This,long v);
  void __RPC_STUB IHTMLInputElement_put_vspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_vspace_Proxy(IHTMLInputElement *This,long *p);
  void __RPC_STUB IHTMLInputElement_get_vspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_hspace_Proxy(IHTMLInputElement *This,long v);
  void __RPC_STUB IHTMLInputElement_put_hspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_hspace_Proxy(IHTMLInputElement *This,long *p);
  void __RPC_STUB IHTMLInputElement_get_hspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_alt_Proxy(IHTMLInputElement *This,BSTR v);
  void __RPC_STUB IHTMLInputElement_put_alt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_alt_Proxy(IHTMLInputElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputElement_get_alt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_src_Proxy(IHTMLInputElement *This,BSTR v);
  void __RPC_STUB IHTMLInputElement_put_src_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_src_Proxy(IHTMLInputElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputElement_get_src_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_lowsrc_Proxy(IHTMLInputElement *This,BSTR v);
  void __RPC_STUB IHTMLInputElement_put_lowsrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_lowsrc_Proxy(IHTMLInputElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputElement_get_lowsrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_vrml_Proxy(IHTMLInputElement *This,BSTR v);
  void __RPC_STUB IHTMLInputElement_put_vrml_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_vrml_Proxy(IHTMLInputElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputElement_get_vrml_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_dynsrc_Proxy(IHTMLInputElement *This,BSTR v);
  void __RPC_STUB IHTMLInputElement_put_dynsrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_dynsrc_Proxy(IHTMLInputElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputElement_get_dynsrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_readyState_Proxy(IHTMLInputElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputElement_get_readyState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_complete_Proxy(IHTMLInputElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLInputElement_get_complete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_loop_Proxy(IHTMLInputElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputElement_put_loop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_loop_Proxy(IHTMLInputElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputElement_get_loop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_align_Proxy(IHTMLInputElement *This,BSTR v);
  void __RPC_STUB IHTMLInputElement_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_align_Proxy(IHTMLInputElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputElement_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_onload_Proxy(IHTMLInputElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputElement_put_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_onload_Proxy(IHTMLInputElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputElement_get_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_onerror_Proxy(IHTMLInputElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputElement_put_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_onerror_Proxy(IHTMLInputElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputElement_get_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_onabort_Proxy(IHTMLInputElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputElement_put_onabort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_onabort_Proxy(IHTMLInputElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputElement_get_onabort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_width_Proxy(IHTMLInputElement *This,long v);
  void __RPC_STUB IHTMLInputElement_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_width_Proxy(IHTMLInputElement *This,long *p);
  void __RPC_STUB IHTMLInputElement_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_height_Proxy(IHTMLInputElement *This,long v);
  void __RPC_STUB IHTMLInputElement_put_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_height_Proxy(IHTMLInputElement *This,long *p);
  void __RPC_STUB IHTMLInputElement_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_put_start_Proxy(IHTMLInputElement *This,BSTR v);
  void __RPC_STUB IHTMLInputElement_put_start_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement_get_start_Proxy(IHTMLInputElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputElement_get_start_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLInputElement2_INTERFACE_DEFINED__
#define __IHTMLInputElement2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLInputElement2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLInputElement2 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_accept(BSTR v) = 0;
    virtual HRESULT WINAPI get_accept(BSTR *p) = 0;
    virtual HRESULT WINAPI put_useMap(BSTR v) = 0;
    virtual HRESULT WINAPI get_useMap(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLInputElement2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLInputElement2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLInputElement2 *This);
      ULONG (WINAPI *Release)(IHTMLInputElement2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLInputElement2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLInputElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLInputElement2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLInputElement2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_accept)(IHTMLInputElement2 *This,BSTR v);
      HRESULT (WINAPI *get_accept)(IHTMLInputElement2 *This,BSTR *p);
      HRESULT (WINAPI *put_useMap)(IHTMLInputElement2 *This,BSTR v);
      HRESULT (WINAPI *get_useMap)(IHTMLInputElement2 *This,BSTR *p);
    END_INTERFACE
  } IHTMLInputElement2Vtbl;
  interface IHTMLInputElement2 {
    CONST_VTBL struct IHTMLInputElement2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLInputElement2_put_accept_Proxy(IHTMLInputElement2 *This,BSTR v);
  void __RPC_STUB IHTMLInputElement2_put_accept_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement2_get_accept_Proxy(IHTMLInputElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLInputElement2_get_accept_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement2_put_useMap_Proxy(IHTMLInputElement2 *This,BSTR v);
  void __RPC_STUB IHTMLInputElement2_put_useMap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputElement2_get_useMap_Proxy(IHTMLInputElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLInputElement2_get_useMap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLInputButtonElement_INTERFACE_DEFINED__
#define __IHTMLInputButtonElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLInputButtonElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLInputButtonElement : public IDispatch {
  public:
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI put_value(BSTR v) = 0;
    virtual HRESULT WINAPI get_value(BSTR *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_status(VARIANT v) = 0;
    virtual HRESULT WINAPI get_status(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_disabled(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_disabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;
    virtual HRESULT WINAPI createTextRange(IHTMLTxtRange **range) = 0;
  };
#else
  typedef struct IHTMLInputButtonElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLInputButtonElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLInputButtonElement *This);
      ULONG (WINAPI *Release)(IHTMLInputButtonElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLInputButtonElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLInputButtonElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLInputButtonElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLInputButtonElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_type)(IHTMLInputButtonElement *This,BSTR *p);
      HRESULT (WINAPI *put_value)(IHTMLInputButtonElement *This,BSTR v);
      HRESULT (WINAPI *get_value)(IHTMLInputButtonElement *This,BSTR *p);
      HRESULT (WINAPI *put_name)(IHTMLInputButtonElement *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLInputButtonElement *This,BSTR *p);
      HRESULT (WINAPI *put_status)(IHTMLInputButtonElement *This,VARIANT v);
      HRESULT (WINAPI *get_status)(IHTMLInputButtonElement *This,VARIANT *p);
      HRESULT (WINAPI *put_disabled)(IHTMLInputButtonElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_disabled)(IHTMLInputButtonElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_form)(IHTMLInputButtonElement *This,IHTMLFormElement **p);
      HRESULT (WINAPI *createTextRange)(IHTMLInputButtonElement *This,IHTMLTxtRange **range);
    END_INTERFACE
  } IHTMLInputButtonElementVtbl;
  interface IHTMLInputButtonElement {
    CONST_VTBL struct IHTMLInputButtonElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLInputButtonElement_get_type_Proxy(IHTMLInputButtonElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputButtonElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputButtonElement_put_value_Proxy(IHTMLInputButtonElement *This,BSTR v);
  void __RPC_STUB IHTMLInputButtonElement_put_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputButtonElement_get_value_Proxy(IHTMLInputButtonElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputButtonElement_get_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputButtonElement_put_name_Proxy(IHTMLInputButtonElement *This,BSTR v);
  void __RPC_STUB IHTMLInputButtonElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputButtonElement_get_name_Proxy(IHTMLInputButtonElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputButtonElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputButtonElement_put_status_Proxy(IHTMLInputButtonElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputButtonElement_put_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputButtonElement_get_status_Proxy(IHTMLInputButtonElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputButtonElement_get_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputButtonElement_put_disabled_Proxy(IHTMLInputButtonElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLInputButtonElement_put_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputButtonElement_get_disabled_Proxy(IHTMLInputButtonElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLInputButtonElement_get_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputButtonElement_get_form_Proxy(IHTMLInputButtonElement *This,IHTMLFormElement **p);
  void __RPC_STUB IHTMLInputButtonElement_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputButtonElement_createTextRange_Proxy(IHTMLInputButtonElement *This,IHTMLTxtRange **range);
  void __RPC_STUB IHTMLInputButtonElement_createTextRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLInputHiddenElement_INTERFACE_DEFINED__
#define __IHTMLInputHiddenElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLInputHiddenElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLInputHiddenElement : public IDispatch {
  public:
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI put_value(BSTR v) = 0;
    virtual HRESULT WINAPI get_value(BSTR *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_status(VARIANT v) = 0;
    virtual HRESULT WINAPI get_status(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_disabled(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_disabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;
    virtual HRESULT WINAPI createTextRange(IHTMLTxtRange **range) = 0;
  };
#else
  typedef struct IHTMLInputHiddenElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLInputHiddenElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLInputHiddenElement *This);
      ULONG (WINAPI *Release)(IHTMLInputHiddenElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLInputHiddenElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLInputHiddenElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLInputHiddenElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLInputHiddenElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_type)(IHTMLInputHiddenElement *This,BSTR *p);
      HRESULT (WINAPI *put_value)(IHTMLInputHiddenElement *This,BSTR v);
      HRESULT (WINAPI *get_value)(IHTMLInputHiddenElement *This,BSTR *p);
      HRESULT (WINAPI *put_name)(IHTMLInputHiddenElement *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLInputHiddenElement *This,BSTR *p);
      HRESULT (WINAPI *put_status)(IHTMLInputHiddenElement *This,VARIANT v);
      HRESULT (WINAPI *get_status)(IHTMLInputHiddenElement *This,VARIANT *p);
      HRESULT (WINAPI *put_disabled)(IHTMLInputHiddenElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_disabled)(IHTMLInputHiddenElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_form)(IHTMLInputHiddenElement *This,IHTMLFormElement **p);
      HRESULT (WINAPI *createTextRange)(IHTMLInputHiddenElement *This,IHTMLTxtRange **range);
    END_INTERFACE
  } IHTMLInputHiddenElementVtbl;
  interface IHTMLInputHiddenElement {
    CONST_VTBL struct IHTMLInputHiddenElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLInputHiddenElement_get_type_Proxy(IHTMLInputHiddenElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputHiddenElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputHiddenElement_put_value_Proxy(IHTMLInputHiddenElement *This,BSTR v);
  void __RPC_STUB IHTMLInputHiddenElement_put_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputHiddenElement_get_value_Proxy(IHTMLInputHiddenElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputHiddenElement_get_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputHiddenElement_put_name_Proxy(IHTMLInputHiddenElement *This,BSTR v);
  void __RPC_STUB IHTMLInputHiddenElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputHiddenElement_get_name_Proxy(IHTMLInputHiddenElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputHiddenElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputHiddenElement_put_status_Proxy(IHTMLInputHiddenElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputHiddenElement_put_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputHiddenElement_get_status_Proxy(IHTMLInputHiddenElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputHiddenElement_get_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputHiddenElement_put_disabled_Proxy(IHTMLInputHiddenElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLInputHiddenElement_put_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputHiddenElement_get_disabled_Proxy(IHTMLInputHiddenElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLInputHiddenElement_get_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputHiddenElement_get_form_Proxy(IHTMLInputHiddenElement *This,IHTMLFormElement **p);
  void __RPC_STUB IHTMLInputHiddenElement_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputHiddenElement_createTextRange_Proxy(IHTMLInputHiddenElement *This,IHTMLTxtRange **range);
  void __RPC_STUB IHTMLInputHiddenElement_createTextRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLInputTextElement_INTERFACE_DEFINED__
#define __IHTMLInputTextElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLInputTextElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLInputTextElement : public IDispatch {
  public:
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI put_value(BSTR v) = 0;
    virtual HRESULT WINAPI get_value(BSTR *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_status(VARIANT v) = 0;
    virtual HRESULT WINAPI get_status(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_disabled(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_disabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;
    virtual HRESULT WINAPI put_defaultValue(BSTR v) = 0;
    virtual HRESULT WINAPI get_defaultValue(BSTR *p) = 0;
    virtual HRESULT WINAPI put_size(long v) = 0;
    virtual HRESULT WINAPI get_size(long *p) = 0;
    virtual HRESULT WINAPI put_maxLength(long v) = 0;
    virtual HRESULT WINAPI get_maxLength(long *p) = 0;
    virtual HRESULT WINAPI select(void) = 0;
    virtual HRESULT WINAPI put_onchange(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onchange(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onselect(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onselect(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_readOnly(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_readOnly(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI createTextRange(IHTMLTxtRange **range) = 0;
  };
#else
  typedef struct IHTMLInputTextElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLInputTextElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLInputTextElement *This);
      ULONG (WINAPI *Release)(IHTMLInputTextElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLInputTextElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLInputTextElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLInputTextElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLInputTextElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_type)(IHTMLInputTextElement *This,BSTR *p);
      HRESULT (WINAPI *put_value)(IHTMLInputTextElement *This,BSTR v);
      HRESULT (WINAPI *get_value)(IHTMLInputTextElement *This,BSTR *p);
      HRESULT (WINAPI *put_name)(IHTMLInputTextElement *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLInputTextElement *This,BSTR *p);
      HRESULT (WINAPI *put_status)(IHTMLInputTextElement *This,VARIANT v);
      HRESULT (WINAPI *get_status)(IHTMLInputTextElement *This,VARIANT *p);
      HRESULT (WINAPI *put_disabled)(IHTMLInputTextElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_disabled)(IHTMLInputTextElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_form)(IHTMLInputTextElement *This,IHTMLFormElement **p);
      HRESULT (WINAPI *put_defaultValue)(IHTMLInputTextElement *This,BSTR v);
      HRESULT (WINAPI *get_defaultValue)(IHTMLInputTextElement *This,BSTR *p);
      HRESULT (WINAPI *put_size)(IHTMLInputTextElement *This,long v);
      HRESULT (WINAPI *get_size)(IHTMLInputTextElement *This,long *p);
      HRESULT (WINAPI *put_maxLength)(IHTMLInputTextElement *This,long v);
      HRESULT (WINAPI *get_maxLength)(IHTMLInputTextElement *This,long *p);
      HRESULT (WINAPI *select)(IHTMLInputTextElement *This);
      HRESULT (WINAPI *put_onchange)(IHTMLInputTextElement *This,VARIANT v);
      HRESULT (WINAPI *get_onchange)(IHTMLInputTextElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onselect)(IHTMLInputTextElement *This,VARIANT v);
      HRESULT (WINAPI *get_onselect)(IHTMLInputTextElement *This,VARIANT *p);
      HRESULT (WINAPI *put_readOnly)(IHTMLInputTextElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_readOnly)(IHTMLInputTextElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *createTextRange)(IHTMLInputTextElement *This,IHTMLTxtRange **range);
    END_INTERFACE
  } IHTMLInputTextElementVtbl;
  interface IHTMLInputTextElement {
    CONST_VTBL struct IHTMLInputTextElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLInputTextElement_get_type_Proxy(IHTMLInputTextElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputTextElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_put_value_Proxy(IHTMLInputTextElement *This,BSTR v);
  void __RPC_STUB IHTMLInputTextElement_put_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_get_value_Proxy(IHTMLInputTextElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputTextElement_get_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_put_name_Proxy(IHTMLInputTextElement *This,BSTR v);
  void __RPC_STUB IHTMLInputTextElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_get_name_Proxy(IHTMLInputTextElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputTextElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_put_status_Proxy(IHTMLInputTextElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputTextElement_put_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_get_status_Proxy(IHTMLInputTextElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputTextElement_get_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_put_disabled_Proxy(IHTMLInputTextElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLInputTextElement_put_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_get_disabled_Proxy(IHTMLInputTextElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLInputTextElement_get_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_get_form_Proxy(IHTMLInputTextElement *This,IHTMLFormElement **p);
  void __RPC_STUB IHTMLInputTextElement_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_put_defaultValue_Proxy(IHTMLInputTextElement *This,BSTR v);
  void __RPC_STUB IHTMLInputTextElement_put_defaultValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_get_defaultValue_Proxy(IHTMLInputTextElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputTextElement_get_defaultValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_put_size_Proxy(IHTMLInputTextElement *This,long v);
  void __RPC_STUB IHTMLInputTextElement_put_size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_get_size_Proxy(IHTMLInputTextElement *This,long *p);
  void __RPC_STUB IHTMLInputTextElement_get_size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_put_maxLength_Proxy(IHTMLInputTextElement *This,long v);
  void __RPC_STUB IHTMLInputTextElement_put_maxLength_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_get_maxLength_Proxy(IHTMLInputTextElement *This,long *p);
  void __RPC_STUB IHTMLInputTextElement_get_maxLength_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_select_Proxy(IHTMLInputTextElement *This);
  void __RPC_STUB IHTMLInputTextElement_select_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_put_onchange_Proxy(IHTMLInputTextElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputTextElement_put_onchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_get_onchange_Proxy(IHTMLInputTextElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputTextElement_get_onchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_put_onselect_Proxy(IHTMLInputTextElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputTextElement_put_onselect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_get_onselect_Proxy(IHTMLInputTextElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputTextElement_get_onselect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_put_readOnly_Proxy(IHTMLInputTextElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLInputTextElement_put_readOnly_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_get_readOnly_Proxy(IHTMLInputTextElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLInputTextElement_get_readOnly_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputTextElement_createTextRange_Proxy(IHTMLInputTextElement *This,IHTMLTxtRange **range);
  void __RPC_STUB IHTMLInputTextElement_createTextRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLInputFileElement_INTERFACE_DEFINED__
#define __IHTMLInputFileElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLInputFileElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLInputFileElement : public IDispatch {
  public:
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_status(VARIANT v) = 0;
    virtual HRESULT WINAPI get_status(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_disabled(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_disabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;
    virtual HRESULT WINAPI put_size(long v) = 0;
    virtual HRESULT WINAPI get_size(long *p) = 0;
    virtual HRESULT WINAPI put_maxLength(long v) = 0;
    virtual HRESULT WINAPI get_maxLength(long *p) = 0;
    virtual HRESULT WINAPI select(void) = 0;
    virtual HRESULT WINAPI put_onchange(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onchange(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onselect(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onselect(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_value(BSTR v) = 0;
    virtual HRESULT WINAPI get_value(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLInputFileElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLInputFileElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLInputFileElement *This);
      ULONG (WINAPI *Release)(IHTMLInputFileElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLInputFileElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLInputFileElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLInputFileElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLInputFileElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_type)(IHTMLInputFileElement *This,BSTR *p);
      HRESULT (WINAPI *put_name)(IHTMLInputFileElement *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLInputFileElement *This,BSTR *p);
      HRESULT (WINAPI *put_status)(IHTMLInputFileElement *This,VARIANT v);
      HRESULT (WINAPI *get_status)(IHTMLInputFileElement *This,VARIANT *p);
      HRESULT (WINAPI *put_disabled)(IHTMLInputFileElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_disabled)(IHTMLInputFileElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_form)(IHTMLInputFileElement *This,IHTMLFormElement **p);
      HRESULT (WINAPI *put_size)(IHTMLInputFileElement *This,long v);
      HRESULT (WINAPI *get_size)(IHTMLInputFileElement *This,long *p);
      HRESULT (WINAPI *put_maxLength)(IHTMLInputFileElement *This,long v);
      HRESULT (WINAPI *get_maxLength)(IHTMLInputFileElement *This,long *p);
      HRESULT (WINAPI *select)(IHTMLInputFileElement *This);
      HRESULT (WINAPI *put_onchange)(IHTMLInputFileElement *This,VARIANT v);
      HRESULT (WINAPI *get_onchange)(IHTMLInputFileElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onselect)(IHTMLInputFileElement *This,VARIANT v);
      HRESULT (WINAPI *get_onselect)(IHTMLInputFileElement *This,VARIANT *p);
      HRESULT (WINAPI *put_value)(IHTMLInputFileElement *This,BSTR v);
      HRESULT (WINAPI *get_value)(IHTMLInputFileElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLInputFileElementVtbl;
  interface IHTMLInputFileElement {
    CONST_VTBL struct IHTMLInputFileElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLInputFileElement_get_type_Proxy(IHTMLInputFileElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputFileElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_put_name_Proxy(IHTMLInputFileElement *This,BSTR v);
  void __RPC_STUB IHTMLInputFileElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_get_name_Proxy(IHTMLInputFileElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputFileElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_put_status_Proxy(IHTMLInputFileElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputFileElement_put_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_get_status_Proxy(IHTMLInputFileElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputFileElement_get_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_put_disabled_Proxy(IHTMLInputFileElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLInputFileElement_put_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_get_disabled_Proxy(IHTMLInputFileElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLInputFileElement_get_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_get_form_Proxy(IHTMLInputFileElement *This,IHTMLFormElement **p);
  void __RPC_STUB IHTMLInputFileElement_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_put_size_Proxy(IHTMLInputFileElement *This,long v);
  void __RPC_STUB IHTMLInputFileElement_put_size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_get_size_Proxy(IHTMLInputFileElement *This,long *p);
  void __RPC_STUB IHTMLInputFileElement_get_size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_put_maxLength_Proxy(IHTMLInputFileElement *This,long v);
  void __RPC_STUB IHTMLInputFileElement_put_maxLength_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_get_maxLength_Proxy(IHTMLInputFileElement *This,long *p);
  void __RPC_STUB IHTMLInputFileElement_get_maxLength_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_select_Proxy(IHTMLInputFileElement *This);
  void __RPC_STUB IHTMLInputFileElement_select_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_put_onchange_Proxy(IHTMLInputFileElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputFileElement_put_onchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_get_onchange_Proxy(IHTMLInputFileElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputFileElement_get_onchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_put_onselect_Proxy(IHTMLInputFileElement *This,VARIANT v);
  void __RPC_STUB IHTMLInputFileElement_put_onselect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_get_onselect_Proxy(IHTMLInputFileElement *This,VARIANT *p);
  void __RPC_STUB IHTMLInputFileElement_get_onselect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_put_value_Proxy(IHTMLInputFileElement *This,BSTR v);
  void __RPC_STUB IHTMLInputFileElement_put_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputFileElement_get_value_Proxy(IHTMLInputFileElement *This,BSTR *p);
  void __RPC_STUB IHTMLInputFileElement_get_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLOptionButtonElement_INTERFACE_DEFINED__
#define __IHTMLOptionButtonElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLOptionButtonElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLOptionButtonElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_value(BSTR v) = 0;
    virtual HRESULT WINAPI get_value(BSTR *p) = 0;
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_checked(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_checked(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_defaultChecked(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_defaultChecked(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_onchange(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onchange(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_disabled(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_disabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_status(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_status(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_indeterminate(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_indeterminate(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;
  };
#else
  typedef struct IHTMLOptionButtonElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLOptionButtonElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLOptionButtonElement *This);
      ULONG (WINAPI *Release)(IHTMLOptionButtonElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLOptionButtonElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLOptionButtonElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLOptionButtonElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLOptionButtonElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_value)(IHTMLOptionButtonElement *This,BSTR v);
      HRESULT (WINAPI *get_value)(IHTMLOptionButtonElement *This,BSTR *p);
      HRESULT (WINAPI *get_type)(IHTMLOptionButtonElement *This,BSTR *p);
      HRESULT (WINAPI *put_name)(IHTMLOptionButtonElement *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLOptionButtonElement *This,BSTR *p);
      HRESULT (WINAPI *put_checked)(IHTMLOptionButtonElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_checked)(IHTMLOptionButtonElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_defaultChecked)(IHTMLOptionButtonElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_defaultChecked)(IHTMLOptionButtonElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_onchange)(IHTMLOptionButtonElement *This,VARIANT v);
      HRESULT (WINAPI *get_onchange)(IHTMLOptionButtonElement *This,VARIANT *p);
      HRESULT (WINAPI *put_disabled)(IHTMLOptionButtonElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_disabled)(IHTMLOptionButtonElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_status)(IHTMLOptionButtonElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_status)(IHTMLOptionButtonElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_indeterminate)(IHTMLOptionButtonElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_indeterminate)(IHTMLOptionButtonElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_form)(IHTMLOptionButtonElement *This,IHTMLFormElement **p);
    END_INTERFACE
  } IHTMLOptionButtonElementVtbl;
  interface IHTMLOptionButtonElement {
    CONST_VTBL struct IHTMLOptionButtonElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLOptionButtonElement_put_value_Proxy(IHTMLOptionButtonElement *This,BSTR v);
  void __RPC_STUB IHTMLOptionButtonElement_put_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_get_value_Proxy(IHTMLOptionButtonElement *This,BSTR *p);
  void __RPC_STUB IHTMLOptionButtonElement_get_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_get_type_Proxy(IHTMLOptionButtonElement *This,BSTR *p);
  void __RPC_STUB IHTMLOptionButtonElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_put_name_Proxy(IHTMLOptionButtonElement *This,BSTR v);
  void __RPC_STUB IHTMLOptionButtonElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_get_name_Proxy(IHTMLOptionButtonElement *This,BSTR *p);
  void __RPC_STUB IHTMLOptionButtonElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_put_checked_Proxy(IHTMLOptionButtonElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLOptionButtonElement_put_checked_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_get_checked_Proxy(IHTMLOptionButtonElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLOptionButtonElement_get_checked_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_put_defaultChecked_Proxy(IHTMLOptionButtonElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLOptionButtonElement_put_defaultChecked_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_get_defaultChecked_Proxy(IHTMLOptionButtonElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLOptionButtonElement_get_defaultChecked_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_put_onchange_Proxy(IHTMLOptionButtonElement *This,VARIANT v);
  void __RPC_STUB IHTMLOptionButtonElement_put_onchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_get_onchange_Proxy(IHTMLOptionButtonElement *This,VARIANT *p);
  void __RPC_STUB IHTMLOptionButtonElement_get_onchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_put_disabled_Proxy(IHTMLOptionButtonElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLOptionButtonElement_put_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_get_disabled_Proxy(IHTMLOptionButtonElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLOptionButtonElement_get_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_put_status_Proxy(IHTMLOptionButtonElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLOptionButtonElement_put_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_get_status_Proxy(IHTMLOptionButtonElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLOptionButtonElement_get_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_put_indeterminate_Proxy(IHTMLOptionButtonElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLOptionButtonElement_put_indeterminate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_get_indeterminate_Proxy(IHTMLOptionButtonElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLOptionButtonElement_get_indeterminate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOptionButtonElement_get_form_Proxy(IHTMLOptionButtonElement *This,IHTMLFormElement **p);
  void __RPC_STUB IHTMLOptionButtonElement_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLInputImage_INTERFACE_DEFINED__
#define __IHTMLInputImage_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLInputImage;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLInputImage : public IDispatch {
  public:
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI put_disabled(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_disabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_border(VARIANT v) = 0;
    virtual HRESULT WINAPI get_border(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_vspace(long v) = 0;
    virtual HRESULT WINAPI get_vspace(long *p) = 0;
    virtual HRESULT WINAPI put_hspace(long v) = 0;
    virtual HRESULT WINAPI get_hspace(long *p) = 0;
    virtual HRESULT WINAPI put_alt(BSTR v) = 0;
    virtual HRESULT WINAPI get_alt(BSTR *p) = 0;
    virtual HRESULT WINAPI put_src(BSTR v) = 0;
    virtual HRESULT WINAPI get_src(BSTR *p) = 0;
    virtual HRESULT WINAPI put_lowsrc(BSTR v) = 0;
    virtual HRESULT WINAPI get_lowsrc(BSTR *p) = 0;
    virtual HRESULT WINAPI put_vrml(BSTR v) = 0;
    virtual HRESULT WINAPI get_vrml(BSTR *p) = 0;
    virtual HRESULT WINAPI put_dynsrc(BSTR v) = 0;
    virtual HRESULT WINAPI get_dynsrc(BSTR *p) = 0;
    virtual HRESULT WINAPI get_readyState(BSTR *p) = 0;
    virtual HRESULT WINAPI get_complete(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_loop(VARIANT v) = 0;
    virtual HRESULT WINAPI get_loop(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_align(BSTR v) = 0;
    virtual HRESULT WINAPI get_align(BSTR *p) = 0;
    virtual HRESULT WINAPI put_onload(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onload(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onerror(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onerror(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onabort(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onabort(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_width(long v) = 0;
    virtual HRESULT WINAPI get_width(long *p) = 0;
    virtual HRESULT WINAPI put_height(long v) = 0;
    virtual HRESULT WINAPI get_height(long *p) = 0;
    virtual HRESULT WINAPI put_start(BSTR v) = 0;
    virtual HRESULT WINAPI get_start(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLInputImageVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLInputImage *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLInputImage *This);
      ULONG (WINAPI *Release)(IHTMLInputImage *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLInputImage *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLInputImage *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLInputImage *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLInputImage *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_type)(IHTMLInputImage *This,BSTR *p);
      HRESULT (WINAPI *put_disabled)(IHTMLInputImage *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_disabled)(IHTMLInputImage *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_border)(IHTMLInputImage *This,VARIANT v);
      HRESULT (WINAPI *get_border)(IHTMLInputImage *This,VARIANT *p);
      HRESULT (WINAPI *put_vspace)(IHTMLInputImage *This,long v);
      HRESULT (WINAPI *get_vspace)(IHTMLInputImage *This,long *p);
      HRESULT (WINAPI *put_hspace)(IHTMLInputImage *This,long v);
      HRESULT (WINAPI *get_hspace)(IHTMLInputImage *This,long *p);
      HRESULT (WINAPI *put_alt)(IHTMLInputImage *This,BSTR v);
      HRESULT (WINAPI *get_alt)(IHTMLInputImage *This,BSTR *p);
      HRESULT (WINAPI *put_src)(IHTMLInputImage *This,BSTR v);
      HRESULT (WINAPI *get_src)(IHTMLInputImage *This,BSTR *p);
      HRESULT (WINAPI *put_lowsrc)(IHTMLInputImage *This,BSTR v);
      HRESULT (WINAPI *get_lowsrc)(IHTMLInputImage *This,BSTR *p);
      HRESULT (WINAPI *put_vrml)(IHTMLInputImage *This,BSTR v);
      HRESULT (WINAPI *get_vrml)(IHTMLInputImage *This,BSTR *p);
      HRESULT (WINAPI *put_dynsrc)(IHTMLInputImage *This,BSTR v);
      HRESULT (WINAPI *get_dynsrc)(IHTMLInputImage *This,BSTR *p);
      HRESULT (WINAPI *get_readyState)(IHTMLInputImage *This,BSTR *p);
      HRESULT (WINAPI *get_complete)(IHTMLInputImage *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_loop)(IHTMLInputImage *This,VARIANT v);
      HRESULT (WINAPI *get_loop)(IHTMLInputImage *This,VARIANT *p);
      HRESULT (WINAPI *put_align)(IHTMLInputImage *This,BSTR v);
      HRESULT (WINAPI *get_align)(IHTMLInputImage *This,BSTR *p);
      HRESULT (WINAPI *put_onload)(IHTMLInputImage *This,VARIANT v);
      HRESULT (WINAPI *get_onload)(IHTMLInputImage *This,VARIANT *p);
      HRESULT (WINAPI *put_onerror)(IHTMLInputImage *This,VARIANT v);
      HRESULT (WINAPI *get_onerror)(IHTMLInputImage *This,VARIANT *p);
      HRESULT (WINAPI *put_onabort)(IHTMLInputImage *This,VARIANT v);
      HRESULT (WINAPI *get_onabort)(IHTMLInputImage *This,VARIANT *p);
      HRESULT (WINAPI *put_name)(IHTMLInputImage *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLInputImage *This,BSTR *p);
      HRESULT (WINAPI *put_width)(IHTMLInputImage *This,long v);
      HRESULT (WINAPI *get_width)(IHTMLInputImage *This,long *p);
      HRESULT (WINAPI *put_height)(IHTMLInputImage *This,long v);
      HRESULT (WINAPI *get_height)(IHTMLInputImage *This,long *p);
      HRESULT (WINAPI *put_start)(IHTMLInputImage *This,BSTR v);
      HRESULT (WINAPI *get_start)(IHTMLInputImage *This,BSTR *p);
    END_INTERFACE
  } IHTMLInputImageVtbl;
  interface IHTMLInputImage {
    CONST_VTBL struct IHTMLInputImageVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLInputImage_get_type_Proxy(IHTMLInputImage *This,BSTR *p);
  void __RPC_STUB IHTMLInputImage_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_disabled_Proxy(IHTMLInputImage *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLInputImage_put_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_disabled_Proxy(IHTMLInputImage *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLInputImage_get_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_border_Proxy(IHTMLInputImage *This,VARIANT v);
  void __RPC_STUB IHTMLInputImage_put_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_border_Proxy(IHTMLInputImage *This,VARIANT *p);
  void __RPC_STUB IHTMLInputImage_get_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_vspace_Proxy(IHTMLInputImage *This,long v);
  void __RPC_STUB IHTMLInputImage_put_vspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_vspace_Proxy(IHTMLInputImage *This,long *p);
  void __RPC_STUB IHTMLInputImage_get_vspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_hspace_Proxy(IHTMLInputImage *This,long v);
  void __RPC_STUB IHTMLInputImage_put_hspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_hspace_Proxy(IHTMLInputImage *This,long *p);
  void __RPC_STUB IHTMLInputImage_get_hspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_alt_Proxy(IHTMLInputImage *This,BSTR v);
  void __RPC_STUB IHTMLInputImage_put_alt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_alt_Proxy(IHTMLInputImage *This,BSTR *p);
  void __RPC_STUB IHTMLInputImage_get_alt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_src_Proxy(IHTMLInputImage *This,BSTR v);
  void __RPC_STUB IHTMLInputImage_put_src_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_src_Proxy(IHTMLInputImage *This,BSTR *p);
  void __RPC_STUB IHTMLInputImage_get_src_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_lowsrc_Proxy(IHTMLInputImage *This,BSTR v);
  void __RPC_STUB IHTMLInputImage_put_lowsrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_lowsrc_Proxy(IHTMLInputImage *This,BSTR *p);
  void __RPC_STUB IHTMLInputImage_get_lowsrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_vrml_Proxy(IHTMLInputImage *This,BSTR v);
  void __RPC_STUB IHTMLInputImage_put_vrml_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_vrml_Proxy(IHTMLInputImage *This,BSTR *p);
  void __RPC_STUB IHTMLInputImage_get_vrml_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_dynsrc_Proxy(IHTMLInputImage *This,BSTR v);
  void __RPC_STUB IHTMLInputImage_put_dynsrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_dynsrc_Proxy(IHTMLInputImage *This,BSTR *p);
  void __RPC_STUB IHTMLInputImage_get_dynsrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_readyState_Proxy(IHTMLInputImage *This,BSTR *p);
  void __RPC_STUB IHTMLInputImage_get_readyState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_complete_Proxy(IHTMLInputImage *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLInputImage_get_complete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_loop_Proxy(IHTMLInputImage *This,VARIANT v);
  void __RPC_STUB IHTMLInputImage_put_loop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_loop_Proxy(IHTMLInputImage *This,VARIANT *p);
  void __RPC_STUB IHTMLInputImage_get_loop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_align_Proxy(IHTMLInputImage *This,BSTR v);
  void __RPC_STUB IHTMLInputImage_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_align_Proxy(IHTMLInputImage *This,BSTR *p);
  void __RPC_STUB IHTMLInputImage_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_onload_Proxy(IHTMLInputImage *This,VARIANT v);
  void __RPC_STUB IHTMLInputImage_put_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_onload_Proxy(IHTMLInputImage *This,VARIANT *p);
  void __RPC_STUB IHTMLInputImage_get_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_onerror_Proxy(IHTMLInputImage *This,VARIANT v);
  void __RPC_STUB IHTMLInputImage_put_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_onerror_Proxy(IHTMLInputImage *This,VARIANT *p);
  void __RPC_STUB IHTMLInputImage_get_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_onabort_Proxy(IHTMLInputImage *This,VARIANT v);
  void __RPC_STUB IHTMLInputImage_put_onabort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_onabort_Proxy(IHTMLInputImage *This,VARIANT *p);
  void __RPC_STUB IHTMLInputImage_get_onabort_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_name_Proxy(IHTMLInputImage *This,BSTR v);
  void __RPC_STUB IHTMLInputImage_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_name_Proxy(IHTMLInputImage *This,BSTR *p);
  void __RPC_STUB IHTMLInputImage_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_width_Proxy(IHTMLInputImage *This,long v);
  void __RPC_STUB IHTMLInputImage_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_width_Proxy(IHTMLInputImage *This,long *p);
  void __RPC_STUB IHTMLInputImage_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_height_Proxy(IHTMLInputImage *This,long v);
  void __RPC_STUB IHTMLInputImage_put_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_height_Proxy(IHTMLInputImage *This,long *p);
  void __RPC_STUB IHTMLInputImage_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_put_start_Proxy(IHTMLInputImage *This,BSTR v);
  void __RPC_STUB IHTMLInputImage_put_start_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLInputImage_get_start_Proxy(IHTMLInputImage *This,BSTR *p);
  void __RPC_STUB IHTMLInputImage_get_start_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLInputElement_DISPINTERFACE_DEFINED__
#define __DispHTMLInputElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLInputElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLInputElement : public IDispatch {
  };
#else
  typedef struct DispHTMLInputElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLInputElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLInputElement *This);
      ULONG (WINAPI *Release)(DispHTMLInputElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLInputElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLInputElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLInputElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLInputElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLInputElement;
#ifdef __cplusplus
  class HTMLInputElement;
#endif

#ifndef __IHTMLTextAreaElement_INTERFACE_DEFINED__
#define __IHTMLTextAreaElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLTextAreaElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLTextAreaElement : public IDispatch {
  public:
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI put_value(BSTR v) = 0;
    virtual HRESULT WINAPI get_value(BSTR *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_status(VARIANT v) = 0;
    virtual HRESULT WINAPI get_status(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_disabled(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_disabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;
    virtual HRESULT WINAPI put_defaultValue(BSTR v) = 0;
    virtual HRESULT WINAPI get_defaultValue(BSTR *p) = 0;
    virtual HRESULT WINAPI select(void) = 0;
    virtual HRESULT WINAPI put_onchange(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onchange(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onselect(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onselect(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_readOnly(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_readOnly(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_rows(long v) = 0;
    virtual HRESULT WINAPI get_rows(long *p) = 0;
    virtual HRESULT WINAPI put_cols(long v) = 0;
    virtual HRESULT WINAPI get_cols(long *p) = 0;
    virtual HRESULT WINAPI put_wrap(BSTR v) = 0;
    virtual HRESULT WINAPI get_wrap(BSTR *p) = 0;
    virtual HRESULT WINAPI createTextRange(IHTMLTxtRange **range) = 0;
  };
#else
  typedef struct IHTMLTextAreaElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLTextAreaElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLTextAreaElement *This);
      ULONG (WINAPI *Release)(IHTMLTextAreaElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTextAreaElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLTextAreaElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLTextAreaElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLTextAreaElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_type)(IHTMLTextAreaElement *This,BSTR *p);
      HRESULT (WINAPI *put_value)(IHTMLTextAreaElement *This,BSTR v);
      HRESULT (WINAPI *get_value)(IHTMLTextAreaElement *This,BSTR *p);
      HRESULT (WINAPI *put_name)(IHTMLTextAreaElement *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLTextAreaElement *This,BSTR *p);
      HRESULT (WINAPI *put_status)(IHTMLTextAreaElement *This,VARIANT v);
      HRESULT (WINAPI *get_status)(IHTMLTextAreaElement *This,VARIANT *p);
      HRESULT (WINAPI *put_disabled)(IHTMLTextAreaElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_disabled)(IHTMLTextAreaElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_form)(IHTMLTextAreaElement *This,IHTMLFormElement **p);
      HRESULT (WINAPI *put_defaultValue)(IHTMLTextAreaElement *This,BSTR v);
      HRESULT (WINAPI *get_defaultValue)(IHTMLTextAreaElement *This,BSTR *p);
      HRESULT (WINAPI *select)(IHTMLTextAreaElement *This);
      HRESULT (WINAPI *put_onchange)(IHTMLTextAreaElement *This,VARIANT v);
      HRESULT (WINAPI *get_onchange)(IHTMLTextAreaElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onselect)(IHTMLTextAreaElement *This,VARIANT v);
      HRESULT (WINAPI *get_onselect)(IHTMLTextAreaElement *This,VARIANT *p);
      HRESULT (WINAPI *put_readOnly)(IHTMLTextAreaElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_readOnly)(IHTMLTextAreaElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_rows)(IHTMLTextAreaElement *This,long v);
      HRESULT (WINAPI *get_rows)(IHTMLTextAreaElement *This,long *p);
      HRESULT (WINAPI *put_cols)(IHTMLTextAreaElement *This,long v);
      HRESULT (WINAPI *get_cols)(IHTMLTextAreaElement *This,long *p);
      HRESULT (WINAPI *put_wrap)(IHTMLTextAreaElement *This,BSTR v);
      HRESULT (WINAPI *get_wrap)(IHTMLTextAreaElement *This,BSTR *p);
      HRESULT (WINAPI *createTextRange)(IHTMLTextAreaElement *This,IHTMLTxtRange **range);
    END_INTERFACE
  } IHTMLTextAreaElementVtbl;
  interface IHTMLTextAreaElement {
    CONST_VTBL struct IHTMLTextAreaElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLTextAreaElement_get_type_Proxy(IHTMLTextAreaElement *This,BSTR *p);
  void __RPC_STUB IHTMLTextAreaElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_put_value_Proxy(IHTMLTextAreaElement *This,BSTR v);
  void __RPC_STUB IHTMLTextAreaElement_put_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_get_value_Proxy(IHTMLTextAreaElement *This,BSTR *p);
  void __RPC_STUB IHTMLTextAreaElement_get_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_put_name_Proxy(IHTMLTextAreaElement *This,BSTR v);
  void __RPC_STUB IHTMLTextAreaElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_get_name_Proxy(IHTMLTextAreaElement *This,BSTR *p);
  void __RPC_STUB IHTMLTextAreaElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_put_status_Proxy(IHTMLTextAreaElement *This,VARIANT v);
  void __RPC_STUB IHTMLTextAreaElement_put_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_get_status_Proxy(IHTMLTextAreaElement *This,VARIANT *p);
  void __RPC_STUB IHTMLTextAreaElement_get_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_put_disabled_Proxy(IHTMLTextAreaElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLTextAreaElement_put_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_get_disabled_Proxy(IHTMLTextAreaElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLTextAreaElement_get_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_get_form_Proxy(IHTMLTextAreaElement *This,IHTMLFormElement **p);
  void __RPC_STUB IHTMLTextAreaElement_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_put_defaultValue_Proxy(IHTMLTextAreaElement *This,BSTR v);
  void __RPC_STUB IHTMLTextAreaElement_put_defaultValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_get_defaultValue_Proxy(IHTMLTextAreaElement *This,BSTR *p);
  void __RPC_STUB IHTMLTextAreaElement_get_defaultValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_select_Proxy(IHTMLTextAreaElement *This);
  void __RPC_STUB IHTMLTextAreaElement_select_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_put_onchange_Proxy(IHTMLTextAreaElement *This,VARIANT v);
  void __RPC_STUB IHTMLTextAreaElement_put_onchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_get_onchange_Proxy(IHTMLTextAreaElement *This,VARIANT *p);
  void __RPC_STUB IHTMLTextAreaElement_get_onchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_put_onselect_Proxy(IHTMLTextAreaElement *This,VARIANT v);
  void __RPC_STUB IHTMLTextAreaElement_put_onselect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_get_onselect_Proxy(IHTMLTextAreaElement *This,VARIANT *p);
  void __RPC_STUB IHTMLTextAreaElement_get_onselect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_put_readOnly_Proxy(IHTMLTextAreaElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLTextAreaElement_put_readOnly_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_get_readOnly_Proxy(IHTMLTextAreaElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLTextAreaElement_get_readOnly_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_put_rows_Proxy(IHTMLTextAreaElement *This,long v);
  void __RPC_STUB IHTMLTextAreaElement_put_rows_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_get_rows_Proxy(IHTMLTextAreaElement *This,long *p);
  void __RPC_STUB IHTMLTextAreaElement_get_rows_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_put_cols_Proxy(IHTMLTextAreaElement *This,long v);
  void __RPC_STUB IHTMLTextAreaElement_put_cols_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_get_cols_Proxy(IHTMLTextAreaElement *This,long *p);
  void __RPC_STUB IHTMLTextAreaElement_get_cols_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_put_wrap_Proxy(IHTMLTextAreaElement *This,BSTR v);
  void __RPC_STUB IHTMLTextAreaElement_put_wrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_get_wrap_Proxy(IHTMLTextAreaElement *This,BSTR *p);
  void __RPC_STUB IHTMLTextAreaElement_get_wrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTextAreaElement_createTextRange_Proxy(IHTMLTextAreaElement *This,IHTMLTxtRange **range);
  void __RPC_STUB IHTMLTextAreaElement_createTextRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLTextAreaElement_DISPINTERFACE_DEFINED__
#define __DispHTMLTextAreaElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLTextAreaElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLTextAreaElement : public IDispatch {
  };
#else
  typedef struct DispHTMLTextAreaElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLTextAreaElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLTextAreaElement *This);
      ULONG (WINAPI *Release)(DispHTMLTextAreaElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLTextAreaElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLTextAreaElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLTextAreaElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLTextAreaElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLTextAreaElement;
#ifdef __cplusplus
  class HTMLTextAreaElement;
#endif

#ifndef __DispHTMLRichtextElement_DISPINTERFACE_DEFINED__
#define __DispHTMLRichtextElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLRichtextElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLRichtextElement : public IDispatch {
  };
#else
  typedef struct DispHTMLRichtextElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLRichtextElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLRichtextElement *This);
      ULONG (WINAPI *Release)(DispHTMLRichtextElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLRichtextElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLRichtextElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLRichtextElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLRichtextElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLRichtextElement;
#ifdef __cplusplus
  class HTMLRichtextElement;
#endif

#ifndef __IHTMLButtonElement_INTERFACE_DEFINED__
#define __IHTMLButtonElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLButtonElement;

#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLButtonElement : public IDispatch {
  public:
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI put_value(BSTR v) = 0;
    virtual HRESULT WINAPI get_value(BSTR *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_status(VARIANT v) = 0;
    virtual HRESULT WINAPI get_status(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_disabled(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_disabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;
    virtual HRESULT WINAPI createTextRange(IHTMLTxtRange **range) = 0;
  };
#else
  typedef struct IHTMLButtonElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLButtonElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLButtonElement *This);
      ULONG (WINAPI *Release)(IHTMLButtonElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLButtonElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLButtonElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLButtonElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLButtonElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_type)(IHTMLButtonElement *This,BSTR *p);
      HRESULT (WINAPI *put_value)(IHTMLButtonElement *This,BSTR v);
      HRESULT (WINAPI *get_value)(IHTMLButtonElement *This,BSTR *p);
      HRESULT (WINAPI *put_name)(IHTMLButtonElement *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLButtonElement *This,BSTR *p);
      HRESULT (WINAPI *put_status)(IHTMLButtonElement *This,VARIANT v);
      HRESULT (WINAPI *get_status)(IHTMLButtonElement *This,VARIANT *p);
      HRESULT (WINAPI *put_disabled)(IHTMLButtonElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_disabled)(IHTMLButtonElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_form)(IHTMLButtonElement *This,IHTMLFormElement **p);
      HRESULT (WINAPI *createTextRange)(IHTMLButtonElement *This,IHTMLTxtRange **range);
    END_INTERFACE
  } IHTMLButtonElementVtbl;
  interface IHTMLButtonElement {
    CONST_VTBL struct IHTMLButtonElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLButtonElement_get_type_Proxy(IHTMLButtonElement *This,BSTR *p);
  void __RPC_STUB IHTMLButtonElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLButtonElement_put_value_Proxy(IHTMLButtonElement *This,BSTR v);
  void __RPC_STUB IHTMLButtonElement_put_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLButtonElement_get_value_Proxy(IHTMLButtonElement *This,BSTR *p);
  void __RPC_STUB IHTMLButtonElement_get_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLButtonElement_put_name_Proxy(IHTMLButtonElement *This,BSTR v);
  void __RPC_STUB IHTMLButtonElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLButtonElement_get_name_Proxy(IHTMLButtonElement *This,BSTR *p);
  void __RPC_STUB IHTMLButtonElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLButtonElement_put_status_Proxy(IHTMLButtonElement *This,VARIANT v);
  void __RPC_STUB IHTMLButtonElement_put_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLButtonElement_get_status_Proxy(IHTMLButtonElement *This,VARIANT *p);
  void __RPC_STUB IHTMLButtonElement_get_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLButtonElement_put_disabled_Proxy(IHTMLButtonElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLButtonElement_put_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLButtonElement_get_disabled_Proxy(IHTMLButtonElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLButtonElement_get_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLButtonElement_get_form_Proxy(IHTMLButtonElement *This,IHTMLFormElement **p);
  void __RPC_STUB IHTMLButtonElement_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLButtonElement_createTextRange_Proxy(IHTMLButtonElement *This,IHTMLTxtRange **range);
  void __RPC_STUB IHTMLButtonElement_createTextRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLButtonElement_DISPINTERFACE_DEFINED__
#define __DispHTMLButtonElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLButtonElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLButtonElement : public IDispatch {
  };
#else
  typedef struct DispHTMLButtonElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLButtonElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLButtonElement *This);
      ULONG (WINAPI *Release)(DispHTMLButtonElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLButtonElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLButtonElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLButtonElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLButtonElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLButtonElement;
#ifdef __cplusplus
  class HTMLButtonElement;
#endif

#ifndef __HTMLMarqueeElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLMarqueeElementEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLMarqueeElementEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLMarqueeElementEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLMarqueeElementEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLMarqueeElementEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLMarqueeElementEvents2 *This);
      ULONG (WINAPI *Release)(HTMLMarqueeElementEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLMarqueeElementEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLMarqueeElementEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLMarqueeElementEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLMarqueeElementEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLMarqueeElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLMarqueeElementEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLMarqueeElementEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLMarqueeElementEvents : public IDispatch {
  };
#else
  typedef struct HTMLMarqueeElementEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLMarqueeElementEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLMarqueeElementEvents *This);
      ULONG (WINAPI *Release)(HTMLMarqueeElementEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLMarqueeElementEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLMarqueeElementEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLMarqueeElementEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLMarqueeElementEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __IHTMLMarqueeElement_INTERFACE_DEFINED__
#define __IHTMLMarqueeElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLMarqueeElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLMarqueeElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_bgColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_bgColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_scrollDelay(long v) = 0;
    virtual HRESULT WINAPI get_scrollDelay(long *p) = 0;
    virtual HRESULT WINAPI put_direction(BSTR v) = 0;
    virtual HRESULT WINAPI get_direction(BSTR *p) = 0;
    virtual HRESULT WINAPI put_behavior(BSTR v) = 0;
    virtual HRESULT WINAPI get_behavior(BSTR *p) = 0;
    virtual HRESULT WINAPI put_scrollAmount(long v) = 0;
    virtual HRESULT WINAPI get_scrollAmount(long *p) = 0;
    virtual HRESULT WINAPI put_loop(long v) = 0;
    virtual HRESULT WINAPI get_loop(long *p) = 0;
    virtual HRESULT WINAPI put_vspace(long v) = 0;
    virtual HRESULT WINAPI get_vspace(long *p) = 0;
    virtual HRESULT WINAPI put_hspace(long v) = 0;
    virtual HRESULT WINAPI get_hspace(long *p) = 0;
    virtual HRESULT WINAPI put_onfinish(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onfinish(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onstart(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onstart(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onbounce(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onbounce(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_width(VARIANT v) = 0;
    virtual HRESULT WINAPI get_width(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_height(VARIANT v) = 0;
    virtual HRESULT WINAPI get_height(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_trueSpeed(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_trueSpeed(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI start(void) = 0;
    virtual HRESULT WINAPI stop(void) = 0;
  };
#else
  typedef struct IHTMLMarqueeElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLMarqueeElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLMarqueeElement *This);
      ULONG (WINAPI *Release)(IHTMLMarqueeElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLMarqueeElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLMarqueeElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLMarqueeElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLMarqueeElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_bgColor)(IHTMLMarqueeElement *This,VARIANT v);
      HRESULT (WINAPI *get_bgColor)(IHTMLMarqueeElement *This,VARIANT *p);
      HRESULT (WINAPI *put_scrollDelay)(IHTMLMarqueeElement *This,long v);
      HRESULT (WINAPI *get_scrollDelay)(IHTMLMarqueeElement *This,long *p);
      HRESULT (WINAPI *put_direction)(IHTMLMarqueeElement *This,BSTR v);
      HRESULT (WINAPI *get_direction)(IHTMLMarqueeElement *This,BSTR *p);
      HRESULT (WINAPI *put_behavior)(IHTMLMarqueeElement *This,BSTR v);
      HRESULT (WINAPI *get_behavior)(IHTMLMarqueeElement *This,BSTR *p);
      HRESULT (WINAPI *put_scrollAmount)(IHTMLMarqueeElement *This,long v);
      HRESULT (WINAPI *get_scrollAmount)(IHTMLMarqueeElement *This,long *p);
      HRESULT (WINAPI *put_loop)(IHTMLMarqueeElement *This,long v);
      HRESULT (WINAPI *get_loop)(IHTMLMarqueeElement *This,long *p);
      HRESULT (WINAPI *put_vspace)(IHTMLMarqueeElement *This,long v);
      HRESULT (WINAPI *get_vspace)(IHTMLMarqueeElement *This,long *p);
      HRESULT (WINAPI *put_hspace)(IHTMLMarqueeElement *This,long v);
      HRESULT (WINAPI *get_hspace)(IHTMLMarqueeElement *This,long *p);
      HRESULT (WINAPI *put_onfinish)(IHTMLMarqueeElement *This,VARIANT v);
      HRESULT (WINAPI *get_onfinish)(IHTMLMarqueeElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onstart)(IHTMLMarqueeElement *This,VARIANT v);
      HRESULT (WINAPI *get_onstart)(IHTMLMarqueeElement *This,VARIANT *p);
      HRESULT (WINAPI *put_onbounce)(IHTMLMarqueeElement *This,VARIANT v);
      HRESULT (WINAPI *get_onbounce)(IHTMLMarqueeElement *This,VARIANT *p);
      HRESULT (WINAPI *put_width)(IHTMLMarqueeElement *This,VARIANT v);
      HRESULT (WINAPI *get_width)(IHTMLMarqueeElement *This,VARIANT *p);
      HRESULT (WINAPI *put_height)(IHTMLMarqueeElement *This,VARIANT v);
      HRESULT (WINAPI *get_height)(IHTMLMarqueeElement *This,VARIANT *p);
      HRESULT (WINAPI *put_trueSpeed)(IHTMLMarqueeElement *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_trueSpeed)(IHTMLMarqueeElement *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *start)(IHTMLMarqueeElement *This);
      HRESULT (WINAPI *stop)(IHTMLMarqueeElement *This);
    END_INTERFACE
  } IHTMLMarqueeElementVtbl;
  interface IHTMLMarqueeElement {
    CONST_VTBL struct IHTMLMarqueeElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLMarqueeElement_put_bgColor_Proxy(IHTMLMarqueeElement *This,VARIANT v);
  void __RPC_STUB IHTMLMarqueeElement_put_bgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_get_bgColor_Proxy(IHTMLMarqueeElement *This,VARIANT *p);
  void __RPC_STUB IHTMLMarqueeElement_get_bgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_put_scrollDelay_Proxy(IHTMLMarqueeElement *This,long v);
  void __RPC_STUB IHTMLMarqueeElement_put_scrollDelay_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_get_scrollDelay_Proxy(IHTMLMarqueeElement *This,long *p);
  void __RPC_STUB IHTMLMarqueeElement_get_scrollDelay_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_put_direction_Proxy(IHTMLMarqueeElement *This,BSTR v);
  void __RPC_STUB IHTMLMarqueeElement_put_direction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_get_direction_Proxy(IHTMLMarqueeElement *This,BSTR *p);
  void __RPC_STUB IHTMLMarqueeElement_get_direction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_put_behavior_Proxy(IHTMLMarqueeElement *This,BSTR v);
  void __RPC_STUB IHTMLMarqueeElement_put_behavior_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_get_behavior_Proxy(IHTMLMarqueeElement *This,BSTR *p);
  void __RPC_STUB IHTMLMarqueeElement_get_behavior_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_put_scrollAmount_Proxy(IHTMLMarqueeElement *This,long v);
  void __RPC_STUB IHTMLMarqueeElement_put_scrollAmount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_get_scrollAmount_Proxy(IHTMLMarqueeElement *This,long *p);
  void __RPC_STUB IHTMLMarqueeElement_get_scrollAmount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_put_loop_Proxy(IHTMLMarqueeElement *This,long v);
  void __RPC_STUB IHTMLMarqueeElement_put_loop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_get_loop_Proxy(IHTMLMarqueeElement *This,long *p);
  void __RPC_STUB IHTMLMarqueeElement_get_loop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_put_vspace_Proxy(IHTMLMarqueeElement *This,long v);
  void __RPC_STUB IHTMLMarqueeElement_put_vspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_get_vspace_Proxy(IHTMLMarqueeElement *This,long *p);
  void __RPC_STUB IHTMLMarqueeElement_get_vspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_put_hspace_Proxy(IHTMLMarqueeElement *This,long v);
  void __RPC_STUB IHTMLMarqueeElement_put_hspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_get_hspace_Proxy(IHTMLMarqueeElement *This,long *p);
  void __RPC_STUB IHTMLMarqueeElement_get_hspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_put_onfinish_Proxy(IHTMLMarqueeElement *This,VARIANT v);
  void __RPC_STUB IHTMLMarqueeElement_put_onfinish_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_get_onfinish_Proxy(IHTMLMarqueeElement *This,VARIANT *p);
  void __RPC_STUB IHTMLMarqueeElement_get_onfinish_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_put_onstart_Proxy(IHTMLMarqueeElement *This,VARIANT v);
  void __RPC_STUB IHTMLMarqueeElement_put_onstart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_get_onstart_Proxy(IHTMLMarqueeElement *This,VARIANT *p);
  void __RPC_STUB IHTMLMarqueeElement_get_onstart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_put_onbounce_Proxy(IHTMLMarqueeElement *This,VARIANT v);
  void __RPC_STUB IHTMLMarqueeElement_put_onbounce_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_get_onbounce_Proxy(IHTMLMarqueeElement *This,VARIANT *p);
  void __RPC_STUB IHTMLMarqueeElement_get_onbounce_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_put_width_Proxy(IHTMLMarqueeElement *This,VARIANT v);
  void __RPC_STUB IHTMLMarqueeElement_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_get_width_Proxy(IHTMLMarqueeElement *This,VARIANT *p);
  void __RPC_STUB IHTMLMarqueeElement_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_put_height_Proxy(IHTMLMarqueeElement *This,VARIANT v);
  void __RPC_STUB IHTMLMarqueeElement_put_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_get_height_Proxy(IHTMLMarqueeElement *This,VARIANT *p);
  void __RPC_STUB IHTMLMarqueeElement_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_put_trueSpeed_Proxy(IHTMLMarqueeElement *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLMarqueeElement_put_trueSpeed_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_get_trueSpeed_Proxy(IHTMLMarqueeElement *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLMarqueeElement_get_trueSpeed_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_start_Proxy(IHTMLMarqueeElement *This);
  void __RPC_STUB IHTMLMarqueeElement_start_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMarqueeElement_stop_Proxy(IHTMLMarqueeElement *This);
  void __RPC_STUB IHTMLMarqueeElement_stop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLMarqueeElement_DISPINTERFACE_DEFINED__
#define __DispHTMLMarqueeElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLMarqueeElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLMarqueeElement : public IDispatch {
  };
#else
  typedef struct DispHTMLMarqueeElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLMarqueeElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLMarqueeElement *This);
      ULONG (WINAPI *Release)(DispHTMLMarqueeElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLMarqueeElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLMarqueeElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLMarqueeElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLMarqueeElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLMarqueeElement;
#ifdef __cplusplus
  class HTMLMarqueeElement;
#endif

#ifndef __IHTMLHtmlElement_INTERFACE_DEFINED__
#define __IHTMLHtmlElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLHtmlElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLHtmlElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_version(BSTR v) = 0;
    virtual HRESULT WINAPI get_version(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLHtmlElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLHtmlElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLHtmlElement *This);
      ULONG (WINAPI *Release)(IHTMLHtmlElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLHtmlElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLHtmlElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLHtmlElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLHtmlElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_version)(IHTMLHtmlElement *This,BSTR v);
      HRESULT (WINAPI *get_version)(IHTMLHtmlElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLHtmlElementVtbl;
  interface IHTMLHtmlElement {
    CONST_VTBL struct IHTMLHtmlElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLHtmlElement_put_version(This,v) (This)->lpVtbl->put_version(This,v)
#define IHTMLHtmlElement_get_version(This,p) (This)->lpVtbl->get_version(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLHtmlElement_put_version_Proxy(IHTMLHtmlElement *This,BSTR v);
  void __RPC_STUB IHTMLHtmlElement_put_version_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLHtmlElement_get_version_Proxy(IHTMLHtmlElement *This,BSTR *p);
  void __RPC_STUB IHTMLHtmlElement_get_version_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLHeadElement_INTERFACE_DEFINED__
#define __IHTMLHeadElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLHeadElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLHeadElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_profile(BSTR v) = 0;
    virtual HRESULT WINAPI get_profile(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLHeadElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLHeadElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLHeadElement *This);
      ULONG (WINAPI *Release)(IHTMLHeadElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLHeadElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLHeadElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLHeadElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLHeadElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_profile)(IHTMLHeadElement *This,BSTR v);
      HRESULT (WINAPI *get_profile)(IHTMLHeadElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLHeadElementVtbl;
  interface IHTMLHeadElement {
    CONST_VTBL struct IHTMLHeadElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLHeadElement_put_profile(This,v) (This)->lpVtbl->put_profile(This,v)
#define IHTMLHeadElement_get_profile(This,p) (This)->lpVtbl->get_profile(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLHeadElement_put_profile_Proxy(IHTMLHeadElement *This,BSTR v);
  void __RPC_STUB IHTMLHeadElement_put_profile_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLHeadElement_get_profile_Proxy(IHTMLHeadElement *This,BSTR *p);
  void __RPC_STUB IHTMLHeadElement_get_profile_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTitleElement_INTERFACE_DEFINED__
#define __IHTMLTitleElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLTitleElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLTitleElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_text(BSTR v) = 0;
    virtual HRESULT WINAPI get_text(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLTitleElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLTitleElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLTitleElement *This);
      ULONG (WINAPI *Release)(IHTMLTitleElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTitleElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLTitleElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLTitleElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLTitleElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_text)(IHTMLTitleElement *This,BSTR v);
      HRESULT (WINAPI *get_text)(IHTMLTitleElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLTitleElementVtbl;
  interface IHTMLTitleElement {
    CONST_VTBL struct IHTMLTitleElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLTitleElement_put_text(This,v) (This)->lpVtbl->put_text(This,v)
#define IHTMLTitleElement_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLTitleElement_put_text_Proxy(IHTMLTitleElement *This,BSTR v);
  void __RPC_STUB IHTMLTitleElement_put_text_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLTitleElement_get_text_Proxy(IHTMLTitleElement *This,BSTR *p);
  void __RPC_STUB IHTMLTitleElement_get_text_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLMetaElement_INTERFACE_DEFINED__
#define __IHTMLMetaElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLMetaElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLMetaElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_httpEquiv(BSTR v) = 0;
    virtual HRESULT WINAPI get_httpEquiv(BSTR *p) = 0;
    virtual HRESULT WINAPI put_content(BSTR v) = 0;
    virtual HRESULT WINAPI get_content(BSTR *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_url(BSTR v) = 0;
    virtual HRESULT WINAPI get_url(BSTR *p) = 0;
    virtual HRESULT WINAPI put_charset(BSTR v) = 0;
    virtual HRESULT WINAPI get_charset(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLMetaElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLMetaElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLMetaElement *This);
      ULONG (WINAPI *Release)(IHTMLMetaElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLMetaElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLMetaElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLMetaElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLMetaElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_httpEquiv)(IHTMLMetaElement *This,BSTR v);
      HRESULT (WINAPI *get_httpEquiv)(IHTMLMetaElement *This,BSTR *p);
      HRESULT (WINAPI *put_content)(IHTMLMetaElement *This,BSTR v);
      HRESULT (WINAPI *get_content)(IHTMLMetaElement *This,BSTR *p);
      HRESULT (WINAPI *put_name)(IHTMLMetaElement *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLMetaElement *This,BSTR *p);
      HRESULT (WINAPI *put_url)(IHTMLMetaElement *This,BSTR v);
      HRESULT (WINAPI *get_url)(IHTMLMetaElement *This,BSTR *p);
      HRESULT (WINAPI *put_charset)(IHTMLMetaElement *This,BSTR v);
      HRESULT (WINAPI *get_charset)(IHTMLMetaElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLMetaElementVtbl;
  interface IHTMLMetaElement {
    CONST_VTBL struct IHTMLMetaElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLMetaElement_put_httpEquiv_Proxy(IHTMLMetaElement *This,BSTR v);
  void __RPC_STUB IHTMLMetaElement_put_httpEquiv_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMetaElement_get_httpEquiv_Proxy(IHTMLMetaElement *This,BSTR *p);
  void __RPC_STUB IHTMLMetaElement_get_httpEquiv_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMetaElement_put_content_Proxy(IHTMLMetaElement *This,BSTR v);
  void __RPC_STUB IHTMLMetaElement_put_content_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMetaElement_get_content_Proxy(IHTMLMetaElement *This,BSTR *p);
  void __RPC_STUB IHTMLMetaElement_get_content_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMetaElement_put_name_Proxy(IHTMLMetaElement *This,BSTR v);
  void __RPC_STUB IHTMLMetaElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMetaElement_get_name_Proxy(IHTMLMetaElement *This,BSTR *p);
  void __RPC_STUB IHTMLMetaElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMetaElement_put_url_Proxy(IHTMLMetaElement *This,BSTR v);
  void __RPC_STUB IHTMLMetaElement_put_url_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMetaElement_get_url_Proxy(IHTMLMetaElement *This,BSTR *p);
  void __RPC_STUB IHTMLMetaElement_get_url_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMetaElement_put_charset_Proxy(IHTMLMetaElement *This,BSTR v);
  void __RPC_STUB IHTMLMetaElement_put_charset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMetaElement_get_charset_Proxy(IHTMLMetaElement *This,BSTR *p);
  void __RPC_STUB IHTMLMetaElement_get_charset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLMetaElement2_INTERFACE_DEFINED__
#define __IHTMLMetaElement2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLMetaElement2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLMetaElement2 : public IDispatch {
  public:
    virtual HRESULT WINAPI put_scheme(BSTR v) = 0;
    virtual HRESULT WINAPI get_scheme(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLMetaElement2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLMetaElement2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLMetaElement2 *This);
      ULONG (WINAPI *Release)(IHTMLMetaElement2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLMetaElement2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLMetaElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLMetaElement2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLMetaElement2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_scheme)(IHTMLMetaElement2 *This,BSTR v);
      HRESULT (WINAPI *get_scheme)(IHTMLMetaElement2 *This,BSTR *p);
    END_INTERFACE
  } IHTMLMetaElement2Vtbl;
  interface IHTMLMetaElement2 {
    CONST_VTBL struct IHTMLMetaElement2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLMetaElement2_put_scheme(This,v) (This)->lpVtbl->put_scheme(This,v)
#define IHTMLMetaElement2_get_scheme(This,p) (This)->lpVtbl->get_scheme(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLMetaElement2_put_scheme_Proxy(IHTMLMetaElement2 *This,BSTR v);
  void __RPC_STUB IHTMLMetaElement2_put_scheme_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLMetaElement2_get_scheme_Proxy(IHTMLMetaElement2 *This,BSTR *p);
  void __RPC_STUB IHTMLMetaElement2_get_scheme_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLBaseElement_INTERFACE_DEFINED__
#define __IHTMLBaseElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLBaseElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLBaseElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_href(BSTR v) = 0;
    virtual HRESULT WINAPI get_href(BSTR *p) = 0;
    virtual HRESULT WINAPI put_target(BSTR v) = 0;
    virtual HRESULT WINAPI get_target(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLBaseElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLBaseElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLBaseElement *This);
      ULONG (WINAPI *Release)(IHTMLBaseElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLBaseElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLBaseElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLBaseElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLBaseElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_href)(IHTMLBaseElement *This,BSTR v);
      HRESULT (WINAPI *get_href)(IHTMLBaseElement *This,BSTR *p);
      HRESULT (WINAPI *put_target)(IHTMLBaseElement *This,BSTR v);
      HRESULT (WINAPI *get_target)(IHTMLBaseElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLBaseElementVtbl;
  interface IHTMLBaseElement {
    CONST_VTBL struct IHTMLBaseElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLBaseElement_put_href_Proxy(IHTMLBaseElement *This,BSTR v);
  void __RPC_STUB IHTMLBaseElement_put_href_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBaseElement_get_href_Proxy(IHTMLBaseElement *This,BSTR *p);
  void __RPC_STUB IHTMLBaseElement_get_href_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBaseElement_put_target_Proxy(IHTMLBaseElement *This,BSTR v);
  void __RPC_STUB IHTMLBaseElement_put_target_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBaseElement_get_target_Proxy(IHTMLBaseElement *This,BSTR *p);
  void __RPC_STUB IHTMLBaseElement_get_target_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLIsIndexElement_INTERFACE_DEFINED__
#define __IHTMLIsIndexElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLIsIndexElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLIsIndexElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_prompt(BSTR v) = 0;
    virtual HRESULT WINAPI get_prompt(BSTR *p) = 0;
    virtual HRESULT WINAPI put_action(BSTR v) = 0;
    virtual HRESULT WINAPI get_action(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLIsIndexElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLIsIndexElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLIsIndexElement *This);
      ULONG (WINAPI *Release)(IHTMLIsIndexElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLIsIndexElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLIsIndexElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLIsIndexElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLIsIndexElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_prompt)(IHTMLIsIndexElement *This,BSTR v);
      HRESULT (WINAPI *get_prompt)(IHTMLIsIndexElement *This,BSTR *p);
      HRESULT (WINAPI *put_action)(IHTMLIsIndexElement *This,BSTR v);
      HRESULT (WINAPI *get_action)(IHTMLIsIndexElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLIsIndexElementVtbl;
  interface IHTMLIsIndexElement {
    CONST_VTBL struct IHTMLIsIndexElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLIsIndexElement_put_prompt_Proxy(IHTMLIsIndexElement *This,BSTR v);
  void __RPC_STUB IHTMLIsIndexElement_put_prompt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLIsIndexElement_get_prompt_Proxy(IHTMLIsIndexElement *This,BSTR *p);
  void __RPC_STUB IHTMLIsIndexElement_get_prompt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLIsIndexElement_put_action_Proxy(IHTMLIsIndexElement *This,BSTR v);
  void __RPC_STUB IHTMLIsIndexElement_put_action_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLIsIndexElement_get_action_Proxy(IHTMLIsIndexElement *This,BSTR *p);
  void __RPC_STUB IHTMLIsIndexElement_get_action_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLIsIndexElement2_INTERFACE_DEFINED__
#define __IHTMLIsIndexElement2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLIsIndexElement2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLIsIndexElement2 : public IDispatch {
  public:
    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;
  };
#else
  typedef struct IHTMLIsIndexElement2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLIsIndexElement2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLIsIndexElement2 *This);
      ULONG (WINAPI *Release)(IHTMLIsIndexElement2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLIsIndexElement2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLIsIndexElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLIsIndexElement2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLIsIndexElement2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_form)(IHTMLIsIndexElement2 *This,IHTMLFormElement **p);
    END_INTERFACE
  } IHTMLIsIndexElement2Vtbl;
  interface IHTMLIsIndexElement2 {
    CONST_VTBL struct IHTMLIsIndexElement2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLIsIndexElement2_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLIsIndexElement2_get_form_Proxy(IHTMLIsIndexElement2 *This,IHTMLFormElement **p);
  void __RPC_STUB IHTMLIsIndexElement2_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLNextIdElement_INTERFACE_DEFINED__
#define __IHTMLNextIdElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLNextIdElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLNextIdElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_n(BSTR v) = 0;
    virtual HRESULT WINAPI get_n(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLNextIdElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLNextIdElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLNextIdElement *This);
      ULONG (WINAPI *Release)(IHTMLNextIdElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLNextIdElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLNextIdElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLNextIdElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLNextIdElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_n)(IHTMLNextIdElement *This,BSTR v);
      HRESULT (WINAPI *get_n)(IHTMLNextIdElement *This,BSTR *p);
    END_INTERFACE
  } IHTMLNextIdElementVtbl;
  interface IHTMLNextIdElement {
    CONST_VTBL struct IHTMLNextIdElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLNextIdElement_put_n(This,v) (This)->lpVtbl->put_n(This,v)
#define IHTMLNextIdElement_get_n(This,p) (This)->lpVtbl->get_n(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLNextIdElement_put_n_Proxy(IHTMLNextIdElement *This,BSTR v);
  void __RPC_STUB IHTMLNextIdElement_put_n_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLNextIdElement_get_n_Proxy(IHTMLNextIdElement *This,BSTR *p);
  void __RPC_STUB IHTMLNextIdElement_get_n_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLHtmlElement_DISPINTERFACE_DEFINED__
#define __DispHTMLHtmlElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLHtmlElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLHtmlElement : public IDispatch {
  };
#else
  typedef struct DispHTMLHtmlElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLHtmlElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLHtmlElement *This);
      ULONG (WINAPI *Release)(DispHTMLHtmlElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLHtmlElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLHtmlElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLHtmlElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLHtmlElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLHtmlElement;
#ifdef __cplusplus
  class HTMLHtmlElement;
#endif

#ifndef __DispHTMLHeadElement_DISPINTERFACE_DEFINED__
#define __DispHTMLHeadElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLHeadElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLHeadElement : public IDispatch {
  };
#else
  typedef struct DispHTMLHeadElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLHeadElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLHeadElement *This);
      ULONG (WINAPI *Release)(DispHTMLHeadElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLHeadElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLHeadElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLHeadElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLHeadElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLHeadElement;
#ifdef __cplusplus
  class HTMLHeadElement;
#endif

#ifndef __DispHTMLTitleElement_DISPINTERFACE_DEFINED__
#define __DispHTMLTitleElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLTitleElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLTitleElement : public IDispatch {
  };
#else
  typedef struct DispHTMLTitleElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLTitleElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLTitleElement *This);
      ULONG (WINAPI *Release)(DispHTMLTitleElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLTitleElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLTitleElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLTitleElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLTitleElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLTitleElement;
#ifdef __cplusplus
  class HTMLTitleElement;
#endif

#ifndef __DispHTMLMetaElement_DISPINTERFACE_DEFINED__
#define __DispHTMLMetaElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLMetaElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLMetaElement : public IDispatch {
  };
#else
  typedef struct DispHTMLMetaElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLMetaElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLMetaElement *This);
      ULONG (WINAPI *Release)(DispHTMLMetaElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLMetaElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLMetaElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLMetaElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLMetaElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLMetaElement;
#ifdef __cplusplus
  class HTMLMetaElement;
#endif

#ifndef __DispHTMLBaseElement_DISPINTERFACE_DEFINED__
#define __DispHTMLBaseElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLBaseElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLBaseElement : public IDispatch {
  };
#else
  typedef struct DispHTMLBaseElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLBaseElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLBaseElement *This);
      ULONG (WINAPI *Release)(DispHTMLBaseElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLBaseElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLBaseElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLBaseElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLBaseElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLBaseElement;
#ifdef __cplusplus
  class HTMLBaseElement;
#endif

#ifndef __DispHTMLIsIndexElement_DISPINTERFACE_DEFINED__
#define __DispHTMLIsIndexElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLIsIndexElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLIsIndexElement : public IDispatch {
  };
#else
  typedef struct DispHTMLIsIndexElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLIsIndexElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLIsIndexElement *This);
      ULONG (WINAPI *Release)(DispHTMLIsIndexElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLIsIndexElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLIsIndexElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLIsIndexElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLIsIndexElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLIsIndexElement;
#ifdef __cplusplus
  class HTMLIsIndexElement;
#endif

#ifndef __DispHTMLNextIdElement_DISPINTERFACE_DEFINED__
#define __DispHTMLNextIdElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLNextIdElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLNextIdElement : public IDispatch {
  };
#else
  typedef struct DispHTMLNextIdElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLNextIdElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLNextIdElement *This);
      ULONG (WINAPI *Release)(DispHTMLNextIdElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLNextIdElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLNextIdElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLNextIdElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLNextIdElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLNextIdElement;
#ifdef __cplusplus
  class HTMLNextIdElement;
#endif

#ifndef __IHTMLBaseFontElement_INTERFACE_DEFINED__
#define __IHTMLBaseFontElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLBaseFontElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLBaseFontElement : public IDispatch {
  public:
    virtual HRESULT WINAPI put_color(VARIANT v) = 0;
    virtual HRESULT WINAPI get_color(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_face(BSTR v) = 0;
    virtual HRESULT WINAPI get_face(BSTR *p) = 0;
    virtual HRESULT WINAPI put_size(long v) = 0;
    virtual HRESULT WINAPI get_size(long *p) = 0;
  };
#else
  typedef struct IHTMLBaseFontElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLBaseFontElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLBaseFontElement *This);
      ULONG (WINAPI *Release)(IHTMLBaseFontElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLBaseFontElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLBaseFontElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLBaseFontElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLBaseFontElement *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_color)(IHTMLBaseFontElement *This,VARIANT v);
      HRESULT (WINAPI *get_color)(IHTMLBaseFontElement *This,VARIANT *p);
      HRESULT (WINAPI *put_face)(IHTMLBaseFontElement *This,BSTR v);
      HRESULT (WINAPI *get_face)(IHTMLBaseFontElement *This,BSTR *p);
      HRESULT (WINAPI *put_size)(IHTMLBaseFontElement *This,long v);
      HRESULT (WINAPI *get_size)(IHTMLBaseFontElement *This,long *p);
    END_INTERFACE
  } IHTMLBaseFontElementVtbl;
  interface IHTMLBaseFontElement {
    CONST_VTBL struct IHTMLBaseFontElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLBaseFontElement_put_color_Proxy(IHTMLBaseFontElement *This,VARIANT v);
  void __RPC_STUB IHTMLBaseFontElement_put_color_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBaseFontElement_get_color_Proxy(IHTMLBaseFontElement *This,VARIANT *p);
  void __RPC_STUB IHTMLBaseFontElement_get_color_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBaseFontElement_put_face_Proxy(IHTMLBaseFontElement *This,BSTR v);
  void __RPC_STUB IHTMLBaseFontElement_put_face_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBaseFontElement_get_face_Proxy(IHTMLBaseFontElement *This,BSTR *p);
  void __RPC_STUB IHTMLBaseFontElement_get_face_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBaseFontElement_put_size_Proxy(IHTMLBaseFontElement *This,long v);
  void __RPC_STUB IHTMLBaseFontElement_put_size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBaseFontElement_get_size_Proxy(IHTMLBaseFontElement *This,long *p);
  void __RPC_STUB IHTMLBaseFontElement_get_size_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLBaseFontElement_DISPINTERFACE_DEFINED__
#define __DispHTMLBaseFontElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLBaseFontElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLBaseFontElement : public IDispatch {
  };
#else
  typedef struct DispHTMLBaseFontElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLBaseFontElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLBaseFontElement *This);
      ULONG (WINAPI *Release)(DispHTMLBaseFontElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLBaseFontElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLBaseFontElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLBaseFontElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLBaseFontElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLBaseFontElement;
#ifdef __cplusplus
  class HTMLBaseFontElement;
#endif

#ifndef __IHTMLUnknownElement_INTERFACE_DEFINED__
#define __IHTMLUnknownElement_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLUnknownElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLUnknownElement : public IDispatch {
  };
#else
  typedef struct IHTMLUnknownElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLUnknownElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLUnknownElement *This);
      ULONG (WINAPI *Release)(IHTMLUnknownElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLUnknownElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLUnknownElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLUnknownElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct IHTMLUnknownElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __DispHTMLUnknownElement_DISPINTERFACE_DEFINED__
#define __DispHTMLUnknownElement_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispHTMLUnknownElement;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLUnknownElement : public IDispatch {
  };
#else
  typedef struct DispHTMLUnknownElementVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispHTMLUnknownElement *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispHTMLUnknownElement *This);
      ULONG (WINAPI *Release)(DispHTMLUnknownElement *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLUnknownElement *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispHTMLUnknownElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispHTMLUnknownElement *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispHTMLUnknownElementVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_HTMLUnknownElement;
#ifdef __cplusplus
  class HTMLUnknownElement;
#endif

#ifndef __IOmHistory_INTERFACE_DEFINED__
#define __IOmHistory_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IOmHistory;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOmHistory : public IDispatch {
  public:
    virtual HRESULT WINAPI get_length(short *p) = 0;
    virtual HRESULT WINAPI back(VARIANT *pvargdistance) = 0;
    virtual HRESULT WINAPI forward(VARIANT *pvargdistance) = 0;
    virtual HRESULT WINAPI go(VARIANT *pvargdistance) = 0;
  };
#else
  typedef struct IOmHistoryVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOmHistory *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOmHistory *This);
      ULONG (WINAPI *Release)(IOmHistory *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IOmHistory *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IOmHistory *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IOmHistory *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IOmHistory *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_length)(IOmHistory *This,short *p);
      HRESULT (WINAPI *back)(IOmHistory *This,VARIANT *pvargdistance);
      HRESULT (WINAPI *forward)(IOmHistory *This,VARIANT *pvargdistance);
      HRESULT (WINAPI *go)(IOmHistory *This,VARIANT *pvargdistance);
    END_INTERFACE
  } IOmHistoryVtbl;
  interface IOmHistory {
    CONST_VTBL struct IOmHistoryVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IOmHistory_get_length_Proxy(IOmHistory *This,short *p);
  void __RPC_STUB IOmHistory_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmHistory_back_Proxy(IOmHistory *This,VARIANT *pvargdistance);
  void __RPC_STUB IOmHistory_back_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmHistory_forward_Proxy(IOmHistory *This,VARIANT *pvargdistance);
  void __RPC_STUB IOmHistory_forward_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmHistory_go_Proxy(IOmHistory *This,VARIANT *pvargdistance);
  void __RPC_STUB IOmHistory_go_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLMimeTypesCollection_INTERFACE_DEFINED__
#define __IHTMLMimeTypesCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLMimeTypesCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLMimeTypesCollection : public IDispatch {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;
  };
#else
  typedef struct IHTMLMimeTypesCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLMimeTypesCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLMimeTypesCollection *This);
      ULONG (WINAPI *Release)(IHTMLMimeTypesCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLMimeTypesCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLMimeTypesCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLMimeTypesCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLMimeTypesCollection *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_length)(IHTMLMimeTypesCollection *This,long *p);
    END_INTERFACE
  } IHTMLMimeTypesCollectionVtbl;
  interface IHTMLMimeTypesCollection {
    CONST_VTBL struct IHTMLMimeTypesCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLMimeTypesCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLMimeTypesCollection_get_length_Proxy(IHTMLMimeTypesCollection *This,long *p);
  void __RPC_STUB IHTMLMimeTypesCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLPluginsCollection_INTERFACE_DEFINED__
#define __IHTMLPluginsCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLPluginsCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLPluginsCollection : public IDispatch {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI refresh(VARIANT_BOOL reload = 0) = 0;
  };
#else
  typedef struct IHTMLPluginsCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLPluginsCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLPluginsCollection *This);
      ULONG (WINAPI *Release)(IHTMLPluginsCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLPluginsCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLPluginsCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLPluginsCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLPluginsCollection *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_length)(IHTMLPluginsCollection *This,long *p);
      HRESULT (WINAPI *refresh)(IHTMLPluginsCollection *This,VARIANT_BOOL reload);
    END_INTERFACE
  } IHTMLPluginsCollectionVtbl;
  interface IHTMLPluginsCollection {
    CONST_VTBL struct IHTMLPluginsCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLPluginsCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IHTMLPluginsCollection_refresh(This,reload) (This)->lpVtbl->refresh(This,reload)
#endif
#endif
  HRESULT WINAPI IHTMLPluginsCollection_get_length_Proxy(IHTMLPluginsCollection *This,long *p);
  void __RPC_STUB IHTMLPluginsCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLPluginsCollection_refresh_Proxy(IHTMLPluginsCollection *This,VARIANT_BOOL reload);
  void __RPC_STUB IHTMLPluginsCollection_refresh_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLOpsProfile_INTERFACE_DEFINED__
#define __IHTMLOpsProfile_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLOpsProfile;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLOpsProfile : public IDispatch {
  public:
    virtual HRESULT WINAPI addRequest(BSTR name,VARIANT reserved,VARIANT_BOOL *success) = 0;
    virtual HRESULT WINAPI clearRequest(void) = 0;
    virtual HRESULT WINAPI doRequest(VARIANT usage,VARIANT fname,VARIANT domain,VARIANT path,VARIANT expire,VARIANT reserved) = 0;
    virtual HRESULT WINAPI getAttribute(BSTR name,BSTR *value) = 0;
    virtual HRESULT WINAPI setAttribute(BSTR name,BSTR value,VARIANT prefs,VARIANT_BOOL *success) = 0;
    virtual HRESULT WINAPI commitChanges(VARIANT_BOOL *success) = 0;
    virtual HRESULT WINAPI addReadRequest(BSTR name,VARIANT reserved,VARIANT_BOOL *success) = 0;
    virtual HRESULT WINAPI doReadRequest(VARIANT usage,VARIANT fname,VARIANT domain,VARIANT path,VARIANT expire,VARIANT reserved) = 0;
    virtual HRESULT WINAPI doWriteRequest(VARIANT_BOOL *success) = 0;
  };
#else
  typedef struct IHTMLOpsProfileVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLOpsProfile *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLOpsProfile *This);
      ULONG (WINAPI *Release)(IHTMLOpsProfile *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLOpsProfile *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLOpsProfile *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLOpsProfile *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLOpsProfile *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *addRequest)(IHTMLOpsProfile *This,BSTR name,VARIANT reserved,VARIANT_BOOL *success);
      HRESULT (WINAPI *clearRequest)(IHTMLOpsProfile *This);
      HRESULT (WINAPI *doRequest)(IHTMLOpsProfile *This,VARIANT usage,VARIANT fname,VARIANT domain,VARIANT path,VARIANT expire,VARIANT reserved);
      HRESULT (WINAPI *getAttribute)(IHTMLOpsProfile *This,BSTR name,BSTR *value);
      HRESULT (WINAPI *setAttribute)(IHTMLOpsProfile *This,BSTR name,BSTR value,VARIANT prefs,VARIANT_BOOL *success);
      HRESULT (WINAPI *commitChanges)(IHTMLOpsProfile *This,VARIANT_BOOL *success);
      HRESULT (WINAPI *addReadRequest)(IHTMLOpsProfile *This,BSTR name,VARIANT reserved,VARIANT_BOOL *success);
      HRESULT (WINAPI *doReadRequest)(IHTMLOpsProfile *This,VARIANT usage,VARIANT fname,VARIANT domain,VARIANT path,VARIANT expire,VARIANT reserved);
      HRESULT (WINAPI *doWriteRequest)(IHTMLOpsProfile *This,VARIANT_BOOL *success);
    END_INTERFACE
  } IHTMLOpsProfileVtbl;
  interface IHTMLOpsProfile {
    CONST_VTBL struct IHTMLOpsProfileVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLOpsProfile_addRequest_Proxy(IHTMLOpsProfile *This,BSTR name,VARIANT reserved,VARIANT_BOOL *success);
  void __RPC_STUB IHTMLOpsProfile_addRequest_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOpsProfile_clearRequest_Proxy(IHTMLOpsProfile *This);
  void __RPC_STUB IHTMLOpsProfile_clearRequest_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOpsProfile_doRequest_Proxy(IHTMLOpsProfile *This,VARIANT usage,VARIANT fname,VARIANT domain,VARIANT path,VARIANT expire,VARIANT reserved);
  void __RPC_STUB IHTMLOpsProfile_doRequest_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOpsProfile_getAttribute_Proxy(IHTMLOpsProfile *This,BSTR name,BSTR *value);
  void __RPC_STUB IHTMLOpsProfile_getAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOpsProfile_setAttribute_Proxy(IHTMLOpsProfile *This,BSTR name,BSTR value,VARIANT prefs,VARIANT_BOOL *success);
  void __RPC_STUB IHTMLOpsProfile_setAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOpsProfile_commitChanges_Proxy(IHTMLOpsProfile *This,VARIANT_BOOL *success);
  void __RPC_STUB IHTMLOpsProfile_commitChanges_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOpsProfile_addReadRequest_Proxy(IHTMLOpsProfile *This,BSTR name,VARIANT reserved,VARIANT_BOOL *success);
  void __RPC_STUB IHTMLOpsProfile_addReadRequest_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOpsProfile_doReadRequest_Proxy(IHTMLOpsProfile *This,VARIANT usage,VARIANT fname,VARIANT domain,VARIANT path,VARIANT expire,VARIANT reserved);
  void __RPC_STUB IHTMLOpsProfile_doReadRequest_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLOpsProfile_doWriteRequest_Proxy(IHTMLOpsProfile *This,VARIANT_BOOL *success);
  void __RPC_STUB IHTMLOpsProfile_doWriteRequest_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IOmNavigator_INTERFACE_DEFINED__
#define __IOmNavigator_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IOmNavigator;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IOmNavigator : public IDispatch {
  public:
    virtual HRESULT WINAPI get_appCodeName(BSTR *p) = 0;
    virtual HRESULT WINAPI get_appName(BSTR *p) = 0;
    virtual HRESULT WINAPI get_appVersion(BSTR *p) = 0;
    virtual HRESULT WINAPI get_userAgent(BSTR *p) = 0;
    virtual HRESULT WINAPI javaEnabled(VARIANT_BOOL *enabled) = 0;
    virtual HRESULT WINAPI taintEnabled(VARIANT_BOOL *enabled) = 0;
    virtual HRESULT WINAPI get_mimeTypes(IHTMLMimeTypesCollection **p) = 0;
    virtual HRESULT WINAPI get_plugins(IHTMLPluginsCollection **p) = 0;
    virtual HRESULT WINAPI get_cookieEnabled(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_opsProfile(IHTMLOpsProfile **p) = 0;
    virtual HRESULT WINAPI toString(BSTR *string) = 0;
    virtual HRESULT WINAPI get_cpuClass(BSTR *p) = 0;
    virtual HRESULT WINAPI get_systemLanguage(BSTR *p) = 0;
    virtual HRESULT WINAPI get_browserLanguage(BSTR *p) = 0;
    virtual HRESULT WINAPI get_userLanguage(BSTR *p) = 0;
    virtual HRESULT WINAPI get_platform(BSTR *p) = 0;
    virtual HRESULT WINAPI get_appMinorVersion(BSTR *p) = 0;
    virtual HRESULT WINAPI get_connectionSpeed(long *p) = 0;
    virtual HRESULT WINAPI get_onLine(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_userProfile(IHTMLOpsProfile **p) = 0;
  };
#else
  typedef struct IOmNavigatorVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IOmNavigator *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IOmNavigator *This);
      ULONG (WINAPI *Release)(IOmNavigator *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IOmNavigator *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IOmNavigator *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IOmNavigator *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IOmNavigator *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_appCodeName)(IOmNavigator *This,BSTR *p);
      HRESULT (WINAPI *get_appName)(IOmNavigator *This,BSTR *p);
      HRESULT (WINAPI *get_appVersion)(IOmNavigator *This,BSTR *p);
      HRESULT (WINAPI *get_userAgent)(IOmNavigator *This,BSTR *p);
      HRESULT (WINAPI *javaEnabled)(IOmNavigator *This,VARIANT_BOOL *enabled);
      HRESULT (WINAPI *taintEnabled)(IOmNavigator *This,VARIANT_BOOL *enabled);
      HRESULT (WINAPI *get_mimeTypes)(IOmNavigator *This,IHTMLMimeTypesCollection **p);
      HRESULT (WINAPI *get_plugins)(IOmNavigator *This,IHTMLPluginsCollection **p);
      HRESULT (WINAPI *get_cookieEnabled)(IOmNavigator *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_opsProfile)(IOmNavigator *This,IHTMLOpsProfile **p);
      HRESULT (WINAPI *toString)(IOmNavigator *This,BSTR *string);
      HRESULT (WINAPI *get_cpuClass)(IOmNavigator *This,BSTR *p);
      HRESULT (WINAPI *get_systemLanguage)(IOmNavigator *This,BSTR *p);
      HRESULT (WINAPI *get_browserLanguage)(IOmNavigator *This,BSTR *p);
      HRESULT (WINAPI *get_userLanguage)(IOmNavigator *This,BSTR *p);
      HRESULT (WINAPI *get_platform)(IOmNavigator *This,BSTR *p);
      HRESULT (WINAPI *get_appMinorVersion)(IOmNavigator *This,BSTR *p);
      HRESULT (WINAPI *get_connectionSpeed)(IOmNavigator *This,long *p);
      HRESULT (WINAPI *get_onLine)(IOmNavigator *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_userProfile)(IOmNavigator *This,IHTMLOpsProfile **p);
    END_INTERFACE
  } IOmNavigatorVtbl;
  interface IOmNavigator {
    CONST_VTBL struct IOmNavigatorVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IOmNavigator_get_appCodeName_Proxy(IOmNavigator *This,BSTR *p);
  void __RPC_STUB IOmNavigator_get_appCodeName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_appName_Proxy(IOmNavigator *This,BSTR *p);
  void __RPC_STUB IOmNavigator_get_appName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_appVersion_Proxy(IOmNavigator *This,BSTR *p);
  void __RPC_STUB IOmNavigator_get_appVersion_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_userAgent_Proxy(IOmNavigator *This,BSTR *p);
  void __RPC_STUB IOmNavigator_get_userAgent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_javaEnabled_Proxy(IOmNavigator *This,VARIANT_BOOL *enabled);
  void __RPC_STUB IOmNavigator_javaEnabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_taintEnabled_Proxy(IOmNavigator *This,VARIANT_BOOL *enabled);
  void __RPC_STUB IOmNavigator_taintEnabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_mimeTypes_Proxy(IOmNavigator *This,IHTMLMimeTypesCollection **p);
  void __RPC_STUB IOmNavigator_get_mimeTypes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_plugins_Proxy(IOmNavigator *This,IHTMLPluginsCollection **p);
  void __RPC_STUB IOmNavigator_get_plugins_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_cookieEnabled_Proxy(IOmNavigator *This,VARIANT_BOOL *p);
  void __RPC_STUB IOmNavigator_get_cookieEnabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_opsProfile_Proxy(IOmNavigator *This,IHTMLOpsProfile **p);
  void __RPC_STUB IOmNavigator_get_opsProfile_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_toString_Proxy(IOmNavigator *This,BSTR *string);
  void __RPC_STUB IOmNavigator_toString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_cpuClass_Proxy(IOmNavigator *This,BSTR *p);
  void __RPC_STUB IOmNavigator_get_cpuClass_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_systemLanguage_Proxy(IOmNavigator *This,BSTR *p);
  void __RPC_STUB IOmNavigator_get_systemLanguage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_browserLanguage_Proxy(IOmNavigator *This,BSTR *p);
  void __RPC_STUB IOmNavigator_get_browserLanguage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_userLanguage_Proxy(IOmNavigator *This,BSTR *p);
  void __RPC_STUB IOmNavigator_get_userLanguage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_platform_Proxy(IOmNavigator *This,BSTR *p);
  void __RPC_STUB IOmNavigator_get_platform_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_appMinorVersion_Proxy(IOmNavigator *This,BSTR *p);
  void __RPC_STUB IOmNavigator_get_appMinorVersion_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_connectionSpeed_Proxy(IOmNavigator *This,long *p);
  void __RPC_STUB IOmNavigator_get_connectionSpeed_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_onLine_Proxy(IOmNavigator *This,VARIANT_BOOL *p);
  void __RPC_STUB IOmNavigator_get_onLine_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IOmNavigator_get_userProfile_Proxy(IOmNavigator *This,IHTMLOpsProfile **p);
  void __RPC_STUB IOmNavigator_get_userProfile_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLLocation_INTERFACE_DEFINED__
#define __IHTMLLocation_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLLocation;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLLocation : public IDispatch {
  public:
    virtual HRESULT WINAPI put_href(BSTR v) = 0;
    virtual HRESULT WINAPI get_href(BSTR *p) = 0;
    virtual HRESULT WINAPI put_protocol(BSTR v) = 0;
    virtual HRESULT WINAPI get_protocol(BSTR *p) = 0;
    virtual HRESULT WINAPI put_host(BSTR v) = 0;
    virtual HRESULT WINAPI get_host(BSTR *p) = 0;
    virtual HRESULT WINAPI put_hostname(BSTR v) = 0;
    virtual HRESULT WINAPI get_hostname(BSTR *p) = 0;
    virtual HRESULT WINAPI put_port(BSTR v) = 0;
    virtual HRESULT WINAPI get_port(BSTR *p) = 0;
    virtual HRESULT WINAPI put_pathname(BSTR v) = 0;
    virtual HRESULT WINAPI get_pathname(BSTR *p) = 0;
    virtual HRESULT WINAPI put_search(BSTR v) = 0;
    virtual HRESULT WINAPI get_search(BSTR *p) = 0;
    virtual HRESULT WINAPI put_hash(BSTR v) = 0;
    virtual HRESULT WINAPI get_hash(BSTR *p) = 0;
    virtual HRESULT WINAPI reload(VARIANT_BOOL flag = 0) = 0;
    virtual HRESULT WINAPI replace(BSTR bstr) = 0;
    virtual HRESULT WINAPI assign(BSTR bstr) = 0;
    virtual HRESULT WINAPI toString(BSTR *string) = 0;
  };
#else
  typedef struct IHTMLLocationVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLLocation *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLLocation *This);
      ULONG (WINAPI *Release)(IHTMLLocation *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLLocation *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLLocation *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLLocation *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLLocation *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_href)(IHTMLLocation *This,BSTR v);
      HRESULT (WINAPI *get_href)(IHTMLLocation *This,BSTR *p);
      HRESULT (WINAPI *put_protocol)(IHTMLLocation *This,BSTR v);
      HRESULT (WINAPI *get_protocol)(IHTMLLocation *This,BSTR *p);
      HRESULT (WINAPI *put_host)(IHTMLLocation *This,BSTR v);
      HRESULT (WINAPI *get_host)(IHTMLLocation *This,BSTR *p);
      HRESULT (WINAPI *put_hostname)(IHTMLLocation *This,BSTR v);
      HRESULT (WINAPI *get_hostname)(IHTMLLocation *This,BSTR *p);
      HRESULT (WINAPI *put_port)(IHTMLLocation *This,BSTR v);
      HRESULT (WINAPI *get_port)(IHTMLLocation *This,BSTR *p);
      HRESULT (WINAPI *put_pathname)(IHTMLLocation *This,BSTR v);
      HRESULT (WINAPI *get_pathname)(IHTMLLocation *This,BSTR *p);
      HRESULT (WINAPI *put_search)(IHTMLLocation *This,BSTR v);
      HRESULT (WINAPI *get_search)(IHTMLLocation *This,BSTR *p);
      HRESULT (WINAPI *put_hash)(IHTMLLocation *This,BSTR v);
      HRESULT (WINAPI *get_hash)(IHTMLLocation *This,BSTR *p);
      HRESULT (WINAPI *reload)(IHTMLLocation *This,VARIANT_BOOL flag);
      HRESULT (WINAPI *replace)(IHTMLLocation *This,BSTR bstr);
      HRESULT (WINAPI *assign)(IHTMLLocation *This,BSTR bstr);
      HRESULT (WINAPI *toString)(IHTMLLocation *This,BSTR *string);
    END_INTERFACE
  } IHTMLLocationVtbl;
  interface IHTMLLocation {
    CONST_VTBL struct IHTMLLocationVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLLocation_put_href_Proxy(IHTMLLocation *This,BSTR v);
  void __RPC_STUB IHTMLLocation_put_href_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_get_href_Proxy(IHTMLLocation *This,BSTR *p);
  void __RPC_STUB IHTMLLocation_get_href_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_put_protocol_Proxy(IHTMLLocation *This,BSTR v);
  void __RPC_STUB IHTMLLocation_put_protocol_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_get_protocol_Proxy(IHTMLLocation *This,BSTR *p);
  void __RPC_STUB IHTMLLocation_get_protocol_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_put_host_Proxy(IHTMLLocation *This,BSTR v);
  void __RPC_STUB IHTMLLocation_put_host_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_get_host_Proxy(IHTMLLocation *This,BSTR *p);
  void __RPC_STUB IHTMLLocation_get_host_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_put_hostname_Proxy(IHTMLLocation *This,BSTR v);
  void __RPC_STUB IHTMLLocation_put_hostname_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_get_hostname_Proxy(IHTMLLocation *This,BSTR *p);
  void __RPC_STUB IHTMLLocation_get_hostname_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_put_port_Proxy(IHTMLLocation *This,BSTR v);
  void __RPC_STUB IHTMLLocation_put_port_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_get_port_Proxy(IHTMLLocation *This,BSTR *p);
  void __RPC_STUB IHTMLLocation_get_port_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_put_pathname_Proxy(IHTMLLocation *This,BSTR v);
  void __RPC_STUB IHTMLLocation_put_pathname_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_get_pathname_Proxy(IHTMLLocation *This,BSTR *p);
  void __RPC_STUB IHTMLLocation_get_pathname_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_put_search_Proxy(IHTMLLocation *This,BSTR v);
  void __RPC_STUB IHTMLLocation_put_search_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_get_search_Proxy(IHTMLLocation *This,BSTR *p);
  void __RPC_STUB IHTMLLocation_get_search_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_put_hash_Proxy(IHTMLLocation *This,BSTR v);
  void __RPC_STUB IHTMLLocation_put_hash_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_get_hash_Proxy(IHTMLLocation *This,BSTR *p);
  void __RPC_STUB IHTMLLocation_get_hash_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_reload_Proxy(IHTMLLocation *This,VARIANT_BOOL flag);
  void __RPC_STUB IHTMLLocation_reload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_replace_Proxy(IHTMLLocation *This,BSTR bstr);
  void __RPC_STUB IHTMLLocation_replace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_assign_Proxy(IHTMLLocation *This,BSTR bstr);
  void __RPC_STUB IHTMLLocation_assign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLLocation_toString_Proxy(IHTMLLocation *This,BSTR *string);
  void __RPC_STUB IHTMLLocation_toString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif
  EXTERN_C const CLSID CLSID_HTMLHistory;
#ifdef __cplusplus
  class HTMLHistory;
#endif
  EXTERN_C const CLSID CLSID_CMimeTypes;
#ifdef __cplusplus
  class CMimeTypes;
#endif
  EXTERN_C const CLSID CLSID_CPlugins;
#ifdef __cplusplus
  class CPlugins;
#endif
  EXTERN_C const CLSID CLSID_COpsProfile;
#ifdef __cplusplus
  class COpsProfile;
#endif
  EXTERN_C const CLSID CLSID_HTMLNavigator;
#ifdef __cplusplus
  class HTMLNavigator;
#endif
  EXTERN_C const CLSID CLSID_HTMLLocation;
#ifdef __cplusplus
  class HTMLLocation;
#endif

#ifndef __IHTMLBookmarkCollection_INTERFACE_DEFINED__
#define __IHTMLBookmarkCollection_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLBookmarkCollection;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLBookmarkCollection : public IDispatch {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;
    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;
    virtual HRESULT WINAPI item(long index,VARIANT *pVarBookmark) = 0;
  };
#else
  typedef struct IHTMLBookmarkCollectionVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLBookmarkCollection *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLBookmarkCollection *This);
      ULONG (WINAPI *Release)(IHTMLBookmarkCollection *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLBookmarkCollection *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLBookmarkCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLBookmarkCollection *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLBookmarkCollection *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_length)(IHTMLBookmarkCollection *This,long *p);
      HRESULT (WINAPI *get__newEnum)(IHTMLBookmarkCollection *This,IUnknown **p);
      HRESULT (WINAPI *item)(IHTMLBookmarkCollection *This,long index,VARIANT *pVarBookmark);
    END_INTERFACE
  } IHTMLBookmarkCollectionVtbl;
  interface IHTMLBookmarkCollection {
    CONST_VTBL struct IHTMLBookmarkCollectionVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLBookmarkCollection_get_length_Proxy(IHTMLBookmarkCollection *This,long *p);
  void __RPC_STUB IHTMLBookmarkCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBookmarkCollection_get__newEnum_Proxy(IHTMLBookmarkCollection *This,IUnknown **p);
  void __RPC_STUB IHTMLBookmarkCollection_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLBookmarkCollection_item_Proxy(IHTMLBookmarkCollection *This,long index,VARIANT *pVarBookmark);
  void __RPC_STUB IHTMLBookmarkCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDataTransfer_INTERFACE_DEFINED__
#define __IHTMLDataTransfer_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDataTransfer;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDataTransfer : public IDispatch {
  public:
    virtual HRESULT WINAPI setData(BSTR format,VARIANT *data,VARIANT_BOOL *pret) = 0;
    virtual HRESULT WINAPI getData(BSTR format,VARIANT *pvarRet) = 0;
    virtual HRESULT WINAPI clearData(BSTR format,VARIANT_BOOL *pret) = 0;
    virtual HRESULT WINAPI put_dropEffect(BSTR v) = 0;
    virtual HRESULT WINAPI get_dropEffect(BSTR *p) = 0;
    virtual HRESULT WINAPI put_effectAllowed(BSTR v) = 0;
    virtual HRESULT WINAPI get_effectAllowed(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLDataTransferVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDataTransfer *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDataTransfer *This);
      ULONG (WINAPI *Release)(IHTMLDataTransfer *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDataTransfer *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDataTransfer *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDataTransfer *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDataTransfer *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *setData)(IHTMLDataTransfer *This,BSTR format,VARIANT *data,VARIANT_BOOL *pret);
      HRESULT (WINAPI *getData)(IHTMLDataTransfer *This,BSTR format,VARIANT *pvarRet);
      HRESULT (WINAPI *clearData)(IHTMLDataTransfer *This,BSTR format,VARIANT_BOOL *pret);
      HRESULT (WINAPI *put_dropEffect)(IHTMLDataTransfer *This,BSTR v);
      HRESULT (WINAPI *get_dropEffect)(IHTMLDataTransfer *This,BSTR *p);
      HRESULT (WINAPI *put_effectAllowed)(IHTMLDataTransfer *This,BSTR v);
      HRESULT (WINAPI *get_effectAllowed)(IHTMLDataTransfer *This,BSTR *p);
    END_INTERFACE
  } IHTMLDataTransferVtbl;
  interface IHTMLDataTransfer {
    CONST_VTBL struct IHTMLDataTransferVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLDataTransfer_setData_Proxy(IHTMLDataTransfer *This,BSTR format,VARIANT *data,VARIANT_BOOL *pret);
  void __RPC_STUB IHTMLDataTransfer_setData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDataTransfer_getData_Proxy(IHTMLDataTransfer *This,BSTR format,VARIANT *pvarRet);
  void __RPC_STUB IHTMLDataTransfer_getData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDataTransfer_clearData_Proxy(IHTMLDataTransfer *This,BSTR format,VARIANT_BOOL *pret);
  void __RPC_STUB IHTMLDataTransfer_clearData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDataTransfer_put_dropEffect_Proxy(IHTMLDataTransfer *This,BSTR v);
  void __RPC_STUB IHTMLDataTransfer_put_dropEffect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDataTransfer_get_dropEffect_Proxy(IHTMLDataTransfer *This,BSTR *p);
  void __RPC_STUB IHTMLDataTransfer_get_dropEffect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDataTransfer_put_effectAllowed_Proxy(IHTMLDataTransfer *This,BSTR v);
  void __RPC_STUB IHTMLDataTransfer_put_effectAllowed_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDataTransfer_get_effectAllowed_Proxy(IHTMLDataTransfer *This,BSTR *p);
  void __RPC_STUB IHTMLDataTransfer_get_effectAllowed_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLEventObj2_INTERFACE_DEFINED__
#define __IHTMLEventObj2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLEventObj2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLEventObj2 : public IDispatch {
  public:
    virtual HRESULT WINAPI setAttribute(BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags = 1) = 0;
    virtual HRESULT WINAPI getAttribute(BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue) = 0;
    virtual HRESULT WINAPI removeAttribute(BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess) = 0;
    virtual HRESULT WINAPI put_propertyName(BSTR v) = 0;
    virtual HRESULT WINAPI get_propertyName(BSTR *p) = 0;
    virtual HRESULT WINAPI putref_bookmarks(IHTMLBookmarkCollection *v) = 0;
    virtual HRESULT WINAPI get_bookmarks(IHTMLBookmarkCollection **p) = 0;
    virtual HRESULT WINAPI putref_recordset(IDispatch *v) = 0;
    virtual HRESULT WINAPI get_recordset(IDispatch **p) = 0;
    virtual HRESULT WINAPI put_dataFld(BSTR v) = 0;
    virtual HRESULT WINAPI get_dataFld(BSTR *p) = 0;
    virtual HRESULT WINAPI putref_boundElements(IHTMLElementCollection *v) = 0;
    virtual HRESULT WINAPI get_boundElements(IHTMLElementCollection **p) = 0;
    virtual HRESULT WINAPI put_repeat(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_repeat(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_srcUrn(BSTR v) = 0;
    virtual HRESULT WINAPI get_srcUrn(BSTR *p) = 0;
    virtual HRESULT WINAPI putref_srcElement(IHTMLElement *v) = 0;
    virtual HRESULT WINAPI get_srcElement(IHTMLElement **p) = 0;
    virtual HRESULT WINAPI put_altKey(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_altKey(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_ctrlKey(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_ctrlKey(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_shiftKey(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_shiftKey(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI putref_fromElement(IHTMLElement *v) = 0;
    virtual HRESULT WINAPI get_fromElement(IHTMLElement **p) = 0;
    virtual HRESULT WINAPI putref_toElement(IHTMLElement *v) = 0;
    virtual HRESULT WINAPI get_toElement(IHTMLElement **p) = 0;
    virtual HRESULT WINAPI put_button(long v) = 0;
    virtual HRESULT WINAPI get_button(long *p) = 0;
    virtual HRESULT WINAPI put_type(BSTR v) = 0;
    virtual HRESULT WINAPI get_type(BSTR *p) = 0;
    virtual HRESULT WINAPI put_qualifier(BSTR v) = 0;
    virtual HRESULT WINAPI get_qualifier(BSTR *p) = 0;
    virtual HRESULT WINAPI put_reason(long v) = 0;
    virtual HRESULT WINAPI get_reason(long *p) = 0;
    virtual HRESULT WINAPI put_x(long v) = 0;
    virtual HRESULT WINAPI get_x(long *p) = 0;
    virtual HRESULT WINAPI put_y(long v) = 0;
    virtual HRESULT WINAPI get_y(long *p) = 0;
    virtual HRESULT WINAPI put_clientX(long v) = 0;
    virtual HRESULT WINAPI get_clientX(long *p) = 0;
    virtual HRESULT WINAPI put_clientY(long v) = 0;
    virtual HRESULT WINAPI get_clientY(long *p) = 0;
    virtual HRESULT WINAPI put_offsetX(long v) = 0;
    virtual HRESULT WINAPI get_offsetX(long *p) = 0;
    virtual HRESULT WINAPI put_offsetY(long v) = 0;
    virtual HRESULT WINAPI get_offsetY(long *p) = 0;
    virtual HRESULT WINAPI put_screenX(long v) = 0;
    virtual HRESULT WINAPI get_screenX(long *p) = 0;
    virtual HRESULT WINAPI put_screenY(long v) = 0;
    virtual HRESULT WINAPI get_screenY(long *p) = 0;
    virtual HRESULT WINAPI putref_srcFilter(IDispatch *v) = 0;
    virtual HRESULT WINAPI get_srcFilter(IDispatch **p) = 0;
    virtual HRESULT WINAPI get_dataTransfer(IHTMLDataTransfer **p) = 0;
  };
#else
  typedef struct IHTMLEventObj2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLEventObj2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLEventObj2 *This);
      ULONG (WINAPI *Release)(IHTMLEventObj2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLEventObj2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLEventObj2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLEventObj2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLEventObj2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *setAttribute)(IHTMLEventObj2 *This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags);
      HRESULT (WINAPI *getAttribute)(IHTMLEventObj2 *This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue);
      HRESULT (WINAPI *removeAttribute)(IHTMLEventObj2 *This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess);
      HRESULT (WINAPI *put_propertyName)(IHTMLEventObj2 *This,BSTR v);
      HRESULT (WINAPI *get_propertyName)(IHTMLEventObj2 *This,BSTR *p);
      HRESULT (WINAPI *putref_bookmarks)(IHTMLEventObj2 *This,IHTMLBookmarkCollection *v);
      HRESULT (WINAPI *get_bookmarks)(IHTMLEventObj2 *This,IHTMLBookmarkCollection **p);
      HRESULT (WINAPI *putref_recordset)(IHTMLEventObj2 *This,IDispatch *v);
      HRESULT (WINAPI *get_recordset)(IHTMLEventObj2 *This,IDispatch **p);
      HRESULT (WINAPI *put_dataFld)(IHTMLEventObj2 *This,BSTR v);
      HRESULT (WINAPI *get_dataFld)(IHTMLEventObj2 *This,BSTR *p);
      HRESULT (WINAPI *putref_boundElements)(IHTMLEventObj2 *This,IHTMLElementCollection *v);
      HRESULT (WINAPI *get_boundElements)(IHTMLEventObj2 *This,IHTMLElementCollection **p);
      HRESULT (WINAPI *put_repeat)(IHTMLEventObj2 *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_repeat)(IHTMLEventObj2 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_srcUrn)(IHTMLEventObj2 *This,BSTR v);
      HRESULT (WINAPI *get_srcUrn)(IHTMLEventObj2 *This,BSTR *p);
      HRESULT (WINAPI *putref_srcElement)(IHTMLEventObj2 *This,IHTMLElement *v);
      HRESULT (WINAPI *get_srcElement)(IHTMLEventObj2 *This,IHTMLElement **p);
      HRESULT (WINAPI *put_altKey)(IHTMLEventObj2 *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_altKey)(IHTMLEventObj2 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_ctrlKey)(IHTMLEventObj2 *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_ctrlKey)(IHTMLEventObj2 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_shiftKey)(IHTMLEventObj2 *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_shiftKey)(IHTMLEventObj2 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *putref_fromElement)(IHTMLEventObj2 *This,IHTMLElement *v);
      HRESULT (WINAPI *get_fromElement)(IHTMLEventObj2 *This,IHTMLElement **p);
      HRESULT (WINAPI *putref_toElement)(IHTMLEventObj2 *This,IHTMLElement *v);
      HRESULT (WINAPI *get_toElement)(IHTMLEventObj2 *This,IHTMLElement **p);
      HRESULT (WINAPI *put_button)(IHTMLEventObj2 *This,long v);
      HRESULT (WINAPI *get_button)(IHTMLEventObj2 *This,long *p);
      HRESULT (WINAPI *put_type)(IHTMLEventObj2 *This,BSTR v);
      HRESULT (WINAPI *get_type)(IHTMLEventObj2 *This,BSTR *p);
      HRESULT (WINAPI *put_qualifier)(IHTMLEventObj2 *This,BSTR v);
      HRESULT (WINAPI *get_qualifier)(IHTMLEventObj2 *This,BSTR *p);
      HRESULT (WINAPI *put_reason)(IHTMLEventObj2 *This,long v);
      HRESULT (WINAPI *get_reason)(IHTMLEventObj2 *This,long *p);
      HRESULT (WINAPI *put_x)(IHTMLEventObj2 *This,long v);
      HRESULT (WINAPI *get_x)(IHTMLEventObj2 *This,long *p);
      HRESULT (WINAPI *put_y)(IHTMLEventObj2 *This,long v);
      HRESULT (WINAPI *get_y)(IHTMLEventObj2 *This,long *p);
      HRESULT (WINAPI *put_clientX)(IHTMLEventObj2 *This,long v);
      HRESULT (WINAPI *get_clientX)(IHTMLEventObj2 *This,long *p);
      HRESULT (WINAPI *put_clientY)(IHTMLEventObj2 *This,long v);
      HRESULT (WINAPI *get_clientY)(IHTMLEventObj2 *This,long *p);
      HRESULT (WINAPI *put_offsetX)(IHTMLEventObj2 *This,long v);
      HRESULT (WINAPI *get_offsetX)(IHTMLEventObj2 *This,long *p);
      HRESULT (WINAPI *put_offsetY)(IHTMLEventObj2 *This,long v);
      HRESULT (WINAPI *get_offsetY)(IHTMLEventObj2 *This,long *p);
      HRESULT (WINAPI *put_screenX)(IHTMLEventObj2 *This,long v);
      HRESULT (WINAPI *get_screenX)(IHTMLEventObj2 *This,long *p);
      HRESULT (WINAPI *put_screenY)(IHTMLEventObj2 *This,long v);
      HRESULT (WINAPI *get_screenY)(IHTMLEventObj2 *This,long *p);
      HRESULT (WINAPI *putref_srcFilter)(IHTMLEventObj2 *This,IDispatch *v);
      HRESULT (WINAPI *get_srcFilter)(IHTMLEventObj2 *This,IDispatch **p);
      HRESULT (WINAPI *get_dataTransfer)(IHTMLEventObj2 *This,IHTMLDataTransfer **p);
    END_INTERFACE
  } IHTMLEventObj2Vtbl;
  interface IHTMLEventObj2 {
    CONST_VTBL struct IHTMLEventObj2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLEventObj2_setAttribute_Proxy(IHTMLEventObj2 *This,BSTR strAttributeName,VARIANT AttributeValue,LONG lFlags);
  void __RPC_STUB IHTMLEventObj2_setAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_getAttribute_Proxy(IHTMLEventObj2 *This,BSTR strAttributeName,LONG lFlags,VARIANT *AttributeValue);
  void __RPC_STUB IHTMLEventObj2_getAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_removeAttribute_Proxy(IHTMLEventObj2 *This,BSTR strAttributeName,LONG lFlags,VARIANT_BOOL *pfSuccess);
  void __RPC_STUB IHTMLEventObj2_removeAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_propertyName_Proxy(IHTMLEventObj2 *This,BSTR v);
  void __RPC_STUB IHTMLEventObj2_put_propertyName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_propertyName_Proxy(IHTMLEventObj2 *This,BSTR *p);
  void __RPC_STUB IHTMLEventObj2_get_propertyName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_putref_bookmarks_Proxy(IHTMLEventObj2 *This,IHTMLBookmarkCollection *v);
  void __RPC_STUB IHTMLEventObj2_putref_bookmarks_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_bookmarks_Proxy(IHTMLEventObj2 *This,IHTMLBookmarkCollection **p);
  void __RPC_STUB IHTMLEventObj2_get_bookmarks_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_putref_recordset_Proxy(IHTMLEventObj2 *This,IDispatch *v);
  void __RPC_STUB IHTMLEventObj2_putref_recordset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_recordset_Proxy(IHTMLEventObj2 *This,IDispatch **p);
  void __RPC_STUB IHTMLEventObj2_get_recordset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_dataFld_Proxy(IHTMLEventObj2 *This,BSTR v);
  void __RPC_STUB IHTMLEventObj2_put_dataFld_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_dataFld_Proxy(IHTMLEventObj2 *This,BSTR *p);
  void __RPC_STUB IHTMLEventObj2_get_dataFld_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_putref_boundElements_Proxy(IHTMLEventObj2 *This,IHTMLElementCollection *v);
  void __RPC_STUB IHTMLEventObj2_putref_boundElements_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_boundElements_Proxy(IHTMLEventObj2 *This,IHTMLElementCollection **p);
  void __RPC_STUB IHTMLEventObj2_get_boundElements_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_repeat_Proxy(IHTMLEventObj2 *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLEventObj2_put_repeat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_repeat_Proxy(IHTMLEventObj2 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLEventObj2_get_repeat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_srcUrn_Proxy(IHTMLEventObj2 *This,BSTR v);
  void __RPC_STUB IHTMLEventObj2_put_srcUrn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_srcUrn_Proxy(IHTMLEventObj2 *This,BSTR *p);
  void __RPC_STUB IHTMLEventObj2_get_srcUrn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_putref_srcElement_Proxy(IHTMLEventObj2 *This,IHTMLElement *v);
  void __RPC_STUB IHTMLEventObj2_putref_srcElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_srcElement_Proxy(IHTMLEventObj2 *This,IHTMLElement **p);
  void __RPC_STUB IHTMLEventObj2_get_srcElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_altKey_Proxy(IHTMLEventObj2 *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLEventObj2_put_altKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_altKey_Proxy(IHTMLEventObj2 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLEventObj2_get_altKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_ctrlKey_Proxy(IHTMLEventObj2 *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLEventObj2_put_ctrlKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_ctrlKey_Proxy(IHTMLEventObj2 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLEventObj2_get_ctrlKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_shiftKey_Proxy(IHTMLEventObj2 *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLEventObj2_put_shiftKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_shiftKey_Proxy(IHTMLEventObj2 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLEventObj2_get_shiftKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_putref_fromElement_Proxy(IHTMLEventObj2 *This,IHTMLElement *v);
  void __RPC_STUB IHTMLEventObj2_putref_fromElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_fromElement_Proxy(IHTMLEventObj2 *This,IHTMLElement **p);
  void __RPC_STUB IHTMLEventObj2_get_fromElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_putref_toElement_Proxy(IHTMLEventObj2 *This,IHTMLElement *v);
  void __RPC_STUB IHTMLEventObj2_putref_toElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_toElement_Proxy(IHTMLEventObj2 *This,IHTMLElement **p);
  void __RPC_STUB IHTMLEventObj2_get_toElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_button_Proxy(IHTMLEventObj2 *This,long v);
  void __RPC_STUB IHTMLEventObj2_put_button_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_button_Proxy(IHTMLEventObj2 *This,long *p);
  void __RPC_STUB IHTMLEventObj2_get_button_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_type_Proxy(IHTMLEventObj2 *This,BSTR v);
  void __RPC_STUB IHTMLEventObj2_put_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_type_Proxy(IHTMLEventObj2 *This,BSTR *p);
  void __RPC_STUB IHTMLEventObj2_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_qualifier_Proxy(IHTMLEventObj2 *This,BSTR v);
  void __RPC_STUB IHTMLEventObj2_put_qualifier_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_qualifier_Proxy(IHTMLEventObj2 *This,BSTR *p);
  void __RPC_STUB IHTMLEventObj2_get_qualifier_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_reason_Proxy(IHTMLEventObj2 *This,long v);
  void __RPC_STUB IHTMLEventObj2_put_reason_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_reason_Proxy(IHTMLEventObj2 *This,long *p);
  void __RPC_STUB IHTMLEventObj2_get_reason_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_x_Proxy(IHTMLEventObj2 *This,long v);
  void __RPC_STUB IHTMLEventObj2_put_x_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_x_Proxy(IHTMLEventObj2 *This,long *p);
  void __RPC_STUB IHTMLEventObj2_get_x_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_y_Proxy(IHTMLEventObj2 *This,long v);
  void __RPC_STUB IHTMLEventObj2_put_y_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_y_Proxy(IHTMLEventObj2 *This,long *p);
  void __RPC_STUB IHTMLEventObj2_get_y_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_clientX_Proxy(IHTMLEventObj2 *This,long v);
  void __RPC_STUB IHTMLEventObj2_put_clientX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_clientX_Proxy(IHTMLEventObj2 *This,long *p);
  void __RPC_STUB IHTMLEventObj2_get_clientX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_clientY_Proxy(IHTMLEventObj2 *This,long v);
  void __RPC_STUB IHTMLEventObj2_put_clientY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_clientY_Proxy(IHTMLEventObj2 *This,long *p);
  void __RPC_STUB IHTMLEventObj2_get_clientY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_offsetX_Proxy(IHTMLEventObj2 *This,long v);
  void __RPC_STUB IHTMLEventObj2_put_offsetX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_offsetX_Proxy(IHTMLEventObj2 *This,long *p);
  void __RPC_STUB IHTMLEventObj2_get_offsetX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_offsetY_Proxy(IHTMLEventObj2 *This,long v);
  void __RPC_STUB IHTMLEventObj2_put_offsetY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_offsetY_Proxy(IHTMLEventObj2 *This,long *p);
  void __RPC_STUB IHTMLEventObj2_get_offsetY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_screenX_Proxy(IHTMLEventObj2 *This,long v);
  void __RPC_STUB IHTMLEventObj2_put_screenX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_screenX_Proxy(IHTMLEventObj2 *This,long *p);
  void __RPC_STUB IHTMLEventObj2_get_screenX_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_put_screenY_Proxy(IHTMLEventObj2 *This,long v);
  void __RPC_STUB IHTMLEventObj2_put_screenY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_screenY_Proxy(IHTMLEventObj2 *This,long *p);
  void __RPC_STUB IHTMLEventObj2_get_screenY_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_putref_srcFilter_Proxy(IHTMLEventObj2 *This,IDispatch *v);
  void __RPC_STUB IHTMLEventObj2_putref_srcFilter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_srcFilter_Proxy(IHTMLEventObj2 *This,IDispatch **p);
  void __RPC_STUB IHTMLEventObj2_get_srcFilter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj2_get_dataTransfer_Proxy(IHTMLEventObj2 *This,IHTMLDataTransfer **p);
  void __RPC_STUB IHTMLEventObj2_get_dataTransfer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLEventObj3_INTERFACE_DEFINED__
#define __IHTMLEventObj3_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLEventObj3;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLEventObj3 : public IDispatch {
  public:
    virtual HRESULT WINAPI get_contentOverflow(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_shiftLeft(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_shiftLeft(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_altLeft(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_altLeft(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_ctrlLeft(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_ctrlLeft(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI get_imeCompositionChange(LONG_PTR *p) = 0;
    virtual HRESULT WINAPI get_imeNotifyCommand(LONG_PTR *p) = 0;
    virtual HRESULT WINAPI get_imeNotifyData(LONG_PTR *p) = 0;
    virtual HRESULT WINAPI get_imeRequest(LONG_PTR *p) = 0;
    virtual HRESULT WINAPI get_imeRequestData(LONG_PTR *p) = 0;
    virtual HRESULT WINAPI get_keyboardLayout(LONG_PTR *p) = 0;
    virtual HRESULT WINAPI get_behaviorCookie(long *p) = 0;
    virtual HRESULT WINAPI get_behaviorPart(long *p) = 0;
    virtual HRESULT WINAPI get_nextPage(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLEventObj3Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLEventObj3 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLEventObj3 *This);
      ULONG (WINAPI *Release)(IHTMLEventObj3 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLEventObj3 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLEventObj3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLEventObj3 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLEventObj3 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_contentOverflow)(IHTMLEventObj3 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_shiftLeft)(IHTMLEventObj3 *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_shiftLeft)(IHTMLEventObj3 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_altLeft)(IHTMLEventObj3 *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_altLeft)(IHTMLEventObj3 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_ctrlLeft)(IHTMLEventObj3 *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_ctrlLeft)(IHTMLEventObj3 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *get_imeCompositionChange)(IHTMLEventObj3 *This,LONG_PTR *p);
      HRESULT (WINAPI *get_imeNotifyCommand)(IHTMLEventObj3 *This,LONG_PTR *p);
      HRESULT (WINAPI *get_imeNotifyData)(IHTMLEventObj3 *This,LONG_PTR *p);
      HRESULT (WINAPI *get_imeRequest)(IHTMLEventObj3 *This,LONG_PTR *p);
      HRESULT (WINAPI *get_imeRequestData)(IHTMLEventObj3 *This,LONG_PTR *p);
      HRESULT (WINAPI *get_keyboardLayout)(IHTMLEventObj3 *This,LONG_PTR *p);
      HRESULT (WINAPI *get_behaviorCookie)(IHTMLEventObj3 *This,long *p);
      HRESULT (WINAPI *get_behaviorPart)(IHTMLEventObj3 *This,long *p);
      HRESULT (WINAPI *get_nextPage)(IHTMLEventObj3 *This,BSTR *p);
    END_INTERFACE
  } IHTMLEventObj3Vtbl;
  interface IHTMLEventObj3 {
    CONST_VTBL struct IHTMLEventObj3Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLEventObj3_get_contentOverflow_Proxy(IHTMLEventObj3 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLEventObj3_get_contentOverflow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_put_shiftLeft_Proxy(IHTMLEventObj3 *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLEventObj3_put_shiftLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_get_shiftLeft_Proxy(IHTMLEventObj3 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLEventObj3_get_shiftLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_put_altLeft_Proxy(IHTMLEventObj3 *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLEventObj3_put_altLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_get_altLeft_Proxy(IHTMLEventObj3 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLEventObj3_get_altLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_put_ctrlLeft_Proxy(IHTMLEventObj3 *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLEventObj3_put_ctrlLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_get_ctrlLeft_Proxy(IHTMLEventObj3 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLEventObj3_get_ctrlLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_get_imeCompositionChange_Proxy(IHTMLEventObj3 *This,LONG_PTR *p);
  void __RPC_STUB IHTMLEventObj3_get_imeCompositionChange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_get_imeNotifyCommand_Proxy(IHTMLEventObj3 *This,LONG_PTR *p);
  void __RPC_STUB IHTMLEventObj3_get_imeNotifyCommand_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_get_imeNotifyData_Proxy(IHTMLEventObj3 *This,LONG_PTR *p);
  void __RPC_STUB IHTMLEventObj3_get_imeNotifyData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_get_imeRequest_Proxy(IHTMLEventObj3 *This,LONG_PTR *p);
  void __RPC_STUB IHTMLEventObj3_get_imeRequest_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_get_imeRequestData_Proxy(IHTMLEventObj3 *This,LONG_PTR *p);
  void __RPC_STUB IHTMLEventObj3_get_imeRequestData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_get_keyboardLayout_Proxy(IHTMLEventObj3 *This,LONG_PTR *p);
  void __RPC_STUB IHTMLEventObj3_get_keyboardLayout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_get_behaviorCookie_Proxy(IHTMLEventObj3 *This,long *p);
  void __RPC_STUB IHTMLEventObj3_get_behaviorCookie_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_get_behaviorPart_Proxy(IHTMLEventObj3 *This,long *p);
  void __RPC_STUB IHTMLEventObj3_get_behaviorPart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLEventObj3_get_nextPage_Proxy(IHTMLEventObj3 *This,BSTR *p);
  void __RPC_STUB IHTMLEventObj3_get_nextPage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLEventObj4_INTERFACE_DEFINED__
#define __IHTMLEventObj4_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLEventObj4;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLEventObj4 : public IDispatch {
  public:
    virtual HRESULT WINAPI get_wheelDelta(long *p) = 0;
  };
#else
  typedef struct IHTMLEventObj4Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLEventObj4 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLEventObj4 *This);
      ULONG (WINAPI *Release)(IHTMLEventObj4 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLEventObj4 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLEventObj4 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLEventObj4 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLEventObj4 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_wheelDelta)(IHTMLEventObj4 *This,long *p);
    END_INTERFACE
  } IHTMLEventObj4Vtbl;
  interface IHTMLEventObj4 {
    CONST_VTBL struct IHTMLEventObj4Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLEventObj4_get_wheelDelta(This,p) (This)->lpVtbl->get_wheelDelta(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLEventObj4_get_wheelDelta_Proxy(IHTMLEventObj4 *This,long *p);
  void __RPC_STUB IHTMLEventObj4_get_wheelDelta_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispCEventObj_DISPINTERFACE_DEFINED__
#define __DispCEventObj_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_DispCEventObj;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispCEventObj : public IDispatch {
  };
#else
  typedef struct DispCEventObjVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(DispCEventObj *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(DispCEventObj *This);
      ULONG (WINAPI *Release)(DispCEventObj *This);
      HRESULT (WINAPI *GetTypeInfoCount)(DispCEventObj *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(DispCEventObj *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(DispCEventObj *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct DispCEventObjVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif
  EXTERN_C const CLSID CLSID_CEventObj;
#ifdef __cplusplus
  class CEventObj;
#endif

#ifndef __HTMLWindowEvents2_DISPINTERFACE_DEFINED__
#define __HTMLWindowEvents2_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLWindowEvents2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLWindowEvents2 : public IDispatch {
  };
#else
  typedef struct HTMLWindowEvents2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLWindowEvents2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLWindowEvents2 *This);
      ULONG (WINAPI *Release)(HTMLWindowEvents2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLWindowEvents2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLWindowEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLWindowEvents2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLWindowEvents2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __HTMLWindowEvents_DISPINTERFACE_DEFINED__
#define __HTMLWindowEvents_DISPINTERFACE_DEFINED__
  EXTERN_C const IID DIID_HTMLWindowEvents;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct HTMLWindowEvents : public IDispatch {
  };
#else
  typedef struct HTMLWindowEventsVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(HTMLWindowEvents *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(HTMLWindowEvents *This);
      ULONG (WINAPI *Release)(HTMLWindowEvents *This);
      HRESULT (WINAPI *GetTypeInfoCount)(HTMLWindowEvents *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(HTMLWindowEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(HTMLWindowEvents *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *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 struct HTMLWindowEventsVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#endif
#endif
#endif

#ifndef __IHTMLDocument2_INTERFACE_DEFINED__
#define __IHTMLDocument2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLDocument2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLDocument2 : public IHTMLDocument {
  public:
    virtual HRESULT WINAPI get_all(IHTMLElementCollection **p) = 0;
    virtual HRESULT WINAPI get_body(IHTMLElement **p) = 0;
    virtual HRESULT WINAPI get_activeElement(IHTMLElement **p) = 0;
    virtual HRESULT WINAPI get_images(IHTMLElementCollection **p) = 0;
    virtual HRESULT WINAPI get_applets(IHTMLElementCollection **p) = 0;
    virtual HRESULT WINAPI get_links(IHTMLElementCollection **p) = 0;
    virtual HRESULT WINAPI get_forms(IHTMLElementCollection **p) = 0;
    virtual HRESULT WINAPI get_anchors(IHTMLElementCollection **p) = 0;
    virtual HRESULT WINAPI put_title(BSTR v) = 0;
    virtual HRESULT WINAPI get_title(BSTR *p) = 0;
    virtual HRESULT WINAPI get_scripts(IHTMLElementCollection **p) = 0;
    virtual HRESULT WINAPI put_designMode(BSTR v) = 0;
    virtual HRESULT WINAPI get_designMode(BSTR *p) = 0;
    virtual HRESULT WINAPI get_selection(IHTMLSelectionObject **p) = 0;
    virtual HRESULT WINAPI get_readyState(BSTR *p) = 0;
    virtual HRESULT WINAPI get_frames(IHTMLFramesCollection2 **p) = 0;
    virtual HRESULT WINAPI get_embeds(IHTMLElementCollection **p) = 0;
    virtual HRESULT WINAPI get_plugins(IHTMLElementCollection **p) = 0;
    virtual HRESULT WINAPI put_alinkColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_alinkColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_bgColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_bgColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_fgColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_fgColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_linkColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_linkColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_vlinkColor(VARIANT v) = 0;
    virtual HRESULT WINAPI get_vlinkColor(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_referrer(BSTR *p) = 0;
    virtual HRESULT WINAPI get_location(IHTMLLocation **p) = 0;
    virtual HRESULT WINAPI get_lastModified(BSTR *p) = 0;
    virtual HRESULT WINAPI put_URL(BSTR v) = 0;
    virtual HRESULT WINAPI get_URL(BSTR *p) = 0;
    virtual HRESULT WINAPI put_domain(BSTR v) = 0;
    virtual HRESULT WINAPI get_domain(BSTR *p) = 0;
    virtual HRESULT WINAPI put_cookie(BSTR v) = 0;
    virtual HRESULT WINAPI get_cookie(BSTR *p) = 0;
    virtual HRESULT WINAPI put_expando(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_expando(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_charset(BSTR v) = 0;
    virtual HRESULT WINAPI get_charset(BSTR *p) = 0;
    virtual HRESULT WINAPI put_defaultCharset(BSTR v) = 0;
    virtual HRESULT WINAPI get_defaultCharset(BSTR *p) = 0;
    virtual HRESULT WINAPI get_mimeType(BSTR *p) = 0;
    virtual HRESULT WINAPI get_fileSize(BSTR *p) = 0;
    virtual HRESULT WINAPI get_fileCreatedDate(BSTR *p) = 0;
    virtual HRESULT WINAPI get_fileModifiedDate(BSTR *p) = 0;
    virtual HRESULT WINAPI get_fileUpdatedDate(BSTR *p) = 0;
    virtual HRESULT WINAPI get_security(BSTR *p) = 0;
    virtual HRESULT WINAPI get_protocol(BSTR *p) = 0;
    virtual HRESULT WINAPI get_nameProp(BSTR *p) = 0;
    virtual HRESULT WINAPI write(SAFEARRAY *psarray) = 0;
    virtual HRESULT WINAPI writeln(SAFEARRAY *psarray) = 0;
    virtual HRESULT WINAPI open(BSTR url,VARIANT name,VARIANT features,VARIANT replace,IDispatch **pomWindowResult) = 0;
    virtual HRESULT WINAPI close(void) = 0;
    virtual HRESULT WINAPI clear(void) = 0;
    virtual HRESULT WINAPI queryCommandSupported(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI queryCommandEnabled(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI queryCommandState(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI queryCommandIndeterm(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI queryCommandText(BSTR cmdID,BSTR *pcmdText) = 0;
    virtual HRESULT WINAPI queryCommandValue(BSTR cmdID,VARIANT *pcmdValue) = 0;
    virtual HRESULT WINAPI execCommand(BSTR cmdID,VARIANT_BOOL showUI,VARIANT value,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI execCommandShowHelp(BSTR cmdID,VARIANT_BOOL *pfRet) = 0;
    virtual HRESULT WINAPI createElement(BSTR eTag,IHTMLElement **newElem) = 0;
    virtual HRESULT WINAPI put_onhelp(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onhelp(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onclick(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onclick(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_ondblclick(VARIANT v) = 0;
    virtual HRESULT WINAPI get_ondblclick(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onkeyup(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onkeyup(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onkeydown(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onkeydown(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onkeypress(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onkeypress(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onmouseup(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmouseup(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onmousedown(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmousedown(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onmousemove(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmousemove(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onmouseout(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmouseout(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onmouseover(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onmouseover(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onreadystatechange(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onreadystatechange(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onafterupdate(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onafterupdate(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onrowexit(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onrowexit(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onrowenter(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onrowenter(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_ondragstart(VARIANT v) = 0;
    virtual HRESULT WINAPI get_ondragstart(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onselectstart(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onselectstart(VARIANT *p) = 0;
    virtual HRESULT WINAPI elementFromPoint(long x,long y,IHTMLElement **elementHit) = 0;
    virtual HRESULT WINAPI get_parentWindow(IHTMLWindow2 **p) = 0;
    virtual HRESULT WINAPI get_styleSheets(IHTMLStyleSheetsCollection **p) = 0;
    virtual HRESULT WINAPI put_onbeforeupdate(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onbeforeupdate(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onerrorupdate(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onerrorupdate(VARIANT *p) = 0;
    virtual HRESULT WINAPI toString(BSTR *String) = 0;
    virtual HRESULT WINAPI createStyleSheet(BSTR bstrHref,long lIndex,IHTMLStyleSheet **ppnewStyleSheet) = 0;
  };
#else
  typedef struct IHTMLDocument2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLDocument2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLDocument2 *This);
      ULONG (WINAPI *Release)(IHTMLDocument2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDocument2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLDocument2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLDocument2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLDocument2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_Script)(IHTMLDocument2 *This,IDispatch **p);
      HRESULT (WINAPI *get_all)(IHTMLDocument2 *This,IHTMLElementCollection **p);
      HRESULT (WINAPI *get_body)(IHTMLDocument2 *This,IHTMLElement **p);
      HRESULT (WINAPI *get_activeElement)(IHTMLDocument2 *This,IHTMLElement **p);
      HRESULT (WINAPI *get_images)(IHTMLDocument2 *This,IHTMLElementCollection **p);
      HRESULT (WINAPI *get_applets)(IHTMLDocument2 *This,IHTMLElementCollection **p);
      HRESULT (WINAPI *get_links)(IHTMLDocument2 *This,IHTMLElementCollection **p);
      HRESULT (WINAPI *get_forms)(IHTMLDocument2 *This,IHTMLElementCollection **p);
      HRESULT (WINAPI *get_anchors)(IHTMLDocument2 *This,IHTMLElementCollection **p);
      HRESULT (WINAPI *put_title)(IHTMLDocument2 *This,BSTR v);
      HRESULT (WINAPI *get_title)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *get_scripts)(IHTMLDocument2 *This,IHTMLElementCollection **p);
      HRESULT (WINAPI *put_designMode)(IHTMLDocument2 *This,BSTR v);
      HRESULT (WINAPI *get_designMode)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *get_selection)(IHTMLDocument2 *This,IHTMLSelectionObject **p);
      HRESULT (WINAPI *get_readyState)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *get_frames)(IHTMLDocument2 *This,IHTMLFramesCollection2 **p);
      HRESULT (WINAPI *get_embeds)(IHTMLDocument2 *This,IHTMLElementCollection **p);
      HRESULT (WINAPI *get_plugins)(IHTMLDocument2 *This,IHTMLElementCollection **p);
      HRESULT (WINAPI *put_alinkColor)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_alinkColor)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_bgColor)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_bgColor)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_fgColor)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_fgColor)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_linkColor)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_linkColor)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_vlinkColor)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_vlinkColor)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *get_referrer)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *get_location)(IHTMLDocument2 *This,IHTMLLocation **p);
      HRESULT (WINAPI *get_lastModified)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *put_URL)(IHTMLDocument2 *This,BSTR v);
      HRESULT (WINAPI *get_URL)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *put_domain)(IHTMLDocument2 *This,BSTR v);
      HRESULT (WINAPI *get_domain)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *put_cookie)(IHTMLDocument2 *This,BSTR v);
      HRESULT (WINAPI *get_cookie)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *put_expando)(IHTMLDocument2 *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_expando)(IHTMLDocument2 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_charset)(IHTMLDocument2 *This,BSTR v);
      HRESULT (WINAPI *get_charset)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *put_defaultCharset)(IHTMLDocument2 *This,BSTR v);
      HRESULT (WINAPI *get_defaultCharset)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *get_mimeType)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *get_fileSize)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *get_fileCreatedDate)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *get_fileModifiedDate)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *get_fileUpdatedDate)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *get_security)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *get_protocol)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *get_nameProp)(IHTMLDocument2 *This,BSTR *p);
      HRESULT (WINAPI *write)(IHTMLDocument2 *This,SAFEARRAY *psarray);
      HRESULT (WINAPI *writeln)(IHTMLDocument2 *This,SAFEARRAY *psarray);
      HRESULT (WINAPI *open)(IHTMLDocument2 *This,BSTR url,VARIANT name,VARIANT features,VARIANT replace,IDispatch **pomWindowResult);
      HRESULT (WINAPI *close)(IHTMLDocument2 *This);
      HRESULT (WINAPI *clear)(IHTMLDocument2 *This);
      HRESULT (WINAPI *queryCommandSupported)(IHTMLDocument2 *This,BSTR cmdID,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *queryCommandEnabled)(IHTMLDocument2 *This,BSTR cmdID,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *queryCommandState)(IHTMLDocument2 *This,BSTR cmdID,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *queryCommandIndeterm)(IHTMLDocument2 *This,BSTR cmdID,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *queryCommandText)(IHTMLDocument2 *This,BSTR cmdID,BSTR *pcmdText);
      HRESULT (WINAPI *queryCommandValue)(IHTMLDocument2 *This,BSTR cmdID,VARIANT *pcmdValue);
      HRESULT (WINAPI *execCommand)(IHTMLDocument2 *This,BSTR cmdID,VARIANT_BOOL showUI,VARIANT value,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *execCommandShowHelp)(IHTMLDocument2 *This,BSTR cmdID,VARIANT_BOOL *pfRet);
      HRESULT (WINAPI *createElement)(IHTMLDocument2 *This,BSTR eTag,IHTMLElement **newElem);
      HRESULT (WINAPI *put_onhelp)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onhelp)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onclick)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onclick)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_ondblclick)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_ondblclick)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onkeyup)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onkeyup)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onkeydown)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onkeydown)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onkeypress)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onkeypress)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onmouseup)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onmouseup)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onmousedown)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onmousedown)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onmousemove)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onmousemove)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onmouseout)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onmouseout)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onmouseover)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onmouseover)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onreadystatechange)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onreadystatechange)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onafterupdate)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onafterupdate)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onrowexit)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onrowexit)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onrowenter)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onrowenter)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_ondragstart)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_ondragstart)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onselectstart)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onselectstart)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *elementFromPoint)(IHTMLDocument2 *This,long x,long y,IHTMLElement **elementHit);
      HRESULT (WINAPI *get_parentWindow)(IHTMLDocument2 *This,IHTMLWindow2 **p);
      HRESULT (WINAPI *get_styleSheets)(IHTMLDocument2 *This,IHTMLStyleSheetsCollection **p);
      HRESULT (WINAPI *put_onbeforeupdate)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onbeforeupdate)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onerrorupdate)(IHTMLDocument2 *This,VARIANT v);
      HRESULT (WINAPI *get_onerrorupdate)(IHTMLDocument2 *This,VARIANT *p);
      HRESULT (WINAPI *toString)(IHTMLDocument2 *This,BSTR *String);
      HRESULT (WINAPI *createStyleSheet)(IHTMLDocument2 *This,BSTR bstrHref,long lIndex,IHTMLStyleSheet **ppnewStyleSheet);
    END_INTERFACE
  } IHTMLDocument2Vtbl;
  interface IHTMLDocument2 {
    CONST_VTBL struct IHTMLDocument2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLDocument2_get_Script(This,p) (This)->lpVtbl->get_Script(This,p)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLDocument2_get_all_Proxy(IHTMLDocument2 *This,IHTMLElementCollection **p);
  void __RPC_STUB IHTMLDocument2_get_all_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_body_Proxy(IHTMLDocument2 *This,IHTMLElement **p);
  void __RPC_STUB IHTMLDocument2_get_body_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_activeElement_Proxy(IHTMLDocument2 *This,IHTMLElement **p);
  void __RPC_STUB IHTMLDocument2_get_activeElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_images_Proxy(IHTMLDocument2 *This,IHTMLElementCollection **p);
  void __RPC_STUB IHTMLDocument2_get_images_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_applets_Proxy(IHTMLDocument2 *This,IHTMLElementCollection **p);
  void __RPC_STUB IHTMLDocument2_get_applets_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_links_Proxy(IHTMLDocument2 *This,IHTMLElementCollection **p);
  void __RPC_STUB IHTMLDocument2_get_links_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_forms_Proxy(IHTMLDocument2 *This,IHTMLElementCollection **p);
  void __RPC_STUB IHTMLDocument2_get_forms_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_anchors_Proxy(IHTMLDocument2 *This,IHTMLElementCollection **p);
  void __RPC_STUB IHTMLDocument2_get_anchors_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_title_Proxy(IHTMLDocument2 *This,BSTR v);
  void __RPC_STUB IHTMLDocument2_put_title_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_title_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_title_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_scripts_Proxy(IHTMLDocument2 *This,IHTMLElementCollection **p);
  void __RPC_STUB IHTMLDocument2_get_scripts_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_designMode_Proxy(IHTMLDocument2 *This,BSTR v);
  void __RPC_STUB IHTMLDocument2_put_designMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_designMode_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_designMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_selection_Proxy(IHTMLDocument2 *This,IHTMLSelectionObject **p);
  void __RPC_STUB IHTMLDocument2_get_selection_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_readyState_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_readyState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_frames_Proxy(IHTMLDocument2 *This,IHTMLFramesCollection2 **p);
  void __RPC_STUB IHTMLDocument2_get_frames_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_embeds_Proxy(IHTMLDocument2 *This,IHTMLElementCollection **p);
  void __RPC_STUB IHTMLDocument2_get_embeds_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_plugins_Proxy(IHTMLDocument2 *This,IHTMLElementCollection **p);
  void __RPC_STUB IHTMLDocument2_get_plugins_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_alinkColor_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_alinkColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_alinkColor_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_alinkColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_bgColor_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_bgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_bgColor_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_bgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_fgColor_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_fgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_fgColor_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_fgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_linkColor_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_linkColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_linkColor_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_linkColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_vlinkColor_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_vlinkColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_vlinkColor_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_vlinkColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_referrer_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_referrer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_location_Proxy(IHTMLDocument2 *This,IHTMLLocation **p);
  void __RPC_STUB IHTMLDocument2_get_location_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_lastModified_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_lastModified_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_URL_Proxy(IHTMLDocument2 *This,BSTR v);
  void __RPC_STUB IHTMLDocument2_put_URL_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_URL_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_URL_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_domain_Proxy(IHTMLDocument2 *This,BSTR v);
  void __RPC_STUB IHTMLDocument2_put_domain_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_domain_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_domain_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_cookie_Proxy(IHTMLDocument2 *This,BSTR v);
  void __RPC_STUB IHTMLDocument2_put_cookie_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_cookie_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_cookie_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_expando_Proxy(IHTMLDocument2 *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLDocument2_put_expando_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_expando_Proxy(IHTMLDocument2 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLDocument2_get_expando_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_charset_Proxy(IHTMLDocument2 *This,BSTR v);
  void __RPC_STUB IHTMLDocument2_put_charset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_charset_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_charset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_defaultCharset_Proxy(IHTMLDocument2 *This,BSTR v);
  void __RPC_STUB IHTMLDocument2_put_defaultCharset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_defaultCharset_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_defaultCharset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_mimeType_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_mimeType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_fileSize_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_fileSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_fileCreatedDate_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_fileCreatedDate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_fileModifiedDate_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_fileModifiedDate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_fileUpdatedDate_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_fileUpdatedDate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_security_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_security_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_protocol_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_protocol_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_nameProp_Proxy(IHTMLDocument2 *This,BSTR *p);
  void __RPC_STUB IHTMLDocument2_get_nameProp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_write_Proxy(IHTMLDocument2 *This,SAFEARRAY *psarray);
  void __RPC_STUB IHTMLDocument2_write_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_writeln_Proxy(IHTMLDocument2 *This,SAFEARRAY *psarray);
  void __RPC_STUB IHTMLDocument2_writeln_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_open_Proxy(IHTMLDocument2 *This,BSTR url,VARIANT name,VARIANT features,VARIANT replace,IDispatch **pomWindowResult);
  void __RPC_STUB IHTMLDocument2_open_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_close_Proxy(IHTMLDocument2 *This);
  void __RPC_STUB IHTMLDocument2_close_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_clear_Proxy(IHTMLDocument2 *This);
  void __RPC_STUB IHTMLDocument2_clear_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_queryCommandSupported_Proxy(IHTMLDocument2 *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLDocument2_queryCommandSupported_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_queryCommandEnabled_Proxy(IHTMLDocument2 *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLDocument2_queryCommandEnabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_queryCommandState_Proxy(IHTMLDocument2 *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLDocument2_queryCommandState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_queryCommandIndeterm_Proxy(IHTMLDocument2 *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLDocument2_queryCommandIndeterm_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_queryCommandText_Proxy(IHTMLDocument2 *This,BSTR cmdID,BSTR *pcmdText);
  void __RPC_STUB IHTMLDocument2_queryCommandText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_queryCommandValue_Proxy(IHTMLDocument2 *This,BSTR cmdID,VARIANT *pcmdValue);
  void __RPC_STUB IHTMLDocument2_queryCommandValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_execCommand_Proxy(IHTMLDocument2 *This,BSTR cmdID,VARIANT_BOOL showUI,VARIANT value,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLDocument2_execCommand_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_execCommandShowHelp_Proxy(IHTMLDocument2 *This,BSTR cmdID,VARIANT_BOOL *pfRet);
  void __RPC_STUB IHTMLDocument2_execCommandShowHelp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_createElement_Proxy(IHTMLDocument2 *This,BSTR eTag,IHTMLElement **newElem);
  void __RPC_STUB IHTMLDocument2_createElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onhelp_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onhelp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onhelp_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onhelp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onclick_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onclick_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onclick_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onclick_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_ondblclick_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_ondblclick_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_ondblclick_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_ondblclick_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onkeyup_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onkeyup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onkeyup_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onkeyup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onkeydown_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onkeydown_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onkeydown_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onkeydown_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onkeypress_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onkeypress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onkeypress_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onkeypress_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onmouseup_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onmouseup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onmouseup_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onmouseup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onmousedown_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onmousedown_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onmousedown_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onmousedown_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onmousemove_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onmousemove_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onmousemove_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onmousemove_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onmouseout_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onmouseout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onmouseout_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onmouseout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onmouseover_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onmouseover_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onmouseover_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onmouseover_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onreadystatechange_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onreadystatechange_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onafterupdate_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onafterupdate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onafterupdate_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onafterupdate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onrowexit_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onrowexit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onrowexit_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onrowexit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onrowenter_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onrowenter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onrowenter_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onrowenter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_ondragstart_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_ondragstart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_ondragstart_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_ondragstart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onselectstart_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onselectstart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onselectstart_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onselectstart_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_elementFromPoint_Proxy(IHTMLDocument2 *This,long x,long y,IHTMLElement **elementHit);
  void __RPC_STUB IHTMLDocument2_elementFromPoint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_parentWindow_Proxy(IHTMLDocument2 *This,IHTMLWindow2 **p);
  void __RPC_STUB IHTMLDocument2_get_parentWindow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_styleSheets_Proxy(IHTMLDocument2 *This,IHTMLStyleSheetsCollection **p);
  void __RPC_STUB IHTMLDocument2_get_styleSheets_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onbeforeupdate_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onbeforeupdate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onbeforeupdate_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onbeforeupdate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_put_onerrorupdate_Proxy(IHTMLDocument2 *This,VARIANT v);
  void __RPC_STUB IHTMLDocument2_put_onerrorupdate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_get_onerrorupdate_Proxy(IHTMLDocument2 *This,VARIANT *p);
  void __RPC_STUB IHTMLDocument2_get_onerrorupdate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_toString_Proxy(IHTMLDocument2 *This,BSTR *String);
  void __RPC_STUB IHTMLDocument2_toString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLDocument2_createStyleSheet_Proxy(IHTMLDocument2 *This,BSTR bstrHref,long lIndex,IHTMLStyleSheet **ppnewStyleSheet);
  void __RPC_STUB IHTMLDocument2_createStyleSheet_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLFramesCollection2_INTERFACE_DEFINED__
#define __IHTMLFramesCollection2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLFramesCollection2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLFramesCollection2 : public IDispatch {
  public:
    virtual HRESULT WINAPI item(VARIANT *pvarIndex,VARIANT *pvarResult) = 0;
    virtual HRESULT WINAPI get_length(long *p) = 0;
  };
#else
  typedef struct IHTMLFramesCollection2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLFramesCollection2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLFramesCollection2 *This);
      ULONG (WINAPI *Release)(IHTMLFramesCollection2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFramesCollection2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLFramesCollection2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLFramesCollection2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLFramesCollection2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *item)(IHTMLFramesCollection2 *This,VARIANT *pvarIndex,VARIANT *pvarResult);
      HRESULT (WINAPI *get_length)(IHTMLFramesCollection2 *This,long *p);
    END_INTERFACE
  } IHTMLFramesCollection2Vtbl;
  interface IHTMLFramesCollection2 {
    CONST_VTBL struct IHTMLFramesCollection2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLFramesCollection2_item(This,pvarIndex,pvarResult) (This)->lpVtbl->item(This,pvarIndex,pvarResult)
#define IHTMLFramesCollection2_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#endif
#endif
  HRESULT WINAPI IHTMLFramesCollection2_item_Proxy(IHTMLFramesCollection2 *This,VARIANT *pvarIndex,VARIANT *pvarResult);
  void __RPC_STUB IHTMLFramesCollection2_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFramesCollection2_get_length_Proxy(IHTMLFramesCollection2 *This,long *p);
  void __RPC_STUB IHTMLFramesCollection2_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLWindow2_INTERFACE_DEFINED__
#define __IHTMLWindow2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLWindow2;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLWindow2 : public IHTMLFramesCollection2 {
  public:
    virtual HRESULT WINAPI get_frames(IHTMLFramesCollection2 **p) = 0;
    virtual HRESULT WINAPI put_defaultStatus(BSTR v) = 0;
    virtual HRESULT WINAPI get_defaultStatus(BSTR *p) = 0;
    virtual HRESULT WINAPI put_status(BSTR v) = 0;
    virtual HRESULT WINAPI get_status(BSTR *p) = 0;
    virtual HRESULT WINAPI setTimeout(BSTR expression,long msec,VARIANT *language,long *timerID) = 0;
    virtual HRESULT WINAPI clearTimeout(long timerID) = 0;
    virtual HRESULT WINAPI alert(BSTR message = L"") = 0;
    virtual HRESULT WINAPI confirm(BSTR message,VARIANT_BOOL *confirmed) = 0;
    virtual HRESULT WINAPI prompt(BSTR message,BSTR defstr,VARIANT *textdata) = 0;
    virtual HRESULT WINAPI get_Image(IHTMLImageElementFactory **p) = 0;
    virtual HRESULT WINAPI get_location(IHTMLLocation **p) = 0;
    virtual HRESULT WINAPI get_history(IOmHistory **p) = 0;
    virtual HRESULT WINAPI close(void) = 0;
    virtual HRESULT WINAPI put_opener(VARIANT v) = 0;
    virtual HRESULT WINAPI get_opener(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_navigator(IOmNavigator **p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI get_parent(IHTMLWindow2 **p) = 0;
    virtual HRESULT WINAPI open(BSTR url,BSTR name,BSTR features,VARIANT_BOOL replace,IHTMLWindow2 **pomWindowResult) = 0;
    virtual HRESULT WINAPI get_self(IHTMLWindow2 **p) = 0;
    virtual HRESULT WINAPI get_top(IHTMLWindow2 **p) = 0;
    virtual HRESULT WINAPI get_window(IHTMLWindow2 **p) = 0;
    virtual HRESULT WINAPI navigate(BSTR url) = 0;
    virtual HRESULT WINAPI put_onfocus(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onfocus(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onblur(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onblur(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onload(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onload(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onbeforeunload(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onbeforeunload(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onunload(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onunload(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onhelp(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onhelp(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onerror(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onerror(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onresize(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onresize(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onscroll(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onscroll(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_document(IHTMLDocument2 **p) = 0;
    virtual HRESULT WINAPI get_event(IHTMLEventObj **p) = 0;
    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;
    virtual HRESULT WINAPI showModalDialog(BSTR dialog,VARIANT *varArgIn,VARIANT *varOptions,VARIANT *varArgOut) = 0;
    virtual HRESULT WINAPI showHelp(BSTR helpURL,VARIANT helpArg,BSTR features = L"") = 0;
    virtual HRESULT WINAPI get_screen(IHTMLScreen **p) = 0;
    virtual HRESULT WINAPI get_Option(IHTMLOptionElementFactory **p) = 0;
    virtual HRESULT WINAPI focus(void) = 0;
    virtual HRESULT WINAPI get_closed(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI blur(void) = 0;
    virtual HRESULT WINAPI scroll(long x,long y) = 0;
    virtual HRESULT WINAPI get_clientInformation(IOmNavigator **p) = 0;
    virtual HRESULT WINAPI setInterval(BSTR expression,long msec,VARIANT *language,long *timerID) = 0;
    virtual HRESULT WINAPI clearInterval(long timerID) = 0;
    virtual HRESULT WINAPI put_offscreenBuffering(VARIANT v) = 0;
    virtual HRESULT WINAPI get_offscreenBuffering(VARIANT *p) = 0;
    virtual HRESULT WINAPI execScript(BSTR code,BSTR language,VARIANT *pvarRet) = 0;
    virtual HRESULT WINAPI toString(BSTR *String) = 0;
    virtual HRESULT WINAPI scrollBy(long x,long y) = 0;
    virtual HRESULT WINAPI scrollTo(long x,long y) = 0;
    virtual HRESULT WINAPI moveTo(long x,long y) = 0;
    virtual HRESULT WINAPI moveBy(long x,long y) = 0;
    virtual HRESULT WINAPI resizeTo(long x,long y) = 0;
    virtual HRESULT WINAPI resizeBy(long x,long y) = 0;
    virtual HRESULT WINAPI get_external(IDispatch **p) = 0;
  };
#else
  typedef struct IHTMLWindow2Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLWindow2 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLWindow2 *This);
      ULONG (WINAPI *Release)(IHTMLWindow2 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLWindow2 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLWindow2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLWindow2 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLWindow2 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *item)(IHTMLWindow2 *This,VARIANT *pvarIndex,VARIANT *pvarResult);
      HRESULT (WINAPI *get_length)(IHTMLWindow2 *This,long *p);
      HRESULT (WINAPI *get_frames)(IHTMLWindow2 *This,IHTMLFramesCollection2 **p);
      HRESULT (WINAPI *put_defaultStatus)(IHTMLWindow2 *This,BSTR v);
      HRESULT (WINAPI *get_defaultStatus)(IHTMLWindow2 *This,BSTR *p);
      HRESULT (WINAPI *put_status)(IHTMLWindow2 *This,BSTR v);
      HRESULT (WINAPI *get_status)(IHTMLWindow2 *This,BSTR *p);
      HRESULT (WINAPI *setTimeout)(IHTMLWindow2 *This,BSTR expression,long msec,VARIANT *language,long *timerID);
      HRESULT (WINAPI *clearTimeout)(IHTMLWindow2 *This,long timerID);
      HRESULT (WINAPI *alert)(IHTMLWindow2 *This,BSTR message);
      HRESULT (WINAPI *confirm)(IHTMLWindow2 *This,BSTR message,VARIANT_BOOL *confirmed);
      HRESULT (WINAPI *prompt)(IHTMLWindow2 *This,BSTR message,BSTR defstr,VARIANT *textdata);
      HRESULT (WINAPI *get_Image)(IHTMLWindow2 *This,IHTMLImageElementFactory **p);
      HRESULT (WINAPI *get_location)(IHTMLWindow2 *This,IHTMLLocation **p);
      HRESULT (WINAPI *get_history)(IHTMLWindow2 *This,IOmHistory **p);
      HRESULT (WINAPI *close)(IHTMLWindow2 *This);
      HRESULT (WINAPI *put_opener)(IHTMLWindow2 *This,VARIANT v);
      HRESULT (WINAPI *get_opener)(IHTMLWindow2 *This,VARIANT *p);
      HRESULT (WINAPI *get_navigator)(IHTMLWindow2 *This,IOmNavigator **p);
      HRESULT (WINAPI *put_name)(IHTMLWindow2 *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLWindow2 *This,BSTR *p);
      HRESULT (WINAPI *get_parent)(IHTMLWindow2 *This,IHTMLWindow2 **p);
      HRESULT (WINAPI *open)(IHTMLWindow2 *This,BSTR url,BSTR name,BSTR features,VARIANT_BOOL replace,IHTMLWindow2 **pomWindowResult);
      HRESULT (WINAPI *get_self)(IHTMLWindow2 *This,IHTMLWindow2 **p);
      HRESULT (WINAPI *get_top)(IHTMLWindow2 *This,IHTMLWindow2 **p);
      HRESULT (WINAPI *get_window)(IHTMLWindow2 *This,IHTMLWindow2 **p);
      HRESULT (WINAPI *navigate)(IHTMLWindow2 *This,BSTR url);
      HRESULT (WINAPI *put_onfocus)(IHTMLWindow2 *This,VARIANT v);
      HRESULT (WINAPI *get_onfocus)(IHTMLWindow2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onblur)(IHTMLWindow2 *This,VARIANT v);
      HRESULT (WINAPI *get_onblur)(IHTMLWindow2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onload)(IHTMLWindow2 *This,VARIANT v);
      HRESULT (WINAPI *get_onload)(IHTMLWindow2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onbeforeunload)(IHTMLWindow2 *This,VARIANT v);
      HRESULT (WINAPI *get_onbeforeunload)(IHTMLWindow2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onunload)(IHTMLWindow2 *This,VARIANT v);
      HRESULT (WINAPI *get_onunload)(IHTMLWindow2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onhelp)(IHTMLWindow2 *This,VARIANT v);
      HRESULT (WINAPI *get_onhelp)(IHTMLWindow2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onerror)(IHTMLWindow2 *This,VARIANT v);
      HRESULT (WINAPI *get_onerror)(IHTMLWindow2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onresize)(IHTMLWindow2 *This,VARIANT v);
      HRESULT (WINAPI *get_onresize)(IHTMLWindow2 *This,VARIANT *p);
      HRESULT (WINAPI *put_onscroll)(IHTMLWindow2 *This,VARIANT v);
      HRESULT (WINAPI *get_onscroll)(IHTMLWindow2 *This,VARIANT *p);
      HRESULT (WINAPI *get_document)(IHTMLWindow2 *This,IHTMLDocument2 **p);
      HRESULT (WINAPI *get_event)(IHTMLWindow2 *This,IHTMLEventObj **p);
      HRESULT (WINAPI *get__newEnum)(IHTMLWindow2 *This,IUnknown **p);
      HRESULT (WINAPI *showModalDialog)(IHTMLWindow2 *This,BSTR dialog,VARIANT *varArgIn,VARIANT *varOptions,VARIANT *varArgOut);
      HRESULT (WINAPI *showHelp)(IHTMLWindow2 *This,BSTR helpURL,VARIANT helpArg,BSTR features);
      HRESULT (WINAPI *get_screen)(IHTMLWindow2 *This,IHTMLScreen **p);
      HRESULT (WINAPI *get_Option)(IHTMLWindow2 *This,IHTMLOptionElementFactory **p);
      HRESULT (WINAPI *focus)(IHTMLWindow2 *This);
      HRESULT (WINAPI *get_closed)(IHTMLWindow2 *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *blur)(IHTMLWindow2 *This);
      HRESULT (WINAPI *scroll)(IHTMLWindow2 *This,long x,long y);
      HRESULT (WINAPI *get_clientInformation)(IHTMLWindow2 *This,IOmNavigator **p);
      HRESULT (WINAPI *setInterval)(IHTMLWindow2 *This,BSTR expression,long msec,VARIANT *language,long *timerID);
      HRESULT (WINAPI *clearInterval)(IHTMLWindow2 *This,long timerID);
      HRESULT (WINAPI *put_offscreenBuffering)(IHTMLWindow2 *This,VARIANT v);
      HRESULT (WINAPI *get_offscreenBuffering)(IHTMLWindow2 *This,VARIANT *p);
      HRESULT (WINAPI *execScript)(IHTMLWindow2 *This,BSTR code,BSTR language,VARIANT *pvarRet);
      HRESULT (WINAPI *toString)(IHTMLWindow2 *This,BSTR *String);
      HRESULT (WINAPI *scrollBy)(IHTMLWindow2 *This,long x,long y);
      HRESULT (WINAPI *scrollTo)(IHTMLWindow2 *This,long x,long y);
      HRESULT (WINAPI *moveTo)(IHTMLWindow2 *This,long x,long y);
      HRESULT (WINAPI *moveBy)(IHTMLWindow2 *This,long x,long y);
      HRESULT (WINAPI *resizeTo)(IHTMLWindow2 *This,long x,long y);
      HRESULT (WINAPI *resizeBy)(IHTMLWindow2 *This,long x,long y);
      HRESULT (WINAPI *get_external)(IHTMLWindow2 *This,IDispatch **p);
    END_INTERFACE
  } IHTMLWindow2Vtbl;
  interface IHTMLWindow2 {
    CONST_VTBL struct IHTMLWindow2Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#define IHTMLWindow2_item(This,pvarIndex,pvarResult) (This)->lpVtbl->item(This,pvarIndex,pvarResult)
#define IHTMLWindow2_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLWindow2_get_frames_Proxy(IHTMLWindow2 *This,IHTMLFramesCollection2 **p);
  void __RPC_STUB IHTMLWindow2_get_frames_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_put_defaultStatus_Proxy(IHTMLWindow2 *This,BSTR v);
  void __RPC_STUB IHTMLWindow2_put_defaultStatus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_defaultStatus_Proxy(IHTMLWindow2 *This,BSTR *p);
  void __RPC_STUB IHTMLWindow2_get_defaultStatus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_put_status_Proxy(IHTMLWindow2 *This,BSTR v);
  void __RPC_STUB IHTMLWindow2_put_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_status_Proxy(IHTMLWindow2 *This,BSTR *p);
  void __RPC_STUB IHTMLWindow2_get_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_setTimeout_Proxy(IHTMLWindow2 *This,BSTR expression,long msec,VARIANT *language,long *timerID);
  void __RPC_STUB IHTMLWindow2_setTimeout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_clearTimeout_Proxy(IHTMLWindow2 *This,long timerID);
  void __RPC_STUB IHTMLWindow2_clearTimeout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_alert_Proxy(IHTMLWindow2 *This,BSTR message);
  void __RPC_STUB IHTMLWindow2_alert_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_confirm_Proxy(IHTMLWindow2 *This,BSTR message,VARIANT_BOOL *confirmed);
  void __RPC_STUB IHTMLWindow2_confirm_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_prompt_Proxy(IHTMLWindow2 *This,BSTR message,BSTR defstr,VARIANT *textdata);
  void __RPC_STUB IHTMLWindow2_prompt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_Image_Proxy(IHTMLWindow2 *This,IHTMLImageElementFactory **p);
  void __RPC_STUB IHTMLWindow2_get_Image_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_location_Proxy(IHTMLWindow2 *This,IHTMLLocation **p);
  void __RPC_STUB IHTMLWindow2_get_location_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_history_Proxy(IHTMLWindow2 *This,IOmHistory **p);
  void __RPC_STUB IHTMLWindow2_get_history_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_close_Proxy(IHTMLWindow2 *This);
  void __RPC_STUB IHTMLWindow2_close_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_put_opener_Proxy(IHTMLWindow2 *This,VARIANT v);
  void __RPC_STUB IHTMLWindow2_put_opener_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_opener_Proxy(IHTMLWindow2 *This,VARIANT *p);
  void __RPC_STUB IHTMLWindow2_get_opener_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_navigator_Proxy(IHTMLWindow2 *This,IOmNavigator **p);
  void __RPC_STUB IHTMLWindow2_get_navigator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_put_name_Proxy(IHTMLWindow2 *This,BSTR v);
  void __RPC_STUB IHTMLWindow2_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_name_Proxy(IHTMLWindow2 *This,BSTR *p);
  void __RPC_STUB IHTMLWindow2_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_parent_Proxy(IHTMLWindow2 *This,IHTMLWindow2 **p);
  void __RPC_STUB IHTMLWindow2_get_parent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_open_Proxy(IHTMLWindow2 *This,BSTR url,BSTR name,BSTR features,VARIANT_BOOL replace,IHTMLWindow2 **pomWindowResult);
  void __RPC_STUB IHTMLWindow2_open_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_self_Proxy(IHTMLWindow2 *This,IHTMLWindow2 **p);
  void __RPC_STUB IHTMLWindow2_get_self_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_top_Proxy(IHTMLWindow2 *This,IHTMLWindow2 **p);
  void __RPC_STUB IHTMLWindow2_get_top_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_window_Proxy(IHTMLWindow2 *This,IHTMLWindow2 **p);
  void __RPC_STUB IHTMLWindow2_get_window_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_navigate_Proxy(IHTMLWindow2 *This,BSTR url);
  void __RPC_STUB IHTMLWindow2_navigate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_put_onfocus_Proxy(IHTMLWindow2 *This,VARIANT v);
  void __RPC_STUB IHTMLWindow2_put_onfocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_onfocus_Proxy(IHTMLWindow2 *This,VARIANT *p);
  void __RPC_STUB IHTMLWindow2_get_onfocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_put_onblur_Proxy(IHTMLWindow2 *This,VARIANT v);
  void __RPC_STUB IHTMLWindow2_put_onblur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_onblur_Proxy(IHTMLWindow2 *This,VARIANT *p);
  void __RPC_STUB IHTMLWindow2_get_onblur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_put_onload_Proxy(IHTMLWindow2 *This,VARIANT v);
  void __RPC_STUB IHTMLWindow2_put_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_onload_Proxy(IHTMLWindow2 *This,VARIANT *p);
  void __RPC_STUB IHTMLWindow2_get_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_put_onbeforeunload_Proxy(IHTMLWindow2 *This,VARIANT v);
  void __RPC_STUB IHTMLWindow2_put_onbeforeunload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_onbeforeunload_Proxy(IHTMLWindow2 *This,VARIANT *p);
  void __RPC_STUB IHTMLWindow2_get_onbeforeunload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_put_onunload_Proxy(IHTMLWindow2 *This,VARIANT v);
  void __RPC_STUB IHTMLWindow2_put_onunload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_onunload_Proxy(IHTMLWindow2 *This,VARIANT *p);
  void __RPC_STUB IHTMLWindow2_get_onunload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_put_onhelp_Proxy(IHTMLWindow2 *This,VARIANT v);
  void __RPC_STUB IHTMLWindow2_put_onhelp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_onhelp_Proxy(IHTMLWindow2 *This,VARIANT *p);
  void __RPC_STUB IHTMLWindow2_get_onhelp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_put_onerror_Proxy(IHTMLWindow2 *This,VARIANT v);
  void __RPC_STUB IHTMLWindow2_put_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_onerror_Proxy(IHTMLWindow2 *This,VARIANT *p);
  void __RPC_STUB IHTMLWindow2_get_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_put_onresize_Proxy(IHTMLWindow2 *This,VARIANT v);
  void __RPC_STUB IHTMLWindow2_put_onresize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_onresize_Proxy(IHTMLWindow2 *This,VARIANT *p);
  void __RPC_STUB IHTMLWindow2_get_onresize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_put_onscroll_Proxy(IHTMLWindow2 *This,VARIANT v);
  void __RPC_STUB IHTMLWindow2_put_onscroll_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_onscroll_Proxy(IHTMLWindow2 *This,VARIANT *p);
  void __RPC_STUB IHTMLWindow2_get_onscroll_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_document_Proxy(IHTMLWindow2 *This,IHTMLDocument2 **p);
  void __RPC_STUB IHTMLWindow2_get_document_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_event_Proxy(IHTMLWindow2 *This,IHTMLEventObj **p);
  void __RPC_STUB IHTMLWindow2_get_event_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get__newEnum_Proxy(IHTMLWindow2 *This,IUnknown **p);
  void __RPC_STUB IHTMLWindow2_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_showModalDialog_Proxy(IHTMLWindow2 *This,BSTR dialog,VARIANT *varArgIn,VARIANT *varOptions,VARIANT *varArgOut);
  void __RPC_STUB IHTMLWindow2_showModalDialog_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_showHelp_Proxy(IHTMLWindow2 *This,BSTR helpURL,VARIANT helpArg,BSTR features);
  void __RPC_STUB IHTMLWindow2_showHelp_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_screen_Proxy(IHTMLWindow2 *This,IHTMLScreen **p);
  void __RPC_STUB IHTMLWindow2_get_screen_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_Option_Proxy(IHTMLWindow2 *This,IHTMLOptionElementFactory **p);
  void __RPC_STUB IHTMLWindow2_get_Option_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_focus_Proxy(IHTMLWindow2 *This);
  void __RPC_STUB IHTMLWindow2_focus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_closed_Proxy(IHTMLWindow2 *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLWindow2_get_closed_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_blur_Proxy(IHTMLWindow2 *This);
  void __RPC_STUB IHTMLWindow2_blur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_scroll_Proxy(IHTMLWindow2 *This,long x,long y);
  void __RPC_STUB IHTMLWindow2_scroll_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_clientInformation_Proxy(IHTMLWindow2 *This,IOmNavigator **p);
  void __RPC_STUB IHTMLWindow2_get_clientInformation_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_setInterval_Proxy(IHTMLWindow2 *This,BSTR expression,long msec,VARIANT *language,long *timerID);
  void __RPC_STUB IHTMLWindow2_setInterval_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_clearInterval_Proxy(IHTMLWindow2 *This,long timerID);
  void __RPC_STUB IHTMLWindow2_clearInterval_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_put_offscreenBuffering_Proxy(IHTMLWindow2 *This,VARIANT v);
  void __RPC_STUB IHTMLWindow2_put_offscreenBuffering_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_offscreenBuffering_Proxy(IHTMLWindow2 *This,VARIANT *p);
  void __RPC_STUB IHTMLWindow2_get_offscreenBuffering_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_execScript_Proxy(IHTMLWindow2 *This,BSTR code,BSTR language,VARIANT *pvarRet);
  void __RPC_STUB IHTMLWindow2_execScript_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_toString_Proxy(IHTMLWindow2 *This,BSTR *String);
  void __RPC_STUB IHTMLWindow2_toString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_scrollBy_Proxy(IHTMLWindow2 *This,long x,long y);
  void __RPC_STUB IHTMLWindow2_scrollBy_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_scrollTo_Proxy(IHTMLWindow2 *This,long x,long y);
  void __RPC_STUB IHTMLWindow2_scrollTo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_moveTo_Proxy(IHTMLWindow2 *This,long x,long y);
  void __RPC_STUB IHTMLWindow2_moveTo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_moveBy_Proxy(IHTMLWindow2 *This,long x,long y);
  void __RPC_STUB IHTMLWindow2_moveBy_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_resizeTo_Proxy(IHTMLWindow2 *This,long x,long y);
  void __RPC_STUB IHTMLWindow2_resizeTo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_resizeBy_Proxy(IHTMLWindow2 *This,long x,long y);
  void __RPC_STUB IHTMLWindow2_resizeBy_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow2_get_external_Proxy(IHTMLWindow2 *This,IDispatch **p);
  void __RPC_STUB IHTMLWindow2_get_external_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLWindow3_INTERFACE_DEFINED__
#define __IHTMLWindow3_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLWindow3;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLWindow3 : public IDispatch {
  public:
    virtual HRESULT WINAPI get_screenLeft(long *p) = 0;
    virtual HRESULT WINAPI get_screenTop(long *p) = 0;
    virtual HRESULT WINAPI attachEvent(BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult) = 0;
    virtual HRESULT WINAPI detachEvent(BSTR event,IDispatch *pDisp) = 0;
    virtual HRESULT WINAPI setTimeout(VARIANT *expression,long msec,VARIANT *language,long *timerID) = 0;
    virtual HRESULT WINAPI setInterval(VARIANT *expression,long msec,VARIANT *language,long *timerID) = 0;
    virtual HRESULT WINAPI print(void) = 0;
    virtual HRESULT WINAPI put_onbeforeprint(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onbeforeprint(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_onafterprint(VARIANT v) = 0;
    virtual HRESULT WINAPI get_onafterprint(VARIANT *p) = 0;
    virtual HRESULT WINAPI get_clipboardData(IHTMLDataTransfer **p) = 0;
    virtual HRESULT WINAPI showModelessDialog(BSTR url,VARIANT *varArgIn,VARIANT *options,IHTMLWindow2 **pDialog) = 0;
  };
#else
  typedef struct IHTMLWindow3Vtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLWindow3 *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLWindow3 *This);
      ULONG (WINAPI *Release)(IHTMLWindow3 *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLWindow3 *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLWindow3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLWindow3 *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLWindow3 *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_screenLeft)(IHTMLWindow3 *This,long *p);
      HRESULT (WINAPI *get_screenTop)(IHTMLWindow3 *This,long *p);
      HRESULT (WINAPI *attachEvent)(IHTMLWindow3 *This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult);
      HRESULT (WINAPI *detachEvent)(IHTMLWindow3 *This,BSTR event,IDispatch *pDisp);
      HRESULT (WINAPI *setTimeout)(IHTMLWindow3 *This,VARIANT *expression,long msec,VARIANT *language,long *timerID);
      HRESULT (WINAPI *setInterval)(IHTMLWindow3 *This,VARIANT *expression,long msec,VARIANT *language,long *timerID);
      HRESULT (WINAPI *print)(IHTMLWindow3 *This);
      HRESULT (WINAPI *put_onbeforeprint)(IHTMLWindow3 *This,VARIANT v);
      HRESULT (WINAPI *get_onbeforeprint)(IHTMLWindow3 *This,VARIANT *p);
      HRESULT (WINAPI *put_onafterprint)(IHTMLWindow3 *This,VARIANT v);
      HRESULT (WINAPI *get_onafterprint)(IHTMLWindow3 *This,VARIANT *p);
      HRESULT (WINAPI *get_clipboardData)(IHTMLWindow3 *This,IHTMLDataTransfer **p);
      HRESULT (WINAPI *showModelessDialog)(IHTMLWindow3 *This,BSTR url,VARIANT *varArgIn,VARIANT *options,IHTMLWindow2 **pDialog);
    END_INTERFACE
  } IHTMLWindow3Vtbl;
  interface IHTMLWindow3 {
    CONST_VTBL struct IHTMLWindow3Vtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLWindow3_get_screenLeft_Proxy(IHTMLWindow3 *This,long *p);
  void __RPC_STUB IHTMLWindow3_get_screenLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow3_get_screenTop_Proxy(IHTMLWindow3 *This,long *p);
  void __RPC_STUB IHTMLWindow3_get_screenTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow3_attachEvent_Proxy(IHTMLWindow3 *This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult);
  void __RPC_STUB IHTMLWindow3_attachEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow3_detachEvent_Proxy(IHTMLWindow3 *This,BSTR event,IDispatch *pDisp);
  void __RPC_STUB IHTMLWindow3_detachEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow3_setTimeout_Proxy(IHTMLWindow3 *This,VARIANT *expression,long msec,VARIANT *language,long *timerID);
  void __RPC_STUB IHTMLWindow3_setTimeout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow3_setInterval_Proxy(IHTMLWindow3 *This,VARIANT *expression,long msec,VARIANT *language,long *timerID);
  void __RPC_STUB IHTMLWindow3_setInterval_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow3_print_Proxy(IHTMLWindow3 *This);
  void __RPC_STUB IHTMLWindow3_print_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow3_put_onbeforeprint_Proxy(IHTMLWindow3 *This,VARIANT v);
  void __RPC_STUB IHTMLWindow3_put_onbeforeprint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow3_get_onbeforeprint_Proxy(IHTMLWindow3 *This,VARIANT *p);
  void __RPC_STUB IHTMLWindow3_get_onbeforeprint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow3_put_onafterprint_Proxy(IHTMLWindow3 *This,VARIANT v);
  void __RPC_STUB IHTMLWindow3_put_onafterprint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow3_get_onafterprint_Proxy(IHTMLWindow3 *This,VARIANT *p);
  void __RPC_STUB IHTMLWindow3_get_onafterprint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow3_get_clipboardData_Proxy(IHTMLWindow3 *This,IHTMLDataTransfer **p);
  void __RPC_STUB IHTMLWindow3_get_clipboardData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLWindow3_showModelessDialog_Proxy(IHTMLWindow3 *This,BSTR url,VARIANT *varArgIn,VARIANT *options,IHTMLWindow2 **pDialog);
  void __RPC_STUB IHTMLWindow3_showModelessDialog_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLFrameBase_INTERFACE_DEFINED__
#define __IHTMLFrameBase_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLFrameBase;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLFrameBase : public IDispatch {
  public:
    virtual HRESULT WINAPI put_src(BSTR v) = 0;
    virtual HRESULT WINAPI get_src(BSTR *p) = 0;
    virtual HRESULT WINAPI put_name(BSTR v) = 0;
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;
    virtual HRESULT WINAPI put_border(VARIANT v) = 0;
    virtual HRESULT WINAPI get_border(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_frameBorder(BSTR v) = 0;
    virtual HRESULT WINAPI get_frameBorder(BSTR *p) = 0;
    virtual HRESULT WINAPI put_frameSpacing(VARIANT v) = 0;
    virtual HRESULT WINAPI get_frameSpacing(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_marginWidth(VARIANT v) = 0;
    virtual HRESULT WINAPI get_marginWidth(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_marginHeight(VARIANT v) = 0;
    virtual HRESULT WINAPI get_marginHeight(VARIANT *p) = 0;
    virtual HRESULT WINAPI put_noResize(VARIANT_BOOL v) = 0;
    virtual HRESULT WINAPI get_noResize(VARIANT_BOOL *p) = 0;
    virtual HRESULT WINAPI put_scrolling(BSTR v) = 0;
    virtual HRESULT WINAPI get_scrolling(BSTR *p) = 0;
  };
#else
  typedef struct IHTMLFrameBaseVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLFrameBase *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLFrameBase *This);
      ULONG (WINAPI *Release)(IHTMLFrameBase *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFrameBase *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLFrameBase *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLFrameBase *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLFrameBase *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *put_src)(IHTMLFrameBase *This,BSTR v);
      HRESULT (WINAPI *get_src)(IHTMLFrameBase *This,BSTR *p);
      HRESULT (WINAPI *put_name)(IHTMLFrameBase *This,BSTR v);
      HRESULT (WINAPI *get_name)(IHTMLFrameBase *This,BSTR *p);
      HRESULT (WINAPI *put_border)(IHTMLFrameBase *This,VARIANT v);
      HRESULT (WINAPI *get_border)(IHTMLFrameBase *This,VARIANT *p);
      HRESULT (WINAPI *put_frameBorder)(IHTMLFrameBase *This,BSTR v);
      HRESULT (WINAPI *get_frameBorder)(IHTMLFrameBase *This,BSTR *p);
      HRESULT (WINAPI *put_frameSpacing)(IHTMLFrameBase *This,VARIANT v);
      HRESULT (WINAPI *get_frameSpacing)(IHTMLFrameBase *This,VARIANT *p);
      HRESULT (WINAPI *put_marginWidth)(IHTMLFrameBase *This,VARIANT v);
      HRESULT (WINAPI *get_marginWidth)(IHTMLFrameBase *This,VARIANT *p);
      HRESULT (WINAPI *put_marginHeight)(IHTMLFrameBase *This,VARIANT v);
      HRESULT (WINAPI *get_marginHeight)(IHTMLFrameBase *This,VARIANT *p);
      HRESULT (WINAPI *put_noResize)(IHTMLFrameBase *This,VARIANT_BOOL v);
      HRESULT (WINAPI *get_noResize)(IHTMLFrameBase *This,VARIANT_BOOL *p);
      HRESULT (WINAPI *put_scrolling)(IHTMLFrameBase *This,BSTR v);
      HRESULT (WINAPI *get_scrolling)(IHTMLFrameBase *This,BSTR *p);
    END_INTERFACE
  } IHTMLFrameBaseVtbl;
  interface IHTMLFrameBase {
    CONST_VTBL struct IHTMLFrameBaseVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLFrameBase_put_src_Proxy(IHTMLFrameBase *This,BSTR v);
  void __RPC_STUB IHTMLFrameBase_put_src_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_get_src_Proxy(IHTMLFrameBase *This,BSTR *p);
  void __RPC_STUB IHTMLFrameBase_get_src_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_put_name_Proxy(IHTMLFrameBase *This,BSTR v);
  void __RPC_STUB IHTMLFrameBase_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_get_name_Proxy(IHTMLFrameBase *This,BSTR *p);
  void __RPC_STUB IHTMLFrameBase_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_put_border_Proxy(IHTMLFrameBase *This,VARIANT v);
  void __RPC_STUB IHTMLFrameBase_put_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_get_border_Proxy(IHTMLFrameBase *This,VARIANT *p);
  void __RPC_STUB IHTMLFrameBase_get_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_put_frameBorder_Proxy(IHTMLFrameBase *This,BSTR v);
  void __RPC_STUB IHTMLFrameBase_put_frameBorder_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_get_frameBorder_Proxy(IHTMLFrameBase *This,BSTR *p);
  void __RPC_STUB IHTMLFrameBase_get_frameBorder_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_put_frameSpacing_Proxy(IHTMLFrameBase *This,VARIANT v);
  void __RPC_STUB IHTMLFrameBase_put_frameSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_get_frameSpacing_Proxy(IHTMLFrameBase *This,VARIANT *p);
  void __RPC_STUB IHTMLFrameBase_get_frameSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_put_marginWidth_Proxy(IHTMLFrameBase *This,VARIANT v);
  void __RPC_STUB IHTMLFrameBase_put_marginWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_get_marginWidth_Proxy(IHTMLFrameBase *This,VARIANT *p);
  void __RPC_STUB IHTMLFrameBase_get_marginWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_put_marginHeight_Proxy(IHTMLFrameBase *This,VARIANT v);
  void __RPC_STUB IHTMLFrameBase_put_marginHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_get_marginHeight_Proxy(IHTMLFrameBase *This,VARIANT *p);
  void __RPC_STUB IHTMLFrameBase_get_marginHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_put_noResize_Proxy(IHTMLFrameBase *This,VARIANT_BOOL v);
  void __RPC_STUB IHTMLFrameBase_put_noResize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_get_noResize_Proxy(IHTMLFrameBase *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLFrameBase_get_noResize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_put_scrolling_Proxy(IHTMLFrameBase *This,BSTR v);
  void __RPC_STUB IHTMLFrameBase_put_scrolling_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLFrameBase_get_scrolling_Proxy(IHTMLFrameBase *This,BSTR *p);
  void __RPC_STUB IHTMLFrameBase_get_scrolling_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLScreen_INTERFACE_DEFINED__
#define __IHTMLScreen_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLScreen;
#if defined(__cplusplus) && !defined(CINTERFACE)
  struct IHTMLScreen : public IDispatch {
  public:
    virtual HRESULT WINAPI get_colorDepth(long *p) = 0;
    virtual HRESULT WINAPI put_bufferDepth(long v) = 0;
    virtual HRESULT WINAPI get_bufferDepth(long *p) = 0;
    virtual HRESULT WINAPI get_width(long *p) = 0;
    virtual HRESULT WINAPI get_height(long *p) = 0;
    virtual HRESULT WINAPI put_updateInterval(long v) = 0;
    virtual HRESULT WINAPI get_updateInterval(long *p) = 0;
    virtual HRESULT WINAPI get_availHeight(long *p) = 0;
    virtual HRESULT WINAPI get_availWidth(long *p) = 0;
    virtual HRESULT WINAPI get_fontSmoothingEnabled(VARIANT_BOOL *p) = 0;
  };
#else
  typedef struct IHTMLScreenVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHTMLScreen *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHTMLScreen *This);
      ULONG (WINAPI *Release)(IHTMLScreen *This);
      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLScreen *This,UINT *pctinfo);
      HRESULT (WINAPI *GetTypeInfo)(IHTMLScreen *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);
      HRESULT (WINAPI *GetIDsOfNames)(IHTMLScreen *This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId);
      HRESULT (WINAPI *Invoke)(IHTMLScreen *This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr);
      HRESULT (WINAPI *get_colorDepth)(IHTMLScreen *This,long *p);
      HRESULT (WINAPI *put_bufferDepth)(IHTMLScreen *This,long v);
      HRESULT (WINAPI *get_bufferDepth)(IHTMLScreen *This,long *p);
      HRESULT (WINAPI *get_width)(IHTMLScreen *This,long *p);
      HRESULT (WINAPI *get_height)(IHTMLScreen *This,long *p);
      HRESULT (WINAPI *put_updateInterval)(IHTMLScreen *This,long v);
      HRESULT (WINAPI *get_updateInterval)(IHTMLScreen *This,long *p);
      HRESULT (WINAPI *get_availHeight)(IHTMLScreen *This,long *p);
      HRESULT (WINAPI *get_availWidth)(IHTMLScreen *This,long *p);
      HRESULT (WINAPI *get_fontSmoothingEnabled)(IHTMLScreen *This,VARIANT_BOOL *p);
    END_INTERFACE
  } IHTMLScreenVtbl;
  interface IHTMLScreen {
    CONST_VTBL struct IHTMLScreenVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#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)
#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)
#endif
#endif
  HRESULT WINAPI IHTMLScreen_get_colorDepth_Proxy(IHTMLScreen *This,long *p);
  void __RPC_STUB IHTMLScreen_get_colorDepth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLScreen_put_bufferDepth_Proxy(IHTMLScreen *This,long v);
  void __RPC_STUB IHTMLScreen_put_bufferDepth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLScreen_get_bufferDepth_Proxy(IHTMLScreen *This,long *p);
  void __RPC_STUB IHTMLScreen_get_bufferDepth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLScreen_get_width_Proxy(IHTMLScreen *This,long *p);
  void __RPC_STUB IHTMLScreen_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLScreen_get_height_Proxy(IHTMLScreen *This,long *p);
  void __RPC_STUB IHTMLScreen_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLScreen_put_updateInterval_Proxy(IHTMLScreen *This,long v);
  void __RPC_STUB IHTMLScreen_put_updateInterval_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLScreen_get_updateInterval_Proxy(IHTMLScreen *This,long *p);
  void __RPC_STUB IHTMLScreen_get_updateInterval_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLScreen_get_availHeight_Proxy(IHTMLScreen *This,long *p);
  void __RPC_STUB IHTMLScreen_get_availHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLScreen_get_availWidth_Proxy(IHTMLScreen *This,long *p);
  void __RPC_STUB IHTMLScreen_get_availWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
  HRESULT WINAPI IHTMLScreen_get_fontSmoothingEnabled_Proxy(IHTMLScreen *This,VARIANT_BOOL *p);
  void __RPC_STUB IHTMLScreen_get_fontSmoothingEnabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLScreen2_INTERFACE_DEFINED__
#define __IHTMLScreen2_INTERFACE_DEFINED__
  EXTERN_C const IID IID_IHTMLScreen2;
#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLScreen2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get_logicalXDPI(long *p) = 0;

    virtual HRESULT WINAPI get_logicalYDPI(long *p) = 0;

    virtual HRESULT WINAPI get_deviceXDPI(long *p) = 0;

    virtual HRESULT WINAPI get_deviceYDPI(long *p) = 0;

  };
#else

  typedef struct IHTMLScreen2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLScreen2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLScreen2 *This);

      ULONG (WINAPI *Release)(IHTMLScreen2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLScreen2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLScreen2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get_logicalXDPI)(IHTMLScreen2 *This,long *p);

      HRESULT (WINAPI *get_logicalYDPI)(IHTMLScreen2 *This,long *p);

      HRESULT (WINAPI *get_deviceXDPI)(IHTMLScreen2 *This,long *p);

      HRESULT (WINAPI *get_deviceYDPI)(IHTMLScreen2 *This,long *p);

    END_INTERFACE
  } IHTMLScreen2Vtbl;

  interface IHTMLScreen2
  {
    CONST_VTBL struct IHTMLScreen2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLScreen2_get_logicalXDPI_Proxy(IHTMLScreen2 *This,long *p);

  void __RPC_STUB IHTMLScreen2_get_logicalXDPI_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScreen2_get_logicalYDPI_Proxy(IHTMLScreen2 *This,long *p);

  void __RPC_STUB IHTMLScreen2_get_logicalYDPI_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScreen2_get_deviceXDPI_Proxy(IHTMLScreen2 *This,long *p);

  void __RPC_STUB IHTMLScreen2_get_deviceXDPI_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScreen2_get_deviceYDPI_Proxy(IHTMLScreen2 *This,long *p);

  void __RPC_STUB IHTMLScreen2_get_deviceYDPI_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLWindow4_INTERFACE_DEFINED__
#define __IHTMLWindow4_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLWindow4;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLWindow4 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI createPopup(VARIANT *varArgIn,IDispatch **ppPopup) = 0;

    virtual HRESULT WINAPI get_frameElement(IHTMLFrameBase **p) = 0;

  };
#else

  typedef struct IHTMLWindow4Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLWindow4 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLWindow4 *This);

      ULONG (WINAPI *Release)(IHTMLWindow4 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLWindow4 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLWindow4 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *createPopup)(IHTMLWindow4 *This,VARIANT *varArgIn,IDispatch **ppPopup);

      HRESULT (WINAPI *get_frameElement)(IHTMLWindow4 *This,IHTMLFrameBase **p);

    END_INTERFACE
  } IHTMLWindow4Vtbl;

  interface IHTMLWindow4
  {
    CONST_VTBL struct IHTMLWindow4Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLWindow4_createPopup(This,varArgIn,ppPopup) (This)->lpVtbl->createPopup(This,varArgIn,ppPopup)

#define IHTMLWindow4_get_frameElement(This,p) (This)->lpVtbl->get_frameElement(This,p)
#endif
#endif

  HRESULT WINAPI IHTMLWindow4_createPopup_Proxy(IHTMLWindow4 *This,VARIANT *varArgIn,IDispatch **ppPopup);

  void __RPC_STUB IHTMLWindow4_createPopup_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLWindow4_get_frameElement_Proxy(IHTMLWindow4 *This,IHTMLFrameBase **p);

  void __RPC_STUB IHTMLWindow4_get_frameElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  EXTERN_C const CLSID CLSID_FramesCollection;

#ifdef __cplusplus

  class FramesCollection;
#endif

#ifndef __DispHTMLScreen_DISPINTERFACE_DEFINED__
#define __DispHTMLScreen_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLScreen;

#if defined(__cplusplus) && !defined(CINTERFACE)
  struct DispHTMLScreen : public IDispatch {
  };
#else

  typedef struct DispHTMLScreenVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLScreen *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLScreen *This);

      ULONG (WINAPI *Release)(DispHTMLScreen *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLScreen *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLScreen *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLScreenVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLScreen;

#ifdef __cplusplus

  class HTMLScreen;
#endif

#ifndef __DispHTMLWindow2_DISPINTERFACE_DEFINED__
#define __DispHTMLWindow2_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLWindow2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLWindow2 : public IDispatch
  {
  };
#else

  typedef struct DispHTMLWindow2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLWindow2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLWindow2 *This);

      ULONG (WINAPI *Release)(DispHTMLWindow2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLWindow2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLWindow2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLWindow2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLWindow2;

#ifdef __cplusplus

  class HTMLWindow2;
#endif

#ifndef __DispHTMLWindowProxy_DISPINTERFACE_DEFINED__
#define __DispHTMLWindowProxy_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLWindowProxy;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLWindowProxy : public IDispatch
  {
  };
#else

  typedef struct DispHTMLWindowProxyVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLWindowProxy *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLWindowProxy *This);

      ULONG (WINAPI *Release)(DispHTMLWindowProxy *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLWindowProxy *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLWindowProxy *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLWindowProxyVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLWindowProxy;

#ifdef __cplusplus

  class HTMLWindowProxy;
#endif

#ifndef __HTMLDocumentEvents2_DISPINTERFACE_DEFINED__
#define __HTMLDocumentEvents2_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLDocumentEvents2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLDocumentEvents2 : public IDispatch
  {
  };
#else

  typedef struct HTMLDocumentEvents2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLDocumentEvents2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLDocumentEvents2 *This);

      ULONG (WINAPI *Release)(HTMLDocumentEvents2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLDocumentEvents2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLDocumentEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLDocumentEvents2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __HTMLDocumentEvents_DISPINTERFACE_DEFINED__
#define __HTMLDocumentEvents_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLDocumentEvents;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLDocumentEvents : public IDispatch
  {
  };
#else

  typedef struct HTMLDocumentEventsVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLDocumentEvents *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLDocumentEvents *This);

      ULONG (WINAPI *Release)(HTMLDocumentEvents *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLDocumentEvents *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLDocumentEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLDocumentEventsVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __IHTMLDocument3_INTERFACE_DEFINED__
#define __IHTMLDocument3_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLDocument3;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLDocument3 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI releaseCapture(void) = 0;

    virtual HRESULT WINAPI recalc(VARIANT_BOOL fForce = 0) = 0;

    virtual HRESULT WINAPI createTextNode(BSTR text,IHTMLDOMNode **newTextNode) = 0;

    virtual HRESULT WINAPI get_documentElement(IHTMLElement **p) = 0;

    virtual HRESULT WINAPI get_uniqueID(BSTR *p) = 0;

    virtual HRESULT WINAPI attachEvent(BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult) = 0;

    virtual HRESULT WINAPI detachEvent(BSTR event,IDispatch *pDisp) = 0;

    virtual HRESULT WINAPI put_onrowsdelete(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onrowsdelete(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onrowsinserted(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onrowsinserted(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_oncellchange(VARIANT v) = 0;

    virtual HRESULT WINAPI get_oncellchange(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_ondatasetchanged(VARIANT v) = 0;

    virtual HRESULT WINAPI get_ondatasetchanged(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_ondataavailable(VARIANT v) = 0;

    virtual HRESULT WINAPI get_ondataavailable(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_ondatasetcomplete(VARIANT v) = 0;

    virtual HRESULT WINAPI get_ondatasetcomplete(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onpropertychange(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onpropertychange(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_dir(BSTR v) = 0;

    virtual HRESULT WINAPI get_dir(BSTR *p) = 0;

    virtual HRESULT WINAPI put_oncontextmenu(VARIANT v) = 0;

    virtual HRESULT WINAPI get_oncontextmenu(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onstop(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onstop(VARIANT *p) = 0;

    virtual HRESULT WINAPI createDocumentFragment(IHTMLDocument2 **pNewDoc) = 0;

    virtual HRESULT WINAPI get_parentDocument(IHTMLDocument2 **p) = 0;

    virtual HRESULT WINAPI put_enableDownload(VARIANT_BOOL v) = 0;

    virtual HRESULT WINAPI get_enableDownload(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI put_baseUrl(BSTR v) = 0;

    virtual HRESULT WINAPI get_baseUrl(BSTR *p) = 0;

    virtual HRESULT WINAPI get_childNodes(IDispatch **p) = 0;

    virtual HRESULT WINAPI put_inheritStyleSheets(VARIANT_BOOL v) = 0;

    virtual HRESULT WINAPI get_inheritStyleSheets(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI put_onbeforeeditfocus(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onbeforeeditfocus(VARIANT *p) = 0;

    virtual HRESULT WINAPI getElementsByName(BSTR v,IHTMLElementCollection **pelColl) = 0;

    virtual HRESULT WINAPI getElementById(BSTR v,IHTMLElement **pel) = 0;

    virtual HRESULT WINAPI getElementsByTagName(BSTR v,IHTMLElementCollection **pelColl) = 0;

  };
#else

  typedef struct IHTMLDocument3Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLDocument3 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLDocument3 *This);

      ULONG (WINAPI *Release)(IHTMLDocument3 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDocument3 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLDocument3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *releaseCapture)(IHTMLDocument3 *This);

      HRESULT (WINAPI *recalc)(IHTMLDocument3 *This,VARIANT_BOOL fForce);

      HRESULT (WINAPI *createTextNode)(IHTMLDocument3 *This,BSTR text,IHTMLDOMNode **newTextNode);

      HRESULT (WINAPI *get_documentElement)(IHTMLDocument3 *This,IHTMLElement **p);

      HRESULT (WINAPI *get_uniqueID)(IHTMLDocument3 *This,BSTR *p);

      HRESULT (WINAPI *attachEvent)(IHTMLDocument3 *This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult);

      HRESULT (WINAPI *detachEvent)(IHTMLDocument3 *This,BSTR event,IDispatch *pDisp);

      HRESULT (WINAPI *put_onrowsdelete)(IHTMLDocument3 *This,VARIANT v);

      HRESULT (WINAPI *get_onrowsdelete)(IHTMLDocument3 *This,VARIANT *p);

      HRESULT (WINAPI *put_onrowsinserted)(IHTMLDocument3 *This,VARIANT v);

      HRESULT (WINAPI *get_onrowsinserted)(IHTMLDocument3 *This,VARIANT *p);

      HRESULT (WINAPI *put_oncellchange)(IHTMLDocument3 *This,VARIANT v);

      HRESULT (WINAPI *get_oncellchange)(IHTMLDocument3 *This,VARIANT *p);

      HRESULT (WINAPI *put_ondatasetchanged)(IHTMLDocument3 *This,VARIANT v);

      HRESULT (WINAPI *get_ondatasetchanged)(IHTMLDocument3 *This,VARIANT *p);

      HRESULT (WINAPI *put_ondataavailable)(IHTMLDocument3 *This,VARIANT v);

      HRESULT (WINAPI *get_ondataavailable)(IHTMLDocument3 *This,VARIANT *p);

      HRESULT (WINAPI *put_ondatasetcomplete)(IHTMLDocument3 *This,VARIANT v);

      HRESULT (WINAPI *get_ondatasetcomplete)(IHTMLDocument3 *This,VARIANT *p);

      HRESULT (WINAPI *put_onpropertychange)(IHTMLDocument3 *This,VARIANT v);

      HRESULT (WINAPI *get_onpropertychange)(IHTMLDocument3 *This,VARIANT *p);

      HRESULT (WINAPI *put_dir)(IHTMLDocument3 *This,BSTR v);

      HRESULT (WINAPI *get_dir)(IHTMLDocument3 *This,BSTR *p);

      HRESULT (WINAPI *put_oncontextmenu)(IHTMLDocument3 *This,VARIANT v);

      HRESULT (WINAPI *get_oncontextmenu)(IHTMLDocument3 *This,VARIANT *p);

      HRESULT (WINAPI *put_onstop)(IHTMLDocument3 *This,VARIANT v);

      HRESULT (WINAPI *get_onstop)(IHTMLDocument3 *This,VARIANT *p);

      HRESULT (WINAPI *createDocumentFragment)(IHTMLDocument3 *This,IHTMLDocument2 **pNewDoc);

      HRESULT (WINAPI *get_parentDocument)(IHTMLDocument3 *This,IHTMLDocument2 **p);

      HRESULT (WINAPI *put_enableDownload)(IHTMLDocument3 *This,VARIANT_BOOL v);

      HRESULT (WINAPI *get_enableDownload)(IHTMLDocument3 *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *put_baseUrl)(IHTMLDocument3 *This,BSTR v);

      HRESULT (WINAPI *get_baseUrl)(IHTMLDocument3 *This,BSTR *p);

      HRESULT (WINAPI *get_childNodes)(IHTMLDocument3 *This,IDispatch **p);

      HRESULT (WINAPI *put_inheritStyleSheets)(IHTMLDocument3 *This,VARIANT_BOOL v);

      HRESULT (WINAPI *get_inheritStyleSheets)(IHTMLDocument3 *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *put_onbeforeeditfocus)(IHTMLDocument3 *This,VARIANT v);

      HRESULT (WINAPI *get_onbeforeeditfocus)(IHTMLDocument3 *This,VARIANT *p);

      HRESULT (WINAPI *getElementsByName)(IHTMLDocument3 *This,BSTR v,IHTMLElementCollection **pelColl);

      HRESULT (WINAPI *getElementById)(IHTMLDocument3 *This,BSTR v,IHTMLElement **pel);

      HRESULT (WINAPI *getElementsByTagName)(IHTMLDocument3 *This,BSTR v,IHTMLElementCollection **pelColl);

    END_INTERFACE
  } IHTMLDocument3Vtbl;

  interface IHTMLDocument3
  {
    CONST_VTBL struct IHTMLDocument3Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLDocument3_releaseCapture_Proxy(IHTMLDocument3 *This);

  void __RPC_STUB IHTMLDocument3_releaseCapture_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_recalc_Proxy(IHTMLDocument3 *This,VARIANT_BOOL fForce);

  void __RPC_STUB IHTMLDocument3_recalc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_createTextNode_Proxy(IHTMLDocument3 *This,BSTR text,IHTMLDOMNode **newTextNode);

  void __RPC_STUB IHTMLDocument3_createTextNode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_documentElement_Proxy(IHTMLDocument3 *This,IHTMLElement **p);

  void __RPC_STUB IHTMLDocument3_get_documentElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_uniqueID_Proxy(IHTMLDocument3 *This,BSTR *p);

  void __RPC_STUB IHTMLDocument3_get_uniqueID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_attachEvent_Proxy(IHTMLDocument3 *This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult);

  void __RPC_STUB IHTMLDocument3_attachEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_detachEvent_Proxy(IHTMLDocument3 *This,BSTR event,IDispatch *pDisp);

  void __RPC_STUB IHTMLDocument3_detachEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_put_onrowsdelete_Proxy(IHTMLDocument3 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument3_put_onrowsdelete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_onrowsdelete_Proxy(IHTMLDocument3 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument3_get_onrowsdelete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_put_onrowsinserted_Proxy(IHTMLDocument3 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument3_put_onrowsinserted_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_onrowsinserted_Proxy(IHTMLDocument3 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument3_get_onrowsinserted_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_put_oncellchange_Proxy(IHTMLDocument3 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument3_put_oncellchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_oncellchange_Proxy(IHTMLDocument3 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument3_get_oncellchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_put_ondatasetchanged_Proxy(IHTMLDocument3 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument3_put_ondatasetchanged_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_ondatasetchanged_Proxy(IHTMLDocument3 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument3_get_ondatasetchanged_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_put_ondataavailable_Proxy(IHTMLDocument3 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument3_put_ondataavailable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_ondataavailable_Proxy(IHTMLDocument3 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument3_get_ondataavailable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_put_ondatasetcomplete_Proxy(IHTMLDocument3 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument3_put_ondatasetcomplete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_ondatasetcomplete_Proxy(IHTMLDocument3 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument3_get_ondatasetcomplete_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_put_onpropertychange_Proxy(IHTMLDocument3 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument3_put_onpropertychange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_onpropertychange_Proxy(IHTMLDocument3 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument3_get_onpropertychange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_put_dir_Proxy(IHTMLDocument3 *This,BSTR v);

  void __RPC_STUB IHTMLDocument3_put_dir_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_dir_Proxy(IHTMLDocument3 *This,BSTR *p);

  void __RPC_STUB IHTMLDocument3_get_dir_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_put_oncontextmenu_Proxy(IHTMLDocument3 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument3_put_oncontextmenu_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_oncontextmenu_Proxy(IHTMLDocument3 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument3_get_oncontextmenu_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_put_onstop_Proxy(IHTMLDocument3 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument3_put_onstop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_onstop_Proxy(IHTMLDocument3 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument3_get_onstop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_createDocumentFragment_Proxy(IHTMLDocument3 *This,IHTMLDocument2 **pNewDoc);

  void __RPC_STUB IHTMLDocument3_createDocumentFragment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_parentDocument_Proxy(IHTMLDocument3 *This,IHTMLDocument2 **p);

  void __RPC_STUB IHTMLDocument3_get_parentDocument_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_put_enableDownload_Proxy(IHTMLDocument3 *This,VARIANT_BOOL v);

  void __RPC_STUB IHTMLDocument3_put_enableDownload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_enableDownload_Proxy(IHTMLDocument3 *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLDocument3_get_enableDownload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_put_baseUrl_Proxy(IHTMLDocument3 *This,BSTR v);

  void __RPC_STUB IHTMLDocument3_put_baseUrl_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_baseUrl_Proxy(IHTMLDocument3 *This,BSTR *p);

  void __RPC_STUB IHTMLDocument3_get_baseUrl_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_childNodes_Proxy(IHTMLDocument3 *This,IDispatch **p);

  void __RPC_STUB IHTMLDocument3_get_childNodes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_put_inheritStyleSheets_Proxy(IHTMLDocument3 *This,VARIANT_BOOL v);

  void __RPC_STUB IHTMLDocument3_put_inheritStyleSheets_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_inheritStyleSheets_Proxy(IHTMLDocument3 *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLDocument3_get_inheritStyleSheets_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_put_onbeforeeditfocus_Proxy(IHTMLDocument3 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument3_put_onbeforeeditfocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_get_onbeforeeditfocus_Proxy(IHTMLDocument3 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument3_get_onbeforeeditfocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_getElementsByName_Proxy(IHTMLDocument3 *This,BSTR v,IHTMLElementCollection **pelColl);

  void __RPC_STUB IHTMLDocument3_getElementsByName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_getElementById_Proxy(IHTMLDocument3 *This,BSTR v,IHTMLElement **pel);

  void __RPC_STUB IHTMLDocument3_getElementById_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument3_getElementsByTagName_Proxy(IHTMLDocument3 *This,BSTR v,IHTMLElementCollection **pelColl);

  void __RPC_STUB IHTMLDocument3_getElementsByTagName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDocument4_INTERFACE_DEFINED__
#define __IHTMLDocument4_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLDocument4;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLDocument4 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI focus(void) = 0;

    virtual HRESULT WINAPI hasFocus(VARIANT_BOOL *pfFocus) = 0;

    virtual HRESULT WINAPI put_onselectionchange(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onselectionchange(VARIANT *p) = 0;

    virtual HRESULT WINAPI get_namespaces(IDispatch **p) = 0;

    virtual HRESULT WINAPI createDocumentFromUrl(BSTR bstrUrl,BSTR bstrOptions,IHTMLDocument2 **newDoc) = 0;

    virtual HRESULT WINAPI put_media(BSTR v) = 0;

    virtual HRESULT WINAPI get_media(BSTR *p) = 0;

    virtual HRESULT WINAPI createEventObject(VARIANT *pvarEventObject,IHTMLEventObj **ppEventObj) = 0;

    virtual HRESULT WINAPI fireEvent(BSTR bstrEventName,VARIANT *pvarEventObject,VARIANT_BOOL *pfCancelled) = 0;

    virtual HRESULT WINAPI createRenderStyle(BSTR v,IHTMLRenderStyle **ppIHTMLRenderStyle) = 0;

    virtual HRESULT WINAPI put_oncontrolselect(VARIANT v) = 0;

    virtual HRESULT WINAPI get_oncontrolselect(VARIANT *p) = 0;

    virtual HRESULT WINAPI get_URLUnencoded(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLDocument4Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLDocument4 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLDocument4 *This);

      ULONG (WINAPI *Release)(IHTMLDocument4 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDocument4 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLDocument4 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *focus)(IHTMLDocument4 *This);

      HRESULT (WINAPI *hasFocus)(IHTMLDocument4 *This,VARIANT_BOOL *pfFocus);

      HRESULT (WINAPI *put_onselectionchange)(IHTMLDocument4 *This,VARIANT v);

      HRESULT (WINAPI *get_onselectionchange)(IHTMLDocument4 *This,VARIANT *p);

      HRESULT (WINAPI *get_namespaces)(IHTMLDocument4 *This,IDispatch **p);

      HRESULT (WINAPI *createDocumentFromUrl)(IHTMLDocument4 *This,BSTR bstrUrl,BSTR bstrOptions,IHTMLDocument2 **newDoc);

      HRESULT (WINAPI *put_media)(IHTMLDocument4 *This,BSTR v);

      HRESULT (WINAPI *get_media)(IHTMLDocument4 *This,BSTR *p);

      HRESULT (WINAPI *createEventObject)(IHTMLDocument4 *This,VARIANT *pvarEventObject,IHTMLEventObj **ppEventObj);

      HRESULT (WINAPI *fireEvent)(IHTMLDocument4 *This,BSTR bstrEventName,VARIANT *pvarEventObject,VARIANT_BOOL *pfCancelled);

      HRESULT (WINAPI *createRenderStyle)(IHTMLDocument4 *This,BSTR v,IHTMLRenderStyle **ppIHTMLRenderStyle);

      HRESULT (WINAPI *put_oncontrolselect)(IHTMLDocument4 *This,VARIANT v);

      HRESULT (WINAPI *get_oncontrolselect)(IHTMLDocument4 *This,VARIANT *p);

      HRESULT (WINAPI *get_URLUnencoded)(IHTMLDocument4 *This,BSTR *p);

    END_INTERFACE
  } IHTMLDocument4Vtbl;

  interface IHTMLDocument4
  {
    CONST_VTBL struct IHTMLDocument4Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLDocument4_focus_Proxy(IHTMLDocument4 *This);

  void __RPC_STUB IHTMLDocument4_focus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument4_hasFocus_Proxy(IHTMLDocument4 *This,VARIANT_BOOL *pfFocus);

  void __RPC_STUB IHTMLDocument4_hasFocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument4_put_onselectionchange_Proxy(IHTMLDocument4 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument4_put_onselectionchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument4_get_onselectionchange_Proxy(IHTMLDocument4 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument4_get_onselectionchange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument4_get_namespaces_Proxy(IHTMLDocument4 *This,IDispatch **p);

  void __RPC_STUB IHTMLDocument4_get_namespaces_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument4_createDocumentFromUrl_Proxy(IHTMLDocument4 *This,BSTR bstrUrl,BSTR bstrOptions,IHTMLDocument2 **newDoc);

  void __RPC_STUB IHTMLDocument4_createDocumentFromUrl_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument4_put_media_Proxy(IHTMLDocument4 *This,BSTR v);

  void __RPC_STUB IHTMLDocument4_put_media_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument4_get_media_Proxy(IHTMLDocument4 *This,BSTR *p);

  void __RPC_STUB IHTMLDocument4_get_media_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument4_createEventObject_Proxy(IHTMLDocument4 *This,VARIANT *pvarEventObject,IHTMLEventObj **ppEventObj);

  void __RPC_STUB IHTMLDocument4_createEventObject_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument4_fireEvent_Proxy(IHTMLDocument4 *This,BSTR bstrEventName,VARIANT *pvarEventObject,VARIANT_BOOL *pfCancelled);

  void __RPC_STUB IHTMLDocument4_fireEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument4_createRenderStyle_Proxy(IHTMLDocument4 *This,BSTR v,IHTMLRenderStyle **ppIHTMLRenderStyle);

  void __RPC_STUB IHTMLDocument4_createRenderStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument4_put_oncontrolselect_Proxy(IHTMLDocument4 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument4_put_oncontrolselect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument4_get_oncontrolselect_Proxy(IHTMLDocument4 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument4_get_oncontrolselect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument4_get_URLUnencoded_Proxy(IHTMLDocument4 *This,BSTR *p);

  void __RPC_STUB IHTMLDocument4_get_URLUnencoded_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDocument5_INTERFACE_DEFINED__
#define __IHTMLDocument5_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLDocument5;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLDocument5 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_onmousewheel(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onmousewheel(VARIANT *p) = 0;

    virtual HRESULT WINAPI get_doctype(IHTMLDOMNode **p) = 0;

    virtual HRESULT WINAPI get_implementation(IHTMLDOMImplementation **p) = 0;

    virtual HRESULT WINAPI createAttribute(BSTR bstrattrName,IHTMLDOMAttribute **ppattribute) = 0;

    virtual HRESULT WINAPI createComment(BSTR bstrdata,IHTMLDOMNode **ppRetNode) = 0;

    virtual HRESULT WINAPI put_onfocusin(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onfocusin(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onfocusout(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onfocusout(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onactivate(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onactivate(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_ondeactivate(VARIANT v) = 0;

    virtual HRESULT WINAPI get_ondeactivate(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onbeforeactivate(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onbeforeactivate(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onbeforedeactivate(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onbeforedeactivate(VARIANT *p) = 0;

    virtual HRESULT WINAPI get_compatMode(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLDocument5Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLDocument5 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLDocument5 *This);

      ULONG (WINAPI *Release)(IHTMLDocument5 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDocument5 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLDocument5 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_onmousewheel)(IHTMLDocument5 *This,VARIANT v);

      HRESULT (WINAPI *get_onmousewheel)(IHTMLDocument5 *This,VARIANT *p);

      HRESULT (WINAPI *get_doctype)(IHTMLDocument5 *This,IHTMLDOMNode **p);

      HRESULT (WINAPI *get_implementation)(IHTMLDocument5 *This,IHTMLDOMImplementation **p);

      HRESULT (WINAPI *createAttribute)(IHTMLDocument5 *This,BSTR bstrattrName,IHTMLDOMAttribute **ppattribute);

      HRESULT (WINAPI *createComment)(IHTMLDocument5 *This,BSTR bstrdata,IHTMLDOMNode **ppRetNode);

      HRESULT (WINAPI *put_onfocusin)(IHTMLDocument5 *This,VARIANT v);

      HRESULT (WINAPI *get_onfocusin)(IHTMLDocument5 *This,VARIANT *p);

      HRESULT (WINAPI *put_onfocusout)(IHTMLDocument5 *This,VARIANT v);

      HRESULT (WINAPI *get_onfocusout)(IHTMLDocument5 *This,VARIANT *p);

      HRESULT (WINAPI *put_onactivate)(IHTMLDocument5 *This,VARIANT v);

      HRESULT (WINAPI *get_onactivate)(IHTMLDocument5 *This,VARIANT *p);

      HRESULT (WINAPI *put_ondeactivate)(IHTMLDocument5 *This,VARIANT v);

      HRESULT (WINAPI *get_ondeactivate)(IHTMLDocument5 *This,VARIANT *p);

      HRESULT (WINAPI *put_onbeforeactivate)(IHTMLDocument5 *This,VARIANT v);

      HRESULT (WINAPI *get_onbeforeactivate)(IHTMLDocument5 *This,VARIANT *p);

      HRESULT (WINAPI *put_onbeforedeactivate)(IHTMLDocument5 *This,VARIANT v);

      HRESULT (WINAPI *get_onbeforedeactivate)(IHTMLDocument5 *This,VARIANT *p);

      HRESULT (WINAPI *get_compatMode)(IHTMLDocument5 *This,BSTR *p);

    END_INTERFACE
  } IHTMLDocument5Vtbl;

  interface IHTMLDocument5
  {
    CONST_VTBL struct IHTMLDocument5Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLDocument5_put_onmousewheel_Proxy(IHTMLDocument5 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument5_put_onmousewheel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_get_onmousewheel_Proxy(IHTMLDocument5 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument5_get_onmousewheel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_get_doctype_Proxy(IHTMLDocument5 *This,IHTMLDOMNode **p);

  void __RPC_STUB IHTMLDocument5_get_doctype_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_get_implementation_Proxy(IHTMLDocument5 *This,IHTMLDOMImplementation **p);

  void __RPC_STUB IHTMLDocument5_get_implementation_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_createAttribute_Proxy(IHTMLDocument5 *This,BSTR bstrattrName,IHTMLDOMAttribute **ppattribute);

  void __RPC_STUB IHTMLDocument5_createAttribute_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_createComment_Proxy(IHTMLDocument5 *This,BSTR bstrdata,IHTMLDOMNode **ppRetNode);

  void __RPC_STUB IHTMLDocument5_createComment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_put_onfocusin_Proxy(IHTMLDocument5 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument5_put_onfocusin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_get_onfocusin_Proxy(IHTMLDocument5 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument5_get_onfocusin_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_put_onfocusout_Proxy(IHTMLDocument5 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument5_put_onfocusout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_get_onfocusout_Proxy(IHTMLDocument5 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument5_get_onfocusout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_put_onactivate_Proxy(IHTMLDocument5 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument5_put_onactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_get_onactivate_Proxy(IHTMLDocument5 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument5_get_onactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_put_ondeactivate_Proxy(IHTMLDocument5 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument5_put_ondeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_get_ondeactivate_Proxy(IHTMLDocument5 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument5_get_ondeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_put_onbeforeactivate_Proxy(IHTMLDocument5 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument5_put_onbeforeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_get_onbeforeactivate_Proxy(IHTMLDocument5 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument5_get_onbeforeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_put_onbeforedeactivate_Proxy(IHTMLDocument5 *This,VARIANT v);

  void __RPC_STUB IHTMLDocument5_put_onbeforedeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_get_onbeforedeactivate_Proxy(IHTMLDocument5 *This,VARIANT *p);

  void __RPC_STUB IHTMLDocument5_get_onbeforedeactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDocument5_get_compatMode_Proxy(IHTMLDocument5 *This,BSTR *p);

  void __RPC_STUB IHTMLDocument5_get_compatMode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLDocument_DISPINTERFACE_DEFINED__
#define __DispHTMLDocument_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLDocument;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLDocument : public IDispatch
  {
  };
#else

  typedef struct DispHTMLDocumentVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLDocument *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLDocument *This);

      ULONG (WINAPI *Release)(DispHTMLDocument *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLDocument *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLDocument *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLDocumentVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLDocument;

#ifdef __cplusplus

  class HTMLDocument;
#endif

#ifndef __DWebBridgeEvents_DISPINTERFACE_DEFINED__
#define __DWebBridgeEvents_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DWebBridgeEvents;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DWebBridgeEvents : public IDispatch
  {
  };
#else

  typedef struct DWebBridgeEventsVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DWebBridgeEvents *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DWebBridgeEvents *This);

      ULONG (WINAPI *Release)(DWebBridgeEvents *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DWebBridgeEvents *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DWebBridgeEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DWebBridgeEventsVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __IWebBridge_INTERFACE_DEFINED__
#define __IWebBridge_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IWebBridge;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IWebBridge : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_URL(BSTR v) = 0;

    virtual HRESULT WINAPI get_URL(BSTR *p) = 0;

    virtual HRESULT WINAPI put_Scrollbar(VARIANT_BOOL v) = 0;

    virtual HRESULT WINAPI get_Scrollbar(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI put_embed(VARIANT_BOOL v) = 0;

    virtual HRESULT WINAPI get_embed(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_event(IDispatch **p) = 0;

    virtual HRESULT WINAPI get_readyState(long *p) = 0;

    virtual HRESULT WINAPI AboutBox(void) = 0;

  };
#else

  typedef struct IWebBridgeVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IWebBridge *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IWebBridge *This);

      ULONG (WINAPI *Release)(IWebBridge *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IWebBridge *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IWebBridge *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_URL)(IWebBridge *This,BSTR v);

      HRESULT (WINAPI *get_URL)(IWebBridge *This,BSTR *p);

      HRESULT (WINAPI *put_Scrollbar)(IWebBridge *This,VARIANT_BOOL v);

      HRESULT (WINAPI *get_Scrollbar)(IWebBridge *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *put_embed)(IWebBridge *This,VARIANT_BOOL v);

      HRESULT (WINAPI *get_embed)(IWebBridge *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_event)(IWebBridge *This,IDispatch **p);

      HRESULT (WINAPI *get_readyState)(IWebBridge *This,long *p);

      HRESULT (WINAPI *AboutBox)(IWebBridge *This);

    END_INTERFACE
  } IWebBridgeVtbl;

  interface IWebBridge
  {
    CONST_VTBL struct IWebBridgeVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IWebBridge_put_URL_Proxy(IWebBridge *This,BSTR v);

  void __RPC_STUB IWebBridge_put_URL_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWebBridge_get_URL_Proxy(IWebBridge *This,BSTR *p);

  void __RPC_STUB IWebBridge_get_URL_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWebBridge_put_Scrollbar_Proxy(IWebBridge *This,VARIANT_BOOL v);

  void __RPC_STUB IWebBridge_put_Scrollbar_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWebBridge_get_Scrollbar_Proxy(IWebBridge *This,VARIANT_BOOL *p);

  void __RPC_STUB IWebBridge_get_Scrollbar_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWebBridge_put_embed_Proxy(IWebBridge *This,VARIANT_BOOL v);

  void __RPC_STUB IWebBridge_put_embed_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWebBridge_get_embed_Proxy(IWebBridge *This,VARIANT_BOOL *p);

  void __RPC_STUB IWebBridge_get_embed_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWebBridge_get_event_Proxy(IWebBridge *This,IDispatch **p);

  void __RPC_STUB IWebBridge_get_event_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWebBridge_get_readyState_Proxy(IWebBridge *This,long *p);

  void __RPC_STUB IWebBridge_get_readyState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWebBridge_AboutBox_Proxy(IWebBridge *This);

  void __RPC_STUB IWebBridge_AboutBox_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IWBScriptControl_INTERFACE_DEFINED__
#define __IWBScriptControl_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IWBScriptControl;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IWBScriptControl : public IDispatch
  {
  public:
    virtual HRESULT WINAPI raiseEvent(BSTR name,VARIANT eventData) = 0;

    virtual HRESULT WINAPI bubbleEvent(void) = 0;

    virtual HRESULT WINAPI setContextMenu(VARIANT menuItemPairs) = 0;

    virtual HRESULT WINAPI put_selectableContent(VARIANT_BOOL v) = 0;

    virtual HRESULT WINAPI get_selectableContent(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_frozen(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI put_scrollbar(VARIANT_BOOL v) = 0;

    virtual HRESULT WINAPI get_scrollbar(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_version(BSTR *p) = 0;

    virtual HRESULT WINAPI get_visibility(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI put_onvisibilitychange(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onvisibilitychange(VARIANT *p) = 0;

  };
#else

  typedef struct IWBScriptControlVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IWBScriptControl *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IWBScriptControl *This);

      ULONG (WINAPI *Release)(IWBScriptControl *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IWBScriptControl *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IWBScriptControl *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *raiseEvent)(IWBScriptControl *This,BSTR name,VARIANT eventData);

      HRESULT (WINAPI *bubbleEvent)(IWBScriptControl *This);

      HRESULT (WINAPI *setContextMenu)(IWBScriptControl *This,VARIANT menuItemPairs);

      HRESULT (WINAPI *put_selectableContent)(IWBScriptControl *This,VARIANT_BOOL v);

      HRESULT (WINAPI *get_selectableContent)(IWBScriptControl *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_frozen)(IWBScriptControl *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *put_scrollbar)(IWBScriptControl *This,VARIANT_BOOL v);

      HRESULT (WINAPI *get_scrollbar)(IWBScriptControl *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_version)(IWBScriptControl *This,BSTR *p);

      HRESULT (WINAPI *get_visibility)(IWBScriptControl *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *put_onvisibilitychange)(IWBScriptControl *This,VARIANT v);

      HRESULT (WINAPI *get_onvisibilitychange)(IWBScriptControl *This,VARIANT *p);

    END_INTERFACE
  } IWBScriptControlVtbl;

  interface IWBScriptControl
  {
    CONST_VTBL struct IWBScriptControlVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IWBScriptControl_raiseEvent_Proxy(IWBScriptControl *This,BSTR name,VARIANT eventData);

  void __RPC_STUB IWBScriptControl_raiseEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWBScriptControl_bubbleEvent_Proxy(IWBScriptControl *This);

  void __RPC_STUB IWBScriptControl_bubbleEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWBScriptControl_setContextMenu_Proxy(IWBScriptControl *This,VARIANT menuItemPairs);

  void __RPC_STUB IWBScriptControl_setContextMenu_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWBScriptControl_put_selectableContent_Proxy(IWBScriptControl *This,VARIANT_BOOL v);

  void __RPC_STUB IWBScriptControl_put_selectableContent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWBScriptControl_get_selectableContent_Proxy(IWBScriptControl *This,VARIANT_BOOL *p);

  void __RPC_STUB IWBScriptControl_get_selectableContent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWBScriptControl_get_frozen_Proxy(IWBScriptControl *This,VARIANT_BOOL *p);

  void __RPC_STUB IWBScriptControl_get_frozen_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWBScriptControl_put_scrollbar_Proxy(IWBScriptControl *This,VARIANT_BOOL v);

  void __RPC_STUB IWBScriptControl_put_scrollbar_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWBScriptControl_get_scrollbar_Proxy(IWBScriptControl *This,VARIANT_BOOL *p);

  void __RPC_STUB IWBScriptControl_get_scrollbar_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWBScriptControl_get_version_Proxy(IWBScriptControl *This,BSTR *p);

  void __RPC_STUB IWBScriptControl_get_version_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWBScriptControl_get_visibility_Proxy(IWBScriptControl *This,VARIANT_BOOL *p);

  void __RPC_STUB IWBScriptControl_get_visibility_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWBScriptControl_put_onvisibilitychange_Proxy(IWBScriptControl *This,VARIANT v);

  void __RPC_STUB IWBScriptControl_put_onvisibilitychange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IWBScriptControl_get_onvisibilitychange_Proxy(IWBScriptControl *This,VARIANT *p);

  void __RPC_STUB IWBScriptControl_get_onvisibilitychange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  EXTERN_C const CLSID CLSID_Scriptlet;

#ifdef __cplusplus

  class Scriptlet;
#endif

#ifndef __IHTMLEmbedElement_INTERFACE_DEFINED__
#define __IHTMLEmbedElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLEmbedElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLEmbedElement : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_hidden(BSTR v) = 0;

    virtual HRESULT WINAPI get_hidden(BSTR *p) = 0;

    virtual HRESULT WINAPI get_palette(BSTR *p) = 0;

    virtual HRESULT WINAPI get_pluginspage(BSTR *p) = 0;

    virtual HRESULT WINAPI put_src(BSTR v) = 0;

    virtual HRESULT WINAPI get_src(BSTR *p) = 0;

    virtual HRESULT WINAPI put_units(BSTR v) = 0;

    virtual HRESULT WINAPI get_units(BSTR *p) = 0;

    virtual HRESULT WINAPI put_name(BSTR v) = 0;

    virtual HRESULT WINAPI get_name(BSTR *p) = 0;

    virtual HRESULT WINAPI put_width(VARIANT v) = 0;

    virtual HRESULT WINAPI get_width(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_height(VARIANT v) = 0;

    virtual HRESULT WINAPI get_height(VARIANT *p) = 0;

  };
#else

  typedef struct IHTMLEmbedElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLEmbedElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLEmbedElement *This);

      ULONG (WINAPI *Release)(IHTMLEmbedElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLEmbedElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLEmbedElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_hidden)(IHTMLEmbedElement *This,BSTR v);

      HRESULT (WINAPI *get_hidden)(IHTMLEmbedElement *This,BSTR *p);

      HRESULT (WINAPI *get_palette)(IHTMLEmbedElement *This,BSTR *p);

      HRESULT (WINAPI *get_pluginspage)(IHTMLEmbedElement *This,BSTR *p);

      HRESULT (WINAPI *put_src)(IHTMLEmbedElement *This,BSTR v);

      HRESULT (WINAPI *get_src)(IHTMLEmbedElement *This,BSTR *p);

      HRESULT (WINAPI *put_units)(IHTMLEmbedElement *This,BSTR v);

      HRESULT (WINAPI *get_units)(IHTMLEmbedElement *This,BSTR *p);

      HRESULT (WINAPI *put_name)(IHTMLEmbedElement *This,BSTR v);

      HRESULT (WINAPI *get_name)(IHTMLEmbedElement *This,BSTR *p);

      HRESULT (WINAPI *put_width)(IHTMLEmbedElement *This,VARIANT v);

      HRESULT (WINAPI *get_width)(IHTMLEmbedElement *This,VARIANT *p);

      HRESULT (WINAPI *put_height)(IHTMLEmbedElement *This,VARIANT v);

      HRESULT (WINAPI *get_height)(IHTMLEmbedElement *This,VARIANT *p);

    END_INTERFACE
  } IHTMLEmbedElementVtbl;

  interface IHTMLEmbedElement
  {
    CONST_VTBL struct IHTMLEmbedElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLEmbedElement_put_hidden_Proxy(IHTMLEmbedElement *This,BSTR v);

  void __RPC_STUB IHTMLEmbedElement_put_hidden_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEmbedElement_get_hidden_Proxy(IHTMLEmbedElement *This,BSTR *p);

  void __RPC_STUB IHTMLEmbedElement_get_hidden_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEmbedElement_get_palette_Proxy(IHTMLEmbedElement *This,BSTR *p);

  void __RPC_STUB IHTMLEmbedElement_get_palette_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEmbedElement_get_pluginspage_Proxy(IHTMLEmbedElement *This,BSTR *p);

  void __RPC_STUB IHTMLEmbedElement_get_pluginspage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEmbedElement_put_src_Proxy(IHTMLEmbedElement *This,BSTR v);

  void __RPC_STUB IHTMLEmbedElement_put_src_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEmbedElement_get_src_Proxy(IHTMLEmbedElement *This,BSTR *p);

  void __RPC_STUB IHTMLEmbedElement_get_src_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEmbedElement_put_units_Proxy(IHTMLEmbedElement *This,BSTR v);

  void __RPC_STUB IHTMLEmbedElement_put_units_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEmbedElement_get_units_Proxy(IHTMLEmbedElement *This,BSTR *p);

  void __RPC_STUB IHTMLEmbedElement_get_units_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEmbedElement_put_name_Proxy(IHTMLEmbedElement *This,BSTR v);

  void __RPC_STUB IHTMLEmbedElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEmbedElement_get_name_Proxy(IHTMLEmbedElement *This,BSTR *p);

  void __RPC_STUB IHTMLEmbedElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEmbedElement_put_width_Proxy(IHTMLEmbedElement *This,VARIANT v);

  void __RPC_STUB IHTMLEmbedElement_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEmbedElement_get_width_Proxy(IHTMLEmbedElement *This,VARIANT *p);

  void __RPC_STUB IHTMLEmbedElement_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEmbedElement_put_height_Proxy(IHTMLEmbedElement *This,VARIANT v);

  void __RPC_STUB IHTMLEmbedElement_put_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEmbedElement_get_height_Proxy(IHTMLEmbedElement *This,VARIANT *p);

  void __RPC_STUB IHTMLEmbedElement_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLEmbed_DISPINTERFACE_DEFINED__
#define __DispHTMLEmbed_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLEmbed;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLEmbed : public IDispatch
  {
  };
#else

  typedef struct DispHTMLEmbedVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLEmbed *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLEmbed *This);

      ULONG (WINAPI *Release)(DispHTMLEmbed *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLEmbed *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLEmbed *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLEmbedVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLEmbed;

#ifdef __cplusplus

  class HTMLEmbed;
#endif

#ifndef __HTMLMapEvents2_DISPINTERFACE_DEFINED__
#define __HTMLMapEvents2_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLMapEvents2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLMapEvents2 : public IDispatch
  {
  };
#else

  typedef struct HTMLMapEvents2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLMapEvents2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLMapEvents2 *This);

      ULONG (WINAPI *Release)(HTMLMapEvents2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLMapEvents2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLMapEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLMapEvents2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __HTMLMapEvents_DISPINTERFACE_DEFINED__
#define __HTMLMapEvents_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLMapEvents;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLMapEvents : public IDispatch
  {
  };
#else

  typedef struct HTMLMapEventsVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLMapEvents *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLMapEvents *This);

      ULONG (WINAPI *Release)(HTMLMapEvents *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLMapEvents *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLMapEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLMapEventsVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __IHTMLAreasCollection_INTERFACE_DEFINED__
#define __IHTMLAreasCollection_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLAreasCollection;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLAreasCollection : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_length(long v) = 0;

    virtual HRESULT WINAPI get_length(long *p) = 0;

    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;

    virtual HRESULT WINAPI item(VARIANT name,VARIANT index,IDispatch **pdisp) = 0;

    virtual HRESULT WINAPI tags(VARIANT tagName,IDispatch **pdisp) = 0;

    virtual HRESULT WINAPI add(IHTMLElement *element,VARIANT before) = 0;

    virtual HRESULT WINAPI remove(long index = -1) = 0;

  };
#else

  typedef struct IHTMLAreasCollectionVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLAreasCollection *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLAreasCollection *This);

      ULONG (WINAPI *Release)(IHTMLAreasCollection *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLAreasCollection *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLAreasCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_length)(IHTMLAreasCollection *This,long v);

      HRESULT (WINAPI *get_length)(IHTMLAreasCollection *This,long *p);

      HRESULT (WINAPI *get__newEnum)(IHTMLAreasCollection *This,IUnknown **p);

      HRESULT (WINAPI *item)(IHTMLAreasCollection *This,VARIANT name,VARIANT index,IDispatch **pdisp);

      HRESULT (WINAPI *tags)(IHTMLAreasCollection *This,VARIANT tagName,IDispatch **pdisp);

      HRESULT (WINAPI *add)(IHTMLAreasCollection *This,IHTMLElement *element,VARIANT before);

      HRESULT (WINAPI *remove)(IHTMLAreasCollection *This,long index);

    END_INTERFACE
  } IHTMLAreasCollectionVtbl;

  interface IHTMLAreasCollection
  {
    CONST_VTBL struct IHTMLAreasCollectionVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLAreasCollection_put_length_Proxy(IHTMLAreasCollection *This,long v);

  void __RPC_STUB IHTMLAreasCollection_put_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreasCollection_get_length_Proxy(IHTMLAreasCollection *This,long *p);

  void __RPC_STUB IHTMLAreasCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreasCollection_get__newEnum_Proxy(IHTMLAreasCollection *This,IUnknown **p);

  void __RPC_STUB IHTMLAreasCollection_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreasCollection_item_Proxy(IHTMLAreasCollection *This,VARIANT name,VARIANT index,IDispatch **pdisp);

  void __RPC_STUB IHTMLAreasCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreasCollection_tags_Proxy(IHTMLAreasCollection *This,VARIANT tagName,IDispatch **pdisp);

  void __RPC_STUB IHTMLAreasCollection_tags_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreasCollection_add_Proxy(IHTMLAreasCollection *This,IHTMLElement *element,VARIANT before);

  void __RPC_STUB IHTMLAreasCollection_add_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreasCollection_remove_Proxy(IHTMLAreasCollection *This,long index);

  void __RPC_STUB IHTMLAreasCollection_remove_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLAreasCollection2_INTERFACE_DEFINED__
#define __IHTMLAreasCollection2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLAreasCollection2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLAreasCollection2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI urns(VARIANT urn,IDispatch **pdisp) = 0;

  };
#else

  typedef struct IHTMLAreasCollection2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLAreasCollection2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLAreasCollection2 *This);

      ULONG (WINAPI *Release)(IHTMLAreasCollection2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLAreasCollection2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLAreasCollection2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *urns)(IHTMLAreasCollection2 *This,VARIANT urn,IDispatch **pdisp);

    END_INTERFACE
  } IHTMLAreasCollection2Vtbl;

  interface IHTMLAreasCollection2
  {
    CONST_VTBL struct IHTMLAreasCollection2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLAreasCollection2_urns(This,urn,pdisp) (This)->lpVtbl->urns(This,urn,pdisp)
#endif
#endif

  HRESULT WINAPI IHTMLAreasCollection2_urns_Proxy(IHTMLAreasCollection2 *This,VARIANT urn,IDispatch **pdisp);

  void __RPC_STUB IHTMLAreasCollection2_urns_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLAreasCollection3_INTERFACE_DEFINED__
#define __IHTMLAreasCollection3_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLAreasCollection3;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLAreasCollection3 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI namedItem(BSTR name,IDispatch **pdisp) = 0;

  };
#else

  typedef struct IHTMLAreasCollection3Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLAreasCollection3 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLAreasCollection3 *This);

      ULONG (WINAPI *Release)(IHTMLAreasCollection3 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLAreasCollection3 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLAreasCollection3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *namedItem)(IHTMLAreasCollection3 *This,BSTR name,IDispatch **pdisp);

    END_INTERFACE
  } IHTMLAreasCollection3Vtbl;

  interface IHTMLAreasCollection3
  {
    CONST_VTBL struct IHTMLAreasCollection3Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLAreasCollection3_namedItem(This,name,pdisp) (This)->lpVtbl->namedItem(This,name,pdisp)
#endif
#endif

  HRESULT WINAPI IHTMLAreasCollection3_namedItem_Proxy(IHTMLAreasCollection3 *This,BSTR name,IDispatch **pdisp);

  void __RPC_STUB IHTMLAreasCollection3_namedItem_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLMapElement_INTERFACE_DEFINED__
#define __IHTMLMapElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLMapElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLMapElement : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get_areas(IHTMLAreasCollection **p) = 0;

    virtual HRESULT WINAPI put_name(BSTR v) = 0;

    virtual HRESULT WINAPI get_name(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLMapElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLMapElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLMapElement *This);

      ULONG (WINAPI *Release)(IHTMLMapElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLMapElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLMapElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get_areas)(IHTMLMapElement *This,IHTMLAreasCollection **p);

      HRESULT (WINAPI *put_name)(IHTMLMapElement *This,BSTR v);

      HRESULT (WINAPI *get_name)(IHTMLMapElement *This,BSTR *p);

    END_INTERFACE
  } IHTMLMapElementVtbl;

  interface IHTMLMapElement
  {
    CONST_VTBL struct IHTMLMapElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLMapElement_get_areas_Proxy(IHTMLMapElement *This,IHTMLAreasCollection **p);

  void __RPC_STUB IHTMLMapElement_get_areas_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLMapElement_put_name_Proxy(IHTMLMapElement *This,BSTR v);

  void __RPC_STUB IHTMLMapElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLMapElement_get_name_Proxy(IHTMLMapElement *This,BSTR *p);

  void __RPC_STUB IHTMLMapElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLAreasCollection_DISPINTERFACE_DEFINED__
#define __DispHTMLAreasCollection_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLAreasCollection;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLAreasCollection : public IDispatch
  {
  };
#else

  typedef struct DispHTMLAreasCollectionVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLAreasCollection *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLAreasCollection *This);

      ULONG (WINAPI *Release)(DispHTMLAreasCollection *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLAreasCollection *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLAreasCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLAreasCollectionVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLAreasCollection;

#ifdef __cplusplus

  class HTMLAreasCollection;
#endif

#ifndef __DispHTMLMapElement_DISPINTERFACE_DEFINED__
#define __DispHTMLMapElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLMapElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLMapElement : public IDispatch
  {
  };
#else

  typedef struct DispHTMLMapElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLMapElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLMapElement *This);

      ULONG (WINAPI *Release)(DispHTMLMapElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLMapElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLMapElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLMapElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLMapElement;

#ifdef __cplusplus

  class HTMLMapElement;
#endif

#ifndef __HTMLAreaEvents2_DISPINTERFACE_DEFINED__
#define __HTMLAreaEvents2_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLAreaEvents2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLAreaEvents2 : public IDispatch
  {
  };
#else

  typedef struct HTMLAreaEvents2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLAreaEvents2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLAreaEvents2 *This);

      ULONG (WINAPI *Release)(HTMLAreaEvents2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLAreaEvents2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLAreaEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLAreaEvents2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __HTMLAreaEvents_DISPINTERFACE_DEFINED__
#define __HTMLAreaEvents_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLAreaEvents;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLAreaEvents : public IDispatch
  {
  };
#else

  typedef struct HTMLAreaEventsVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLAreaEvents *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLAreaEvents *This);

      ULONG (WINAPI *Release)(HTMLAreaEvents *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLAreaEvents *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLAreaEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLAreaEventsVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __IHTMLAreaElement_INTERFACE_DEFINED__
#define __IHTMLAreaElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLAreaElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLAreaElement : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_shape(BSTR v) = 0;

    virtual HRESULT WINAPI get_shape(BSTR *p) = 0;

    virtual HRESULT WINAPI put_coords(BSTR v) = 0;

    virtual HRESULT WINAPI get_coords(BSTR *p) = 0;

    virtual HRESULT WINAPI put_href(BSTR v) = 0;

    virtual HRESULT WINAPI get_href(BSTR *p) = 0;

    virtual HRESULT WINAPI put_target(BSTR v) = 0;

    virtual HRESULT WINAPI get_target(BSTR *p) = 0;

    virtual HRESULT WINAPI put_alt(BSTR v) = 0;

    virtual HRESULT WINAPI get_alt(BSTR *p) = 0;

    virtual HRESULT WINAPI put_noHref(VARIANT_BOOL v) = 0;

    virtual HRESULT WINAPI get_noHref(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI put_host(BSTR v) = 0;

    virtual HRESULT WINAPI get_host(BSTR *p) = 0;

    virtual HRESULT WINAPI put_hostname(BSTR v) = 0;

    virtual HRESULT WINAPI get_hostname(BSTR *p) = 0;

    virtual HRESULT WINAPI put_pathname(BSTR v) = 0;

    virtual HRESULT WINAPI get_pathname(BSTR *p) = 0;

    virtual HRESULT WINAPI put_port(BSTR v) = 0;

    virtual HRESULT WINAPI get_port(BSTR *p) = 0;

    virtual HRESULT WINAPI put_protocol(BSTR v) = 0;

    virtual HRESULT WINAPI get_protocol(BSTR *p) = 0;

    virtual HRESULT WINAPI put_search(BSTR v) = 0;

    virtual HRESULT WINAPI get_search(BSTR *p) = 0;

    virtual HRESULT WINAPI put_hash(BSTR v) = 0;

    virtual HRESULT WINAPI get_hash(BSTR *p) = 0;

    virtual HRESULT WINAPI put_onblur(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onblur(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onfocus(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onfocus(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_tabIndex(short v) = 0;

    virtual HRESULT WINAPI get_tabIndex(short *p) = 0;

    virtual HRESULT WINAPI focus(void) = 0;

    virtual HRESULT WINAPI blur(void) = 0;

  };
#else

  typedef struct IHTMLAreaElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLAreaElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLAreaElement *This);

      ULONG (WINAPI *Release)(IHTMLAreaElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLAreaElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLAreaElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_shape)(IHTMLAreaElement *This,BSTR v);

      HRESULT (WINAPI *get_shape)(IHTMLAreaElement *This,BSTR *p);

      HRESULT (WINAPI *put_coords)(IHTMLAreaElement *This,BSTR v);

      HRESULT (WINAPI *get_coords)(IHTMLAreaElement *This,BSTR *p);

      HRESULT (WINAPI *put_href)(IHTMLAreaElement *This,BSTR v);

      HRESULT (WINAPI *get_href)(IHTMLAreaElement *This,BSTR *p);

      HRESULT (WINAPI *put_target)(IHTMLAreaElement *This,BSTR v);

      HRESULT (WINAPI *get_target)(IHTMLAreaElement *This,BSTR *p);

      HRESULT (WINAPI *put_alt)(IHTMLAreaElement *This,BSTR v);

      HRESULT (WINAPI *get_alt)(IHTMLAreaElement *This,BSTR *p);

      HRESULT (WINAPI *put_noHref)(IHTMLAreaElement *This,VARIANT_BOOL v);

      HRESULT (WINAPI *get_noHref)(IHTMLAreaElement *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *put_host)(IHTMLAreaElement *This,BSTR v);

      HRESULT (WINAPI *get_host)(IHTMLAreaElement *This,BSTR *p);

      HRESULT (WINAPI *put_hostname)(IHTMLAreaElement *This,BSTR v);

      HRESULT (WINAPI *get_hostname)(IHTMLAreaElement *This,BSTR *p);

      HRESULT (WINAPI *put_pathname)(IHTMLAreaElement *This,BSTR v);

      HRESULT (WINAPI *get_pathname)(IHTMLAreaElement *This,BSTR *p);

      HRESULT (WINAPI *put_port)(IHTMLAreaElement *This,BSTR v);

      HRESULT (WINAPI *get_port)(IHTMLAreaElement *This,BSTR *p);

      HRESULT (WINAPI *put_protocol)(IHTMLAreaElement *This,BSTR v);

      HRESULT (WINAPI *get_protocol)(IHTMLAreaElement *This,BSTR *p);

      HRESULT (WINAPI *put_search)(IHTMLAreaElement *This,BSTR v);

      HRESULT (WINAPI *get_search)(IHTMLAreaElement *This,BSTR *p);

      HRESULT (WINAPI *put_hash)(IHTMLAreaElement *This,BSTR v);

      HRESULT (WINAPI *get_hash)(IHTMLAreaElement *This,BSTR *p);

      HRESULT (WINAPI *put_onblur)(IHTMLAreaElement *This,VARIANT v);

      HRESULT (WINAPI *get_onblur)(IHTMLAreaElement *This,VARIANT *p);

      HRESULT (WINAPI *put_onfocus)(IHTMLAreaElement *This,VARIANT v);

      HRESULT (WINAPI *get_onfocus)(IHTMLAreaElement *This,VARIANT *p);

      HRESULT (WINAPI *put_tabIndex)(IHTMLAreaElement *This,short v);

      HRESULT (WINAPI *get_tabIndex)(IHTMLAreaElement *This,short *p);

      HRESULT (WINAPI *focus)(IHTMLAreaElement *This);

      HRESULT (WINAPI *blur)(IHTMLAreaElement *This);

    END_INTERFACE
  } IHTMLAreaElementVtbl;

  interface IHTMLAreaElement
  {
    CONST_VTBL struct IHTMLAreaElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLAreaElement_put_shape_Proxy(IHTMLAreaElement *This,BSTR v);

  void __RPC_STUB IHTMLAreaElement_put_shape_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_shape_Proxy(IHTMLAreaElement *This,BSTR *p);

  void __RPC_STUB IHTMLAreaElement_get_shape_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_coords_Proxy(IHTMLAreaElement *This,BSTR v);

  void __RPC_STUB IHTMLAreaElement_put_coords_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_coords_Proxy(IHTMLAreaElement *This,BSTR *p);

  void __RPC_STUB IHTMLAreaElement_get_coords_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_href_Proxy(IHTMLAreaElement *This,BSTR v);

  void __RPC_STUB IHTMLAreaElement_put_href_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_href_Proxy(IHTMLAreaElement *This,BSTR *p);

  void __RPC_STUB IHTMLAreaElement_get_href_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_target_Proxy(IHTMLAreaElement *This,BSTR v);

  void __RPC_STUB IHTMLAreaElement_put_target_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_target_Proxy(IHTMLAreaElement *This,BSTR *p);

  void __RPC_STUB IHTMLAreaElement_get_target_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_alt_Proxy(IHTMLAreaElement *This,BSTR v);

  void __RPC_STUB IHTMLAreaElement_put_alt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_alt_Proxy(IHTMLAreaElement *This,BSTR *p);

  void __RPC_STUB IHTMLAreaElement_get_alt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_noHref_Proxy(IHTMLAreaElement *This,VARIANT_BOOL v);

  void __RPC_STUB IHTMLAreaElement_put_noHref_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_noHref_Proxy(IHTMLAreaElement *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLAreaElement_get_noHref_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_host_Proxy(IHTMLAreaElement *This,BSTR v);

  void __RPC_STUB IHTMLAreaElement_put_host_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_host_Proxy(IHTMLAreaElement *This,BSTR *p);

  void __RPC_STUB IHTMLAreaElement_get_host_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_hostname_Proxy(IHTMLAreaElement *This,BSTR v);

  void __RPC_STUB IHTMLAreaElement_put_hostname_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_hostname_Proxy(IHTMLAreaElement *This,BSTR *p);

  void __RPC_STUB IHTMLAreaElement_get_hostname_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_pathname_Proxy(IHTMLAreaElement *This,BSTR v);

  void __RPC_STUB IHTMLAreaElement_put_pathname_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_pathname_Proxy(IHTMLAreaElement *This,BSTR *p);

  void __RPC_STUB IHTMLAreaElement_get_pathname_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_port_Proxy(IHTMLAreaElement *This,BSTR v);

  void __RPC_STUB IHTMLAreaElement_put_port_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_port_Proxy(IHTMLAreaElement *This,BSTR *p);

  void __RPC_STUB IHTMLAreaElement_get_port_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_protocol_Proxy(IHTMLAreaElement *This,BSTR v);

  void __RPC_STUB IHTMLAreaElement_put_protocol_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_protocol_Proxy(IHTMLAreaElement *This,BSTR *p);

  void __RPC_STUB IHTMLAreaElement_get_protocol_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_search_Proxy(IHTMLAreaElement *This,BSTR v);

  void __RPC_STUB IHTMLAreaElement_put_search_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_search_Proxy(IHTMLAreaElement *This,BSTR *p);

  void __RPC_STUB IHTMLAreaElement_get_search_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_hash_Proxy(IHTMLAreaElement *This,BSTR v);

  void __RPC_STUB IHTMLAreaElement_put_hash_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_hash_Proxy(IHTMLAreaElement *This,BSTR *p);

  void __RPC_STUB IHTMLAreaElement_get_hash_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_onblur_Proxy(IHTMLAreaElement *This,VARIANT v);

  void __RPC_STUB IHTMLAreaElement_put_onblur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_onblur_Proxy(IHTMLAreaElement *This,VARIANT *p);

  void __RPC_STUB IHTMLAreaElement_get_onblur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_onfocus_Proxy(IHTMLAreaElement *This,VARIANT v);

  void __RPC_STUB IHTMLAreaElement_put_onfocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_onfocus_Proxy(IHTMLAreaElement *This,VARIANT *p);

  void __RPC_STUB IHTMLAreaElement_get_onfocus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_put_tabIndex_Proxy(IHTMLAreaElement *This,short v);

  void __RPC_STUB IHTMLAreaElement_put_tabIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_get_tabIndex_Proxy(IHTMLAreaElement *This,short *p);

  void __RPC_STUB IHTMLAreaElement_get_tabIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_focus_Proxy(IHTMLAreaElement *This);

  void __RPC_STUB IHTMLAreaElement_focus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAreaElement_blur_Proxy(IHTMLAreaElement *This);

  void __RPC_STUB IHTMLAreaElement_blur_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLAreaElement_DISPINTERFACE_DEFINED__
#define __DispHTMLAreaElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLAreaElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLAreaElement : public IDispatch
  {
  };
#else

  typedef struct DispHTMLAreaElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLAreaElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLAreaElement *This);

      ULONG (WINAPI *Release)(DispHTMLAreaElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLAreaElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLAreaElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLAreaElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLAreaElement;

#ifdef __cplusplus

  class HTMLAreaElement;
#endif

#ifndef __IHTMLTableCaption_INTERFACE_DEFINED__
#define __IHTMLTableCaption_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTableCaption;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTableCaption : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_align(BSTR v) = 0;

    virtual HRESULT WINAPI get_align(BSTR *p) = 0;

    virtual HRESULT WINAPI put_vAlign(BSTR v) = 0;

    virtual HRESULT WINAPI get_vAlign(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLTableCaptionVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTableCaption *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTableCaption *This);

      ULONG (WINAPI *Release)(IHTMLTableCaption *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTableCaption *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTableCaption *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_align)(IHTMLTableCaption *This,BSTR v);

      HRESULT (WINAPI *get_align)(IHTMLTableCaption *This,BSTR *p);

      HRESULT (WINAPI *put_vAlign)(IHTMLTableCaption *This,BSTR v);

      HRESULT (WINAPI *get_vAlign)(IHTMLTableCaption *This,BSTR *p);

    END_INTERFACE
  } IHTMLTableCaptionVtbl;

  interface IHTMLTableCaption
  {
    CONST_VTBL struct IHTMLTableCaptionVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLTableCaption_put_align_Proxy(IHTMLTableCaption *This,BSTR v);

  void __RPC_STUB IHTMLTableCaption_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCaption_get_align_Proxy(IHTMLTableCaption *This,BSTR *p);

  void __RPC_STUB IHTMLTableCaption_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCaption_put_vAlign_Proxy(IHTMLTableCaption *This,BSTR v);

  void __RPC_STUB IHTMLTableCaption_put_vAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCaption_get_vAlign_Proxy(IHTMLTableCaption *This,BSTR *p);

  void __RPC_STUB IHTMLTableCaption_get_vAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLTableCaption_DISPINTERFACE_DEFINED__
#define __DispHTMLTableCaption_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLTableCaption;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLTableCaption : public IDispatch
  {
  };
#else

  typedef struct DispHTMLTableCaptionVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLTableCaption *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLTableCaption *This);

      ULONG (WINAPI *Release)(DispHTMLTableCaption *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLTableCaption *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLTableCaption *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLTableCaptionVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLTableCaption;

#ifdef __cplusplus

  class HTMLTableCaption;
#endif

#ifndef __IHTMLCommentElement_INTERFACE_DEFINED__
#define __IHTMLCommentElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLCommentElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLCommentElement : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_text(BSTR v) = 0;

    virtual HRESULT WINAPI get_text(BSTR *p) = 0;

    virtual HRESULT WINAPI put_atomic(long v) = 0;

    virtual HRESULT WINAPI get_atomic(long *p) = 0;

  };
#else

  typedef struct IHTMLCommentElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLCommentElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLCommentElement *This);

      ULONG (WINAPI *Release)(IHTMLCommentElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLCommentElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLCommentElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_text)(IHTMLCommentElement *This,BSTR v);

      HRESULT (WINAPI *get_text)(IHTMLCommentElement *This,BSTR *p);

      HRESULT (WINAPI *put_atomic)(IHTMLCommentElement *This,long v);

      HRESULT (WINAPI *get_atomic)(IHTMLCommentElement *This,long *p);

    END_INTERFACE
  } IHTMLCommentElementVtbl;

  interface IHTMLCommentElement
  {
    CONST_VTBL struct IHTMLCommentElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLCommentElement_put_text_Proxy(IHTMLCommentElement *This,BSTR v);

  void __RPC_STUB IHTMLCommentElement_put_text_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCommentElement_get_text_Proxy(IHTMLCommentElement *This,BSTR *p);

  void __RPC_STUB IHTMLCommentElement_get_text_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCommentElement_put_atomic_Proxy(IHTMLCommentElement *This,long v);

  void __RPC_STUB IHTMLCommentElement_put_atomic_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCommentElement_get_atomic_Proxy(IHTMLCommentElement *This,long *p);

  void __RPC_STUB IHTMLCommentElement_get_atomic_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLCommentElement2_INTERFACE_DEFINED__
#define __IHTMLCommentElement2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLCommentElement2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLCommentElement2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_data(BSTR v) = 0;

    virtual HRESULT WINAPI get_data(BSTR *p) = 0;

    virtual HRESULT WINAPI get_length(long *p) = 0;

    virtual HRESULT WINAPI substringData(long offset,long Count,BSTR *pbstrsubString) = 0;

    virtual HRESULT WINAPI appendData(BSTR bstrstring) = 0;

    virtual HRESULT WINAPI insertData(long offset,BSTR bstrstring) = 0;

    virtual HRESULT WINAPI deleteData(long offset,long Count) = 0;

    virtual HRESULT WINAPI replaceData(long offset,long Count,BSTR bstrstring) = 0;

  };
#else

  typedef struct IHTMLCommentElement2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLCommentElement2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLCommentElement2 *This);

      ULONG (WINAPI *Release)(IHTMLCommentElement2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLCommentElement2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLCommentElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_data)(IHTMLCommentElement2 *This,BSTR v);

      HRESULT (WINAPI *get_data)(IHTMLCommentElement2 *This,BSTR *p);

      HRESULT (WINAPI *get_length)(IHTMLCommentElement2 *This,long *p);

      HRESULT (WINAPI *substringData)(IHTMLCommentElement2 *This,long offset,long Count,BSTR *pbstrsubString);

      HRESULT (WINAPI *appendData)(IHTMLCommentElement2 *This,BSTR bstrstring);

      HRESULT (WINAPI *insertData)(IHTMLCommentElement2 *This,long offset,BSTR bstrstring);

      HRESULT (WINAPI *deleteData)(IHTMLCommentElement2 *This,long offset,long Count);

      HRESULT (WINAPI *replaceData)(IHTMLCommentElement2 *This,long offset,long Count,BSTR bstrstring);

    END_INTERFACE
  } IHTMLCommentElement2Vtbl;

  interface IHTMLCommentElement2
  {
    CONST_VTBL struct IHTMLCommentElement2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLCommentElement2_put_data_Proxy(IHTMLCommentElement2 *This,BSTR v);

  void __RPC_STUB IHTMLCommentElement2_put_data_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCommentElement2_get_data_Proxy(IHTMLCommentElement2 *This,BSTR *p);

  void __RPC_STUB IHTMLCommentElement2_get_data_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCommentElement2_get_length_Proxy(IHTMLCommentElement2 *This,long *p);

  void __RPC_STUB IHTMLCommentElement2_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCommentElement2_substringData_Proxy(IHTMLCommentElement2 *This,long offset,long Count,BSTR *pbstrsubString);

  void __RPC_STUB IHTMLCommentElement2_substringData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCommentElement2_appendData_Proxy(IHTMLCommentElement2 *This,BSTR bstrstring);

  void __RPC_STUB IHTMLCommentElement2_appendData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCommentElement2_insertData_Proxy(IHTMLCommentElement2 *This,long offset,BSTR bstrstring);

  void __RPC_STUB IHTMLCommentElement2_insertData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCommentElement2_deleteData_Proxy(IHTMLCommentElement2 *This,long offset,long Count);

  void __RPC_STUB IHTMLCommentElement2_deleteData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCommentElement2_replaceData_Proxy(IHTMLCommentElement2 *This,long offset,long Count,BSTR bstrstring);

  void __RPC_STUB IHTMLCommentElement2_replaceData_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLCommentElement_DISPINTERFACE_DEFINED__
#define __DispHTMLCommentElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLCommentElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLCommentElement : public IDispatch
  {
  };
#else

  typedef struct DispHTMLCommentElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLCommentElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLCommentElement *This);

      ULONG (WINAPI *Release)(DispHTMLCommentElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLCommentElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLCommentElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLCommentElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLCommentElement;

#ifdef __cplusplus

  class HTMLCommentElement;
#endif

#ifndef __IHTMLPhraseElement_INTERFACE_DEFINED__
#define __IHTMLPhraseElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLPhraseElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLPhraseElement : public IDispatch
  {
  public:
  };
#else

  typedef struct IHTMLPhraseElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLPhraseElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLPhraseElement *This);

      ULONG (WINAPI *Release)(IHTMLPhraseElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLPhraseElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLPhraseElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct IHTMLPhraseElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __IHTMLPhraseElement2_INTERFACE_DEFINED__
#define __IHTMLPhraseElement2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLPhraseElement2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLPhraseElement2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_cite(BSTR v) = 0;

    virtual HRESULT WINAPI get_cite(BSTR *p) = 0;

    virtual HRESULT WINAPI put_dateTime(BSTR v) = 0;

    virtual HRESULT WINAPI get_dateTime(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLPhraseElement2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLPhraseElement2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLPhraseElement2 *This);

      ULONG (WINAPI *Release)(IHTMLPhraseElement2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLPhraseElement2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLPhraseElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_cite)(IHTMLPhraseElement2 *This,BSTR v);

      HRESULT (WINAPI *get_cite)(IHTMLPhraseElement2 *This,BSTR *p);

      HRESULT (WINAPI *put_dateTime)(IHTMLPhraseElement2 *This,BSTR v);

      HRESULT (WINAPI *get_dateTime)(IHTMLPhraseElement2 *This,BSTR *p);

    END_INTERFACE
  } IHTMLPhraseElement2Vtbl;

  interface IHTMLPhraseElement2
  {
    CONST_VTBL struct IHTMLPhraseElement2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLPhraseElement2_put_cite_Proxy(IHTMLPhraseElement2 *This,BSTR v);

  void __RPC_STUB IHTMLPhraseElement2_put_cite_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPhraseElement2_get_cite_Proxy(IHTMLPhraseElement2 *This,BSTR *p);

  void __RPC_STUB IHTMLPhraseElement2_get_cite_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPhraseElement2_put_dateTime_Proxy(IHTMLPhraseElement2 *This,BSTR v);

  void __RPC_STUB IHTMLPhraseElement2_put_dateTime_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPhraseElement2_get_dateTime_Proxy(IHTMLPhraseElement2 *This,BSTR *p);

  void __RPC_STUB IHTMLPhraseElement2_get_dateTime_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLSpanElement_INTERFACE_DEFINED__
#define __IHTMLSpanElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLSpanElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLSpanElement : public IDispatch
  {
  public:
  };
#else

  typedef struct IHTMLSpanElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLSpanElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLSpanElement *This);

      ULONG (WINAPI *Release)(IHTMLSpanElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLSpanElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLSpanElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct IHTMLSpanElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __DispHTMLPhraseElement_DISPINTERFACE_DEFINED__
#define __DispHTMLPhraseElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLPhraseElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLPhraseElement : public IDispatch
  {
  };
#else

  typedef struct DispHTMLPhraseElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLPhraseElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLPhraseElement *This);

      ULONG (WINAPI *Release)(DispHTMLPhraseElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLPhraseElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLPhraseElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLPhraseElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLPhraseElement;

#ifdef __cplusplus

  class HTMLPhraseElement;
#endif

#ifndef __DispHTMLSpanElement_DISPINTERFACE_DEFINED__
#define __DispHTMLSpanElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLSpanElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLSpanElement : public IDispatch
  {
  };
#else

  typedef struct DispHTMLSpanElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLSpanElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLSpanElement *This);

      ULONG (WINAPI *Release)(DispHTMLSpanElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLSpanElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLSpanElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLSpanElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLSpanElement;

#ifdef __cplusplus

  class HTMLSpanElement;
#endif

#ifndef __HTMLTableEvents2_DISPINTERFACE_DEFINED__
#define __HTMLTableEvents2_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLTableEvents2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLTableEvents2 : public IDispatch
  {
  };
#else

  typedef struct HTMLTableEvents2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLTableEvents2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLTableEvents2 *This);

      ULONG (WINAPI *Release)(HTMLTableEvents2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLTableEvents2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLTableEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLTableEvents2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __HTMLTableEvents_DISPINTERFACE_DEFINED__
#define __HTMLTableEvents_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLTableEvents;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLTableEvents : public IDispatch
  {
  };
#else

  typedef struct HTMLTableEventsVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLTableEvents *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLTableEvents *This);

      ULONG (WINAPI *Release)(HTMLTableEvents *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLTableEvents *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLTableEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLTableEventsVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __IHTMLTableSection_INTERFACE_DEFINED__
#define __IHTMLTableSection_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTableSection;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTableSection : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_align(BSTR v) = 0;

    virtual HRESULT WINAPI get_align(BSTR *p) = 0;

    virtual HRESULT WINAPI put_vAlign(BSTR v) = 0;

    virtual HRESULT WINAPI get_vAlign(BSTR *p) = 0;

    virtual HRESULT WINAPI put_bgColor(VARIANT v) = 0;

    virtual HRESULT WINAPI get_bgColor(VARIANT *p) = 0;

    virtual HRESULT WINAPI get_rows(IHTMLElementCollection **p) = 0;

    virtual HRESULT WINAPI insertRow(long index,IDispatch **row) = 0;

    virtual HRESULT WINAPI deleteRow(long index = -1) = 0;

  };
#else

  typedef struct IHTMLTableSectionVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTableSection *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTableSection *This);

      ULONG (WINAPI *Release)(IHTMLTableSection *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTableSection *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTableSection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_align)(IHTMLTableSection *This,BSTR v);

      HRESULT (WINAPI *get_align)(IHTMLTableSection *This,BSTR *p);

      HRESULT (WINAPI *put_vAlign)(IHTMLTableSection *This,BSTR v);

      HRESULT (WINAPI *get_vAlign)(IHTMLTableSection *This,BSTR *p);

      HRESULT (WINAPI *put_bgColor)(IHTMLTableSection *This,VARIANT v);

      HRESULT (WINAPI *get_bgColor)(IHTMLTableSection *This,VARIANT *p);

      HRESULT (WINAPI *get_rows)(IHTMLTableSection *This,IHTMLElementCollection **p);

      HRESULT (WINAPI *insertRow)(IHTMLTableSection *This,long index,IDispatch **row);

      HRESULT (WINAPI *deleteRow)(IHTMLTableSection *This,long index);

    END_INTERFACE
  } IHTMLTableSectionVtbl;

  interface IHTMLTableSection
  {
    CONST_VTBL struct IHTMLTableSectionVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLTableSection_put_align_Proxy(IHTMLTableSection *This,BSTR v);

  void __RPC_STUB IHTMLTableSection_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableSection_get_align_Proxy(IHTMLTableSection *This,BSTR *p);

  void __RPC_STUB IHTMLTableSection_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableSection_put_vAlign_Proxy(IHTMLTableSection *This,BSTR v);

  void __RPC_STUB IHTMLTableSection_put_vAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableSection_get_vAlign_Proxy(IHTMLTableSection *This,BSTR *p);

  void __RPC_STUB IHTMLTableSection_get_vAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableSection_put_bgColor_Proxy(IHTMLTableSection *This,VARIANT v);

  void __RPC_STUB IHTMLTableSection_put_bgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableSection_get_bgColor_Proxy(IHTMLTableSection *This,VARIANT *p);

  void __RPC_STUB IHTMLTableSection_get_bgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableSection_get_rows_Proxy(IHTMLTableSection *This,IHTMLElementCollection **p);

  void __RPC_STUB IHTMLTableSection_get_rows_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableSection_insertRow_Proxy(IHTMLTableSection *This,long index,IDispatch **row);

  void __RPC_STUB IHTMLTableSection_insertRow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableSection_deleteRow_Proxy(IHTMLTableSection *This,long index);

  void __RPC_STUB IHTMLTableSection_deleteRow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTable_INTERFACE_DEFINED__
#define __IHTMLTable_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTable;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTable : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_cols(long v) = 0;

    virtual HRESULT WINAPI get_cols(long *p) = 0;

    virtual HRESULT WINAPI put_border(VARIANT v) = 0;

    virtual HRESULT WINAPI get_border(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_frame(BSTR v) = 0;

    virtual HRESULT WINAPI get_frame(BSTR *p) = 0;

    virtual HRESULT WINAPI put_rules(BSTR v) = 0;

    virtual HRESULT WINAPI get_rules(BSTR *p) = 0;

    virtual HRESULT WINAPI put_cellSpacing(VARIANT v) = 0;

    virtual HRESULT WINAPI get_cellSpacing(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_cellPadding(VARIANT v) = 0;

    virtual HRESULT WINAPI get_cellPadding(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_background(BSTR v) = 0;

    virtual HRESULT WINAPI get_background(BSTR *p) = 0;

    virtual HRESULT WINAPI put_bgColor(VARIANT v) = 0;

    virtual HRESULT WINAPI get_bgColor(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_borderColor(VARIANT v) = 0;

    virtual HRESULT WINAPI get_borderColor(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_borderColorLight(VARIANT v) = 0;

    virtual HRESULT WINAPI get_borderColorLight(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_borderColorDark(VARIANT v) = 0;

    virtual HRESULT WINAPI get_borderColorDark(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_align(BSTR v) = 0;

    virtual HRESULT WINAPI get_align(BSTR *p) = 0;

    virtual HRESULT WINAPI refresh(void) = 0;

    virtual HRESULT WINAPI get_rows(IHTMLElementCollection **p) = 0;

    virtual HRESULT WINAPI put_width(VARIANT v) = 0;

    virtual HRESULT WINAPI get_width(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_height(VARIANT v) = 0;

    virtual HRESULT WINAPI get_height(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_dataPageSize(long v) = 0;

    virtual HRESULT WINAPI get_dataPageSize(long *p) = 0;

    virtual HRESULT WINAPI nextPage(void) = 0;

    virtual HRESULT WINAPI previousPage(void) = 0;

    virtual HRESULT WINAPI get_tHead(IHTMLTableSection **p) = 0;

    virtual HRESULT WINAPI get_tFoot(IHTMLTableSection **p) = 0;

    virtual HRESULT WINAPI get_tBodies(IHTMLElementCollection **p) = 0;

    virtual HRESULT WINAPI get_caption(IHTMLTableCaption **p) = 0;

    virtual HRESULT WINAPI createTHead(IDispatch **head) = 0;

    virtual HRESULT WINAPI deleteTHead(void) = 0;

    virtual HRESULT WINAPI createTFoot(IDispatch **foot) = 0;

    virtual HRESULT WINAPI deleteTFoot(void) = 0;

    virtual HRESULT WINAPI createCaption(IHTMLTableCaption **caption) = 0;

    virtual HRESULT WINAPI deleteCaption(void) = 0;

    virtual HRESULT WINAPI insertRow(long index,IDispatch **row) = 0;

    virtual HRESULT WINAPI deleteRow(long index = -1) = 0;

    virtual HRESULT WINAPI get_readyState(BSTR *p) = 0;

    virtual HRESULT WINAPI put_onreadystatechange(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onreadystatechange(VARIANT *p) = 0;

  };
#else

  typedef struct IHTMLTableVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTable *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTable *This);

      ULONG (WINAPI *Release)(IHTMLTable *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTable *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTable *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_cols)(IHTMLTable *This,long v);

      HRESULT (WINAPI *get_cols)(IHTMLTable *This,long *p);

      HRESULT (WINAPI *put_border)(IHTMLTable *This,VARIANT v);

      HRESULT (WINAPI *get_border)(IHTMLTable *This,VARIANT *p);

      HRESULT (WINAPI *put_frame)(IHTMLTable *This,BSTR v);

      HRESULT (WINAPI *get_frame)(IHTMLTable *This,BSTR *p);

      HRESULT (WINAPI *put_rules)(IHTMLTable *This,BSTR v);

      HRESULT (WINAPI *get_rules)(IHTMLTable *This,BSTR *p);

      HRESULT (WINAPI *put_cellSpacing)(IHTMLTable *This,VARIANT v);

      HRESULT (WINAPI *get_cellSpacing)(IHTMLTable *This,VARIANT *p);

      HRESULT (WINAPI *put_cellPadding)(IHTMLTable *This,VARIANT v);

      HRESULT (WINAPI *get_cellPadding)(IHTMLTable *This,VARIANT *p);

      HRESULT (WINAPI *put_background)(IHTMLTable *This,BSTR v);

      HRESULT (WINAPI *get_background)(IHTMLTable *This,BSTR *p);

      HRESULT (WINAPI *put_bgColor)(IHTMLTable *This,VARIANT v);

      HRESULT (WINAPI *get_bgColor)(IHTMLTable *This,VARIANT *p);

      HRESULT (WINAPI *put_borderColor)(IHTMLTable *This,VARIANT v);

      HRESULT (WINAPI *get_borderColor)(IHTMLTable *This,VARIANT *p);

      HRESULT (WINAPI *put_borderColorLight)(IHTMLTable *This,VARIANT v);

      HRESULT (WINAPI *get_borderColorLight)(IHTMLTable *This,VARIANT *p);

      HRESULT (WINAPI *put_borderColorDark)(IHTMLTable *This,VARIANT v);

      HRESULT (WINAPI *get_borderColorDark)(IHTMLTable *This,VARIANT *p);

      HRESULT (WINAPI *put_align)(IHTMLTable *This,BSTR v);

      HRESULT (WINAPI *get_align)(IHTMLTable *This,BSTR *p);

      HRESULT (WINAPI *refresh)(IHTMLTable *This);

      HRESULT (WINAPI *get_rows)(IHTMLTable *This,IHTMLElementCollection **p);

      HRESULT (WINAPI *put_width)(IHTMLTable *This,VARIANT v);

      HRESULT (WINAPI *get_width)(IHTMLTable *This,VARIANT *p);

      HRESULT (WINAPI *put_height)(IHTMLTable *This,VARIANT v);

      HRESULT (WINAPI *get_height)(IHTMLTable *This,VARIANT *p);

      HRESULT (WINAPI *put_dataPageSize)(IHTMLTable *This,long v);

      HRESULT (WINAPI *get_dataPageSize)(IHTMLTable *This,long *p);

      HRESULT (WINAPI *nextPage)(IHTMLTable *This);

      HRESULT (WINAPI *previousPage)(IHTMLTable *This);

      HRESULT (WINAPI *get_tHead)(IHTMLTable *This,IHTMLTableSection **p);

      HRESULT (WINAPI *get_tFoot)(IHTMLTable *This,IHTMLTableSection **p);

      HRESULT (WINAPI *get_tBodies)(IHTMLTable *This,IHTMLElementCollection **p);

      HRESULT (WINAPI *get_caption)(IHTMLTable *This,IHTMLTableCaption **p);

      HRESULT (WINAPI *createTHead)(IHTMLTable *This,IDispatch **head);

      HRESULT (WINAPI *deleteTHead)(IHTMLTable *This);

      HRESULT (WINAPI *createTFoot)(IHTMLTable *This,IDispatch **foot);

      HRESULT (WINAPI *deleteTFoot)(IHTMLTable *This);

      HRESULT (WINAPI *createCaption)(IHTMLTable *This,IHTMLTableCaption **caption);

      HRESULT (WINAPI *deleteCaption)(IHTMLTable *This);

      HRESULT (WINAPI *insertRow)(IHTMLTable *This,long index,IDispatch **row);

      HRESULT (WINAPI *deleteRow)(IHTMLTable *This,long index);

      HRESULT (WINAPI *get_readyState)(IHTMLTable *This,BSTR *p);

      HRESULT (WINAPI *put_onreadystatechange)(IHTMLTable *This,VARIANT v);

      HRESULT (WINAPI *get_onreadystatechange)(IHTMLTable *This,VARIANT *p);

    END_INTERFACE
  } IHTMLTableVtbl;

  interface IHTMLTable
  {
    CONST_VTBL struct IHTMLTableVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLTable_put_cols_Proxy(IHTMLTable *This,long v);

  void __RPC_STUB IHTMLTable_put_cols_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_cols_Proxy(IHTMLTable *This,long *p);

  void __RPC_STUB IHTMLTable_get_cols_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_border_Proxy(IHTMLTable *This,VARIANT v);

  void __RPC_STUB IHTMLTable_put_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_border_Proxy(IHTMLTable *This,VARIANT *p);

  void __RPC_STUB IHTMLTable_get_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_frame_Proxy(IHTMLTable *This,BSTR v);

  void __RPC_STUB IHTMLTable_put_frame_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_frame_Proxy(IHTMLTable *This,BSTR *p);

  void __RPC_STUB IHTMLTable_get_frame_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_rules_Proxy(IHTMLTable *This,BSTR v);

  void __RPC_STUB IHTMLTable_put_rules_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_rules_Proxy(IHTMLTable *This,BSTR *p);

  void __RPC_STUB IHTMLTable_get_rules_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_cellSpacing_Proxy(IHTMLTable *This,VARIANT v);

  void __RPC_STUB IHTMLTable_put_cellSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_cellSpacing_Proxy(IHTMLTable *This,VARIANT *p);

  void __RPC_STUB IHTMLTable_get_cellSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_cellPadding_Proxy(IHTMLTable *This,VARIANT v);

  void __RPC_STUB IHTMLTable_put_cellPadding_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_cellPadding_Proxy(IHTMLTable *This,VARIANT *p);

  void __RPC_STUB IHTMLTable_get_cellPadding_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_background_Proxy(IHTMLTable *This,BSTR v);

  void __RPC_STUB IHTMLTable_put_background_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_background_Proxy(IHTMLTable *This,BSTR *p);

  void __RPC_STUB IHTMLTable_get_background_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_bgColor_Proxy(IHTMLTable *This,VARIANT v);

  void __RPC_STUB IHTMLTable_put_bgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_bgColor_Proxy(IHTMLTable *This,VARIANT *p);

  void __RPC_STUB IHTMLTable_get_bgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_borderColor_Proxy(IHTMLTable *This,VARIANT v);

  void __RPC_STUB IHTMLTable_put_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_borderColor_Proxy(IHTMLTable *This,VARIANT *p);

  void __RPC_STUB IHTMLTable_get_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_borderColorLight_Proxy(IHTMLTable *This,VARIANT v);

  void __RPC_STUB IHTMLTable_put_borderColorLight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_borderColorLight_Proxy(IHTMLTable *This,VARIANT *p);

  void __RPC_STUB IHTMLTable_get_borderColorLight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_borderColorDark_Proxy(IHTMLTable *This,VARIANT v);

  void __RPC_STUB IHTMLTable_put_borderColorDark_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_borderColorDark_Proxy(IHTMLTable *This,VARIANT *p);

  void __RPC_STUB IHTMLTable_get_borderColorDark_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_align_Proxy(IHTMLTable *This,BSTR v);

  void __RPC_STUB IHTMLTable_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_align_Proxy(IHTMLTable *This,BSTR *p);

  void __RPC_STUB IHTMLTable_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_refresh_Proxy(IHTMLTable *This);

  void __RPC_STUB IHTMLTable_refresh_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_rows_Proxy(IHTMLTable *This,IHTMLElementCollection **p);

  void __RPC_STUB IHTMLTable_get_rows_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_width_Proxy(IHTMLTable *This,VARIANT v);

  void __RPC_STUB IHTMLTable_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_width_Proxy(IHTMLTable *This,VARIANT *p);

  void __RPC_STUB IHTMLTable_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_height_Proxy(IHTMLTable *This,VARIANT v);

  void __RPC_STUB IHTMLTable_put_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_height_Proxy(IHTMLTable *This,VARIANT *p);

  void __RPC_STUB IHTMLTable_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_dataPageSize_Proxy(IHTMLTable *This,long v);

  void __RPC_STUB IHTMLTable_put_dataPageSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_dataPageSize_Proxy(IHTMLTable *This,long *p);

  void __RPC_STUB IHTMLTable_get_dataPageSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_nextPage_Proxy(IHTMLTable *This);

  void __RPC_STUB IHTMLTable_nextPage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_previousPage_Proxy(IHTMLTable *This);

  void __RPC_STUB IHTMLTable_previousPage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_tHead_Proxy(IHTMLTable *This,IHTMLTableSection **p);

  void __RPC_STUB IHTMLTable_get_tHead_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_tFoot_Proxy(IHTMLTable *This,IHTMLTableSection **p);

  void __RPC_STUB IHTMLTable_get_tFoot_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_tBodies_Proxy(IHTMLTable *This,IHTMLElementCollection **p);

  void __RPC_STUB IHTMLTable_get_tBodies_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_caption_Proxy(IHTMLTable *This,IHTMLTableCaption **p);

  void __RPC_STUB IHTMLTable_get_caption_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_createTHead_Proxy(IHTMLTable *This,IDispatch **head);

  void __RPC_STUB IHTMLTable_createTHead_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_deleteTHead_Proxy(IHTMLTable *This);

  void __RPC_STUB IHTMLTable_deleteTHead_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_createTFoot_Proxy(IHTMLTable *This,IDispatch **foot);

  void __RPC_STUB IHTMLTable_createTFoot_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_deleteTFoot_Proxy(IHTMLTable *This);

  void __RPC_STUB IHTMLTable_deleteTFoot_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_createCaption_Proxy(IHTMLTable *This,IHTMLTableCaption **caption);

  void __RPC_STUB IHTMLTable_createCaption_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_deleteCaption_Proxy(IHTMLTable *This);

  void __RPC_STUB IHTMLTable_deleteCaption_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_insertRow_Proxy(IHTMLTable *This,long index,IDispatch **row);

  void __RPC_STUB IHTMLTable_insertRow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_deleteRow_Proxy(IHTMLTable *This,long index);

  void __RPC_STUB IHTMLTable_deleteRow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_readyState_Proxy(IHTMLTable *This,BSTR *p);

  void __RPC_STUB IHTMLTable_get_readyState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_put_onreadystatechange_Proxy(IHTMLTable *This,VARIANT v);

  void __RPC_STUB IHTMLTable_put_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable_get_onreadystatechange_Proxy(IHTMLTable *This,VARIANT *p);

  void __RPC_STUB IHTMLTable_get_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTable2_INTERFACE_DEFINED__
#define __IHTMLTable2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTable2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTable2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI firstPage(void) = 0;

    virtual HRESULT WINAPI lastPage(void) = 0;

    virtual HRESULT WINAPI get_cells(IHTMLElementCollection **p) = 0;

    virtual HRESULT WINAPI moveRow(long indexFrom,long indexTo,IDispatch **row) = 0;

  };
#else

  typedef struct IHTMLTable2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTable2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTable2 *This);

      ULONG (WINAPI *Release)(IHTMLTable2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTable2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTable2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *firstPage)(IHTMLTable2 *This);

      HRESULT (WINAPI *lastPage)(IHTMLTable2 *This);

      HRESULT (WINAPI *get_cells)(IHTMLTable2 *This,IHTMLElementCollection **p);

      HRESULT (WINAPI *moveRow)(IHTMLTable2 *This,long indexFrom,long indexTo,IDispatch **row);

    END_INTERFACE
  } IHTMLTable2Vtbl;

  interface IHTMLTable2
  {
    CONST_VTBL struct IHTMLTable2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLTable2_firstPage_Proxy(IHTMLTable2 *This);

  void __RPC_STUB IHTMLTable2_firstPage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable2_lastPage_Proxy(IHTMLTable2 *This);

  void __RPC_STUB IHTMLTable2_lastPage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable2_get_cells_Proxy(IHTMLTable2 *This,IHTMLElementCollection **p);

  void __RPC_STUB IHTMLTable2_get_cells_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable2_moveRow_Proxy(IHTMLTable2 *This,long indexFrom,long indexTo,IDispatch **row);

  void __RPC_STUB IHTMLTable2_moveRow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTable3_INTERFACE_DEFINED__
#define __IHTMLTable3_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTable3;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTable3 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_summary(BSTR v) = 0;

    virtual HRESULT WINAPI get_summary(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLTable3Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTable3 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTable3 *This);

      ULONG (WINAPI *Release)(IHTMLTable3 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTable3 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTable3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_summary)(IHTMLTable3 *This,BSTR v);

      HRESULT (WINAPI *get_summary)(IHTMLTable3 *This,BSTR *p);

    END_INTERFACE
  } IHTMLTable3Vtbl;

  interface IHTMLTable3
  {
    CONST_VTBL struct IHTMLTable3Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLTable3_put_summary(This,v) (This)->lpVtbl->put_summary(This,v)

#define IHTMLTable3_get_summary(This,p) (This)->lpVtbl->get_summary(This,p)
#endif
#endif

  HRESULT WINAPI IHTMLTable3_put_summary_Proxy(IHTMLTable3 *This,BSTR v);

  void __RPC_STUB IHTMLTable3_put_summary_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTable3_get_summary_Proxy(IHTMLTable3 *This,BSTR *p);

  void __RPC_STUB IHTMLTable3_get_summary_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTableCol_INTERFACE_DEFINED__
#define __IHTMLTableCol_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTableCol;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTableCol : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_span(long v) = 0;

    virtual HRESULT WINAPI get_span(long *p) = 0;

    virtual HRESULT WINAPI put_width(VARIANT v) = 0;

    virtual HRESULT WINAPI get_width(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_align(BSTR v) = 0;

    virtual HRESULT WINAPI get_align(BSTR *p) = 0;

    virtual HRESULT WINAPI put_vAlign(BSTR v) = 0;

    virtual HRESULT WINAPI get_vAlign(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLTableColVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTableCol *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTableCol *This);

      ULONG (WINAPI *Release)(IHTMLTableCol *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTableCol *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTableCol *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_span)(IHTMLTableCol *This,long v);

      HRESULT (WINAPI *get_span)(IHTMLTableCol *This,long *p);

      HRESULT (WINAPI *put_width)(IHTMLTableCol *This,VARIANT v);

      HRESULT (WINAPI *get_width)(IHTMLTableCol *This,VARIANT *p);

      HRESULT (WINAPI *put_align)(IHTMLTableCol *This,BSTR v);

      HRESULT (WINAPI *get_align)(IHTMLTableCol *This,BSTR *p);

      HRESULT (WINAPI *put_vAlign)(IHTMLTableCol *This,BSTR v);

      HRESULT (WINAPI *get_vAlign)(IHTMLTableCol *This,BSTR *p);

    END_INTERFACE
  } IHTMLTableColVtbl;

  interface IHTMLTableCol
  {
    CONST_VTBL struct IHTMLTableColVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLTableCol_put_span_Proxy(IHTMLTableCol *This,long v);

  void __RPC_STUB IHTMLTableCol_put_span_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCol_get_span_Proxy(IHTMLTableCol *This,long *p);

  void __RPC_STUB IHTMLTableCol_get_span_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCol_put_width_Proxy(IHTMLTableCol *This,VARIANT v);

  void __RPC_STUB IHTMLTableCol_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCol_get_width_Proxy(IHTMLTableCol *This,VARIANT *p);

  void __RPC_STUB IHTMLTableCol_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCol_put_align_Proxy(IHTMLTableCol *This,BSTR v);

  void __RPC_STUB IHTMLTableCol_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCol_get_align_Proxy(IHTMLTableCol *This,BSTR *p);

  void __RPC_STUB IHTMLTableCol_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCol_put_vAlign_Proxy(IHTMLTableCol *This,BSTR v);

  void __RPC_STUB IHTMLTableCol_put_vAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCol_get_vAlign_Proxy(IHTMLTableCol *This,BSTR *p);

  void __RPC_STUB IHTMLTableCol_get_vAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTableCol2_INTERFACE_DEFINED__
#define __IHTMLTableCol2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTableCol2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTableCol2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_ch(BSTR v) = 0;

    virtual HRESULT WINAPI get_ch(BSTR *p) = 0;

    virtual HRESULT WINAPI put_chOff(BSTR v) = 0;

    virtual HRESULT WINAPI get_chOff(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLTableCol2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTableCol2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTableCol2 *This);

      ULONG (WINAPI *Release)(IHTMLTableCol2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTableCol2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTableCol2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_ch)(IHTMLTableCol2 *This,BSTR v);

      HRESULT (WINAPI *get_ch)(IHTMLTableCol2 *This,BSTR *p);

      HRESULT (WINAPI *put_chOff)(IHTMLTableCol2 *This,BSTR v);

      HRESULT (WINAPI *get_chOff)(IHTMLTableCol2 *This,BSTR *p);

    END_INTERFACE
  } IHTMLTableCol2Vtbl;

  interface IHTMLTableCol2
  {
    CONST_VTBL struct IHTMLTableCol2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLTableCol2_put_ch_Proxy(IHTMLTableCol2 *This,BSTR v);

  void __RPC_STUB IHTMLTableCol2_put_ch_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCol2_get_ch_Proxy(IHTMLTableCol2 *This,BSTR *p);

  void __RPC_STUB IHTMLTableCol2_get_ch_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCol2_put_chOff_Proxy(IHTMLTableCol2 *This,BSTR v);

  void __RPC_STUB IHTMLTableCol2_put_chOff_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCol2_get_chOff_Proxy(IHTMLTableCol2 *This,BSTR *p);

  void __RPC_STUB IHTMLTableCol2_get_chOff_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTableSection2_INTERFACE_DEFINED__
#define __IHTMLTableSection2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTableSection2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTableSection2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI moveRow(long indexFrom,long indexTo,IDispatch **row) = 0;

  };
#else

  typedef struct IHTMLTableSection2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTableSection2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTableSection2 *This);

      ULONG (WINAPI *Release)(IHTMLTableSection2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTableSection2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTableSection2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *moveRow)(IHTMLTableSection2 *This,long indexFrom,long indexTo,IDispatch **row);

    END_INTERFACE
  } IHTMLTableSection2Vtbl;

  interface IHTMLTableSection2
  {
    CONST_VTBL struct IHTMLTableSection2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLTableSection2_moveRow(This,indexFrom,indexTo,row) (This)->lpVtbl->moveRow(This,indexFrom,indexTo,row)
#endif
#endif

  HRESULT WINAPI IHTMLTableSection2_moveRow_Proxy(IHTMLTableSection2 *This,long indexFrom,long indexTo,IDispatch **row);

  void __RPC_STUB IHTMLTableSection2_moveRow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTableSection3_INTERFACE_DEFINED__
#define __IHTMLTableSection3_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTableSection3;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTableSection3 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_ch(BSTR v) = 0;

    virtual HRESULT WINAPI get_ch(BSTR *p) = 0;

    virtual HRESULT WINAPI put_chOff(BSTR v) = 0;

    virtual HRESULT WINAPI get_chOff(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLTableSection3Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTableSection3 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTableSection3 *This);

      ULONG (WINAPI *Release)(IHTMLTableSection3 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTableSection3 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTableSection3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_ch)(IHTMLTableSection3 *This,BSTR v);

      HRESULT (WINAPI *get_ch)(IHTMLTableSection3 *This,BSTR *p);

      HRESULT (WINAPI *put_chOff)(IHTMLTableSection3 *This,BSTR v);

      HRESULT (WINAPI *get_chOff)(IHTMLTableSection3 *This,BSTR *p);

    END_INTERFACE
  } IHTMLTableSection3Vtbl;

  interface IHTMLTableSection3
  {
    CONST_VTBL struct IHTMLTableSection3Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLTableSection3_put_ch_Proxy(IHTMLTableSection3 *This,BSTR v);

  void __RPC_STUB IHTMLTableSection3_put_ch_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableSection3_get_ch_Proxy(IHTMLTableSection3 *This,BSTR *p);

  void __RPC_STUB IHTMLTableSection3_get_ch_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableSection3_put_chOff_Proxy(IHTMLTableSection3 *This,BSTR v);

  void __RPC_STUB IHTMLTableSection3_put_chOff_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableSection3_get_chOff_Proxy(IHTMLTableSection3 *This,BSTR *p);

  void __RPC_STUB IHTMLTableSection3_get_chOff_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTableRow_INTERFACE_DEFINED__
#define __IHTMLTableRow_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTableRow;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTableRow : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_align(BSTR v) = 0;

    virtual HRESULT WINAPI get_align(BSTR *p) = 0;

    virtual HRESULT WINAPI put_vAlign(BSTR v) = 0;

    virtual HRESULT WINAPI get_vAlign(BSTR *p) = 0;

    virtual HRESULT WINAPI put_bgColor(VARIANT v) = 0;

    virtual HRESULT WINAPI get_bgColor(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_borderColor(VARIANT v) = 0;

    virtual HRESULT WINAPI get_borderColor(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_borderColorLight(VARIANT v) = 0;

    virtual HRESULT WINAPI get_borderColorLight(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_borderColorDark(VARIANT v) = 0;

    virtual HRESULT WINAPI get_borderColorDark(VARIANT *p) = 0;

    virtual HRESULT WINAPI get_rowIndex(long *p) = 0;

    virtual HRESULT WINAPI get_sectionRowIndex(long *p) = 0;

    virtual HRESULT WINAPI get_cells(IHTMLElementCollection **p) = 0;

    virtual HRESULT WINAPI insertCell(long index,IDispatch **row) = 0;

    virtual HRESULT WINAPI deleteCell(long index = -1) = 0;

  };
#else

  typedef struct IHTMLTableRowVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTableRow *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTableRow *This);

      ULONG (WINAPI *Release)(IHTMLTableRow *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTableRow *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTableRow *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_align)(IHTMLTableRow *This,BSTR v);

      HRESULT (WINAPI *get_align)(IHTMLTableRow *This,BSTR *p);

      HRESULT (WINAPI *put_vAlign)(IHTMLTableRow *This,BSTR v);

      HRESULT (WINAPI *get_vAlign)(IHTMLTableRow *This,BSTR *p);

      HRESULT (WINAPI *put_bgColor)(IHTMLTableRow *This,VARIANT v);

      HRESULT (WINAPI *get_bgColor)(IHTMLTableRow *This,VARIANT *p);

      HRESULT (WINAPI *put_borderColor)(IHTMLTableRow *This,VARIANT v);

      HRESULT (WINAPI *get_borderColor)(IHTMLTableRow *This,VARIANT *p);

      HRESULT (WINAPI *put_borderColorLight)(IHTMLTableRow *This,VARIANT v);

      HRESULT (WINAPI *get_borderColorLight)(IHTMLTableRow *This,VARIANT *p);

      HRESULT (WINAPI *put_borderColorDark)(IHTMLTableRow *This,VARIANT v);

      HRESULT (WINAPI *get_borderColorDark)(IHTMLTableRow *This,VARIANT *p);

      HRESULT (WINAPI *get_rowIndex)(IHTMLTableRow *This,long *p);

      HRESULT (WINAPI *get_sectionRowIndex)(IHTMLTableRow *This,long *p);

      HRESULT (WINAPI *get_cells)(IHTMLTableRow *This,IHTMLElementCollection **p);

      HRESULT (WINAPI *insertCell)(IHTMLTableRow *This,long index,IDispatch **row);

      HRESULT (WINAPI *deleteCell)(IHTMLTableRow *This,long index);

    END_INTERFACE
  } IHTMLTableRowVtbl;

  interface IHTMLTableRow
  {
    CONST_VTBL struct IHTMLTableRowVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLTableRow_put_align_Proxy(IHTMLTableRow *This,BSTR v);

  void __RPC_STUB IHTMLTableRow_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_get_align_Proxy(IHTMLTableRow *This,BSTR *p);

  void __RPC_STUB IHTMLTableRow_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_put_vAlign_Proxy(IHTMLTableRow *This,BSTR v);

  void __RPC_STUB IHTMLTableRow_put_vAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_get_vAlign_Proxy(IHTMLTableRow *This,BSTR *p);

  void __RPC_STUB IHTMLTableRow_get_vAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_put_bgColor_Proxy(IHTMLTableRow *This,VARIANT v);

  void __RPC_STUB IHTMLTableRow_put_bgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_get_bgColor_Proxy(IHTMLTableRow *This,VARIANT *p);

  void __RPC_STUB IHTMLTableRow_get_bgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_put_borderColor_Proxy(IHTMLTableRow *This,VARIANT v);

  void __RPC_STUB IHTMLTableRow_put_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_get_borderColor_Proxy(IHTMLTableRow *This,VARIANT *p);

  void __RPC_STUB IHTMLTableRow_get_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_put_borderColorLight_Proxy(IHTMLTableRow *This,VARIANT v);

  void __RPC_STUB IHTMLTableRow_put_borderColorLight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_get_borderColorLight_Proxy(IHTMLTableRow *This,VARIANT *p);

  void __RPC_STUB IHTMLTableRow_get_borderColorLight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_put_borderColorDark_Proxy(IHTMLTableRow *This,VARIANT v);

  void __RPC_STUB IHTMLTableRow_put_borderColorDark_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_get_borderColorDark_Proxy(IHTMLTableRow *This,VARIANT *p);

  void __RPC_STUB IHTMLTableRow_get_borderColorDark_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_get_rowIndex_Proxy(IHTMLTableRow *This,long *p);

  void __RPC_STUB IHTMLTableRow_get_rowIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_get_sectionRowIndex_Proxy(IHTMLTableRow *This,long *p);

  void __RPC_STUB IHTMLTableRow_get_sectionRowIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_get_cells_Proxy(IHTMLTableRow *This,IHTMLElementCollection **p);

  void __RPC_STUB IHTMLTableRow_get_cells_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_insertCell_Proxy(IHTMLTableRow *This,long index,IDispatch **row);

  void __RPC_STUB IHTMLTableRow_insertCell_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow_deleteCell_Proxy(IHTMLTableRow *This,long index);

  void __RPC_STUB IHTMLTableRow_deleteCell_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTableRow2_INTERFACE_DEFINED__
#define __IHTMLTableRow2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTableRow2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTableRow2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_height(VARIANT v) = 0;

    virtual HRESULT WINAPI get_height(VARIANT *p) = 0;

  };
#else

  typedef struct IHTMLTableRow2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTableRow2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTableRow2 *This);

      ULONG (WINAPI *Release)(IHTMLTableRow2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTableRow2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTableRow2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_height)(IHTMLTableRow2 *This,VARIANT v);

      HRESULT (WINAPI *get_height)(IHTMLTableRow2 *This,VARIANT *p);

    END_INTERFACE
  } IHTMLTableRow2Vtbl;

  interface IHTMLTableRow2
  {
    CONST_VTBL struct IHTMLTableRow2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLTableRow2_put_height(This,v) (This)->lpVtbl->put_height(This,v)

#define IHTMLTableRow2_get_height(This,p) (This)->lpVtbl->get_height(This,p)
#endif
#endif

  HRESULT WINAPI IHTMLTableRow2_put_height_Proxy(IHTMLTableRow2 *This,VARIANT v);

  void __RPC_STUB IHTMLTableRow2_put_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow2_get_height_Proxy(IHTMLTableRow2 *This,VARIANT *p);

  void __RPC_STUB IHTMLTableRow2_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTableRow3_INTERFACE_DEFINED__
#define __IHTMLTableRow3_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTableRow3;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTableRow3 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_ch(BSTR v) = 0;

    virtual HRESULT WINAPI get_ch(BSTR *p) = 0;

    virtual HRESULT WINAPI put_chOff(BSTR v) = 0;

    virtual HRESULT WINAPI get_chOff(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLTableRow3Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTableRow3 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTableRow3 *This);

      ULONG (WINAPI *Release)(IHTMLTableRow3 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTableRow3 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTableRow3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_ch)(IHTMLTableRow3 *This,BSTR v);

      HRESULT (WINAPI *get_ch)(IHTMLTableRow3 *This,BSTR *p);

      HRESULT (WINAPI *put_chOff)(IHTMLTableRow3 *This,BSTR v);

      HRESULT (WINAPI *get_chOff)(IHTMLTableRow3 *This,BSTR *p);

    END_INTERFACE
  } IHTMLTableRow3Vtbl;

  interface IHTMLTableRow3
  {
    CONST_VTBL struct IHTMLTableRow3Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLTableRow3_put_ch_Proxy(IHTMLTableRow3 *This,BSTR v);

  void __RPC_STUB IHTMLTableRow3_put_ch_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow3_get_ch_Proxy(IHTMLTableRow3 *This,BSTR *p);

  void __RPC_STUB IHTMLTableRow3_get_ch_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow3_put_chOff_Proxy(IHTMLTableRow3 *This,BSTR v);

  void __RPC_STUB IHTMLTableRow3_put_chOff_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRow3_get_chOff_Proxy(IHTMLTableRow3 *This,BSTR *p);

  void __RPC_STUB IHTMLTableRow3_get_chOff_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTableRowMetrics_INTERFACE_DEFINED__
#define __IHTMLTableRowMetrics_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTableRowMetrics;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTableRowMetrics : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get_clientHeight(long *p) = 0;

    virtual HRESULT WINAPI get_clientWidth(long *p) = 0;

    virtual HRESULT WINAPI get_clientTop(long *p) = 0;

    virtual HRESULT WINAPI get_clientLeft(long *p) = 0;

  };
#else

  typedef struct IHTMLTableRowMetricsVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTableRowMetrics *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTableRowMetrics *This);

      ULONG (WINAPI *Release)(IHTMLTableRowMetrics *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTableRowMetrics *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTableRowMetrics *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get_clientHeight)(IHTMLTableRowMetrics *This,long *p);

      HRESULT (WINAPI *get_clientWidth)(IHTMLTableRowMetrics *This,long *p);

      HRESULT (WINAPI *get_clientTop)(IHTMLTableRowMetrics *This,long *p);

      HRESULT (WINAPI *get_clientLeft)(IHTMLTableRowMetrics *This,long *p);

    END_INTERFACE
  } IHTMLTableRowMetricsVtbl;

  interface IHTMLTableRowMetrics
  {
    CONST_VTBL struct IHTMLTableRowMetricsVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLTableRowMetrics_get_clientHeight_Proxy(IHTMLTableRowMetrics *This,long *p);

  void __RPC_STUB IHTMLTableRowMetrics_get_clientHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRowMetrics_get_clientWidth_Proxy(IHTMLTableRowMetrics *This,long *p);

  void __RPC_STUB IHTMLTableRowMetrics_get_clientWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRowMetrics_get_clientTop_Proxy(IHTMLTableRowMetrics *This,long *p);

  void __RPC_STUB IHTMLTableRowMetrics_get_clientTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableRowMetrics_get_clientLeft_Proxy(IHTMLTableRowMetrics *This,long *p);

  void __RPC_STUB IHTMLTableRowMetrics_get_clientLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTableCell_INTERFACE_DEFINED__
#define __IHTMLTableCell_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTableCell;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTableCell : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_rowSpan(long v) = 0;

    virtual HRESULT WINAPI get_rowSpan(long *p) = 0;

    virtual HRESULT WINAPI put_colSpan(long v) = 0;

    virtual HRESULT WINAPI get_colSpan(long *p) = 0;

    virtual HRESULT WINAPI put_align(BSTR v) = 0;

    virtual HRESULT WINAPI get_align(BSTR *p) = 0;

    virtual HRESULT WINAPI put_vAlign(BSTR v) = 0;

    virtual HRESULT WINAPI get_vAlign(BSTR *p) = 0;

    virtual HRESULT WINAPI put_bgColor(VARIANT v) = 0;

    virtual HRESULT WINAPI get_bgColor(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_noWrap(VARIANT_BOOL v) = 0;

    virtual HRESULT WINAPI get_noWrap(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI put_background(BSTR v) = 0;

    virtual HRESULT WINAPI get_background(BSTR *p) = 0;

    virtual HRESULT WINAPI put_borderColor(VARIANT v) = 0;

    virtual HRESULT WINAPI get_borderColor(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_borderColorLight(VARIANT v) = 0;

    virtual HRESULT WINAPI get_borderColorLight(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_borderColorDark(VARIANT v) = 0;

    virtual HRESULT WINAPI get_borderColorDark(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_width(VARIANT v) = 0;

    virtual HRESULT WINAPI get_width(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_height(VARIANT v) = 0;

    virtual HRESULT WINAPI get_height(VARIANT *p) = 0;

    virtual HRESULT WINAPI get_cellIndex(long *p) = 0;

  };
#else

  typedef struct IHTMLTableCellVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTableCell *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTableCell *This);

      ULONG (WINAPI *Release)(IHTMLTableCell *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTableCell *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTableCell *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_rowSpan)(IHTMLTableCell *This,long v);

      HRESULT (WINAPI *get_rowSpan)(IHTMLTableCell *This,long *p);

      HRESULT (WINAPI *put_colSpan)(IHTMLTableCell *This,long v);

      HRESULT (WINAPI *get_colSpan)(IHTMLTableCell *This,long *p);

      HRESULT (WINAPI *put_align)(IHTMLTableCell *This,BSTR v);

      HRESULT (WINAPI *get_align)(IHTMLTableCell *This,BSTR *p);

      HRESULT (WINAPI *put_vAlign)(IHTMLTableCell *This,BSTR v);

      HRESULT (WINAPI *get_vAlign)(IHTMLTableCell *This,BSTR *p);

      HRESULT (WINAPI *put_bgColor)(IHTMLTableCell *This,VARIANT v);

      HRESULT (WINAPI *get_bgColor)(IHTMLTableCell *This,VARIANT *p);

      HRESULT (WINAPI *put_noWrap)(IHTMLTableCell *This,VARIANT_BOOL v);

      HRESULT (WINAPI *get_noWrap)(IHTMLTableCell *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *put_background)(IHTMLTableCell *This,BSTR v);

      HRESULT (WINAPI *get_background)(IHTMLTableCell *This,BSTR *p);

      HRESULT (WINAPI *put_borderColor)(IHTMLTableCell *This,VARIANT v);

      HRESULT (WINAPI *get_borderColor)(IHTMLTableCell *This,VARIANT *p);

      HRESULT (WINAPI *put_borderColorLight)(IHTMLTableCell *This,VARIANT v);

      HRESULT (WINAPI *get_borderColorLight)(IHTMLTableCell *This,VARIANT *p);

      HRESULT (WINAPI *put_borderColorDark)(IHTMLTableCell *This,VARIANT v);

      HRESULT (WINAPI *get_borderColorDark)(IHTMLTableCell *This,VARIANT *p);

      HRESULT (WINAPI *put_width)(IHTMLTableCell *This,VARIANT v);

      HRESULT (WINAPI *get_width)(IHTMLTableCell *This,VARIANT *p);

      HRESULT (WINAPI *put_height)(IHTMLTableCell *This,VARIANT v);

      HRESULT (WINAPI *get_height)(IHTMLTableCell *This,VARIANT *p);

      HRESULT (WINAPI *get_cellIndex)(IHTMLTableCell *This,long *p);

    END_INTERFACE
  } IHTMLTableCellVtbl;

  interface IHTMLTableCell
  {
    CONST_VTBL struct IHTMLTableCellVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLTableCell_put_rowSpan_Proxy(IHTMLTableCell *This,long v);

  void __RPC_STUB IHTMLTableCell_put_rowSpan_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_get_rowSpan_Proxy(IHTMLTableCell *This,long *p);

  void __RPC_STUB IHTMLTableCell_get_rowSpan_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_put_colSpan_Proxy(IHTMLTableCell *This,long v);

  void __RPC_STUB IHTMLTableCell_put_colSpan_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_get_colSpan_Proxy(IHTMLTableCell *This,long *p);

  void __RPC_STUB IHTMLTableCell_get_colSpan_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_put_align_Proxy(IHTMLTableCell *This,BSTR v);

  void __RPC_STUB IHTMLTableCell_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_get_align_Proxy(IHTMLTableCell *This,BSTR *p);

  void __RPC_STUB IHTMLTableCell_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_put_vAlign_Proxy(IHTMLTableCell *This,BSTR v);

  void __RPC_STUB IHTMLTableCell_put_vAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_get_vAlign_Proxy(IHTMLTableCell *This,BSTR *p);

  void __RPC_STUB IHTMLTableCell_get_vAlign_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_put_bgColor_Proxy(IHTMLTableCell *This,VARIANT v);

  void __RPC_STUB IHTMLTableCell_put_bgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_get_bgColor_Proxy(IHTMLTableCell *This,VARIANT *p);

  void __RPC_STUB IHTMLTableCell_get_bgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_put_noWrap_Proxy(IHTMLTableCell *This,VARIANT_BOOL v);

  void __RPC_STUB IHTMLTableCell_put_noWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_get_noWrap_Proxy(IHTMLTableCell *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLTableCell_get_noWrap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_put_background_Proxy(IHTMLTableCell *This,BSTR v);

  void __RPC_STUB IHTMLTableCell_put_background_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_get_background_Proxy(IHTMLTableCell *This,BSTR *p);

  void __RPC_STUB IHTMLTableCell_get_background_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_put_borderColor_Proxy(IHTMLTableCell *This,VARIANT v);

  void __RPC_STUB IHTMLTableCell_put_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_get_borderColor_Proxy(IHTMLTableCell *This,VARIANT *p);

  void __RPC_STUB IHTMLTableCell_get_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_put_borderColorLight_Proxy(IHTMLTableCell *This,VARIANT v);

  void __RPC_STUB IHTMLTableCell_put_borderColorLight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_get_borderColorLight_Proxy(IHTMLTableCell *This,VARIANT *p);

  void __RPC_STUB IHTMLTableCell_get_borderColorLight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_put_borderColorDark_Proxy(IHTMLTableCell *This,VARIANT v);

  void __RPC_STUB IHTMLTableCell_put_borderColorDark_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_get_borderColorDark_Proxy(IHTMLTableCell *This,VARIANT *p);

  void __RPC_STUB IHTMLTableCell_get_borderColorDark_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_put_width_Proxy(IHTMLTableCell *This,VARIANT v);

  void __RPC_STUB IHTMLTableCell_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_get_width_Proxy(IHTMLTableCell *This,VARIANT *p);

  void __RPC_STUB IHTMLTableCell_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_put_height_Proxy(IHTMLTableCell *This,VARIANT v);

  void __RPC_STUB IHTMLTableCell_put_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_get_height_Proxy(IHTMLTableCell *This,VARIANT *p);

  void __RPC_STUB IHTMLTableCell_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell_get_cellIndex_Proxy(IHTMLTableCell *This,long *p);

  void __RPC_STUB IHTMLTableCell_get_cellIndex_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLTableCell2_INTERFACE_DEFINED__
#define __IHTMLTableCell2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLTableCell2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLTableCell2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_abbr(BSTR v) = 0;

    virtual HRESULT WINAPI get_abbr(BSTR *p) = 0;

    virtual HRESULT WINAPI put_axis(BSTR v) = 0;

    virtual HRESULT WINAPI get_axis(BSTR *p) = 0;

    virtual HRESULT WINAPI put_ch(BSTR v) = 0;

    virtual HRESULT WINAPI get_ch(BSTR *p) = 0;

    virtual HRESULT WINAPI put_chOff(BSTR v) = 0;

    virtual HRESULT WINAPI get_chOff(BSTR *p) = 0;

    virtual HRESULT WINAPI put_headers(BSTR v) = 0;

    virtual HRESULT WINAPI get_headers(BSTR *p) = 0;

    virtual HRESULT WINAPI put_scope(BSTR v) = 0;

    virtual HRESULT WINAPI get_scope(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLTableCell2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLTableCell2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLTableCell2 *This);

      ULONG (WINAPI *Release)(IHTMLTableCell2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLTableCell2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLTableCell2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_abbr)(IHTMLTableCell2 *This,BSTR v);

      HRESULT (WINAPI *get_abbr)(IHTMLTableCell2 *This,BSTR *p);

      HRESULT (WINAPI *put_axis)(IHTMLTableCell2 *This,BSTR v);

      HRESULT (WINAPI *get_axis)(IHTMLTableCell2 *This,BSTR *p);

      HRESULT (WINAPI *put_ch)(IHTMLTableCell2 *This,BSTR v);

      HRESULT (WINAPI *get_ch)(IHTMLTableCell2 *This,BSTR *p);

      HRESULT (WINAPI *put_chOff)(IHTMLTableCell2 *This,BSTR v);

      HRESULT (WINAPI *get_chOff)(IHTMLTableCell2 *This,BSTR *p);

      HRESULT (WINAPI *put_headers)(IHTMLTableCell2 *This,BSTR v);

      HRESULT (WINAPI *get_headers)(IHTMLTableCell2 *This,BSTR *p);

      HRESULT (WINAPI *put_scope)(IHTMLTableCell2 *This,BSTR v);

      HRESULT (WINAPI *get_scope)(IHTMLTableCell2 *This,BSTR *p);

    END_INTERFACE
  } IHTMLTableCell2Vtbl;

  interface IHTMLTableCell2
  {
    CONST_VTBL struct IHTMLTableCell2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLTableCell2_put_abbr_Proxy(IHTMLTableCell2 *This,BSTR v);

  void __RPC_STUB IHTMLTableCell2_put_abbr_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell2_get_abbr_Proxy(IHTMLTableCell2 *This,BSTR *p);

  void __RPC_STUB IHTMLTableCell2_get_abbr_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell2_put_axis_Proxy(IHTMLTableCell2 *This,BSTR v);

  void __RPC_STUB IHTMLTableCell2_put_axis_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell2_get_axis_Proxy(IHTMLTableCell2 *This,BSTR *p);

  void __RPC_STUB IHTMLTableCell2_get_axis_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell2_put_ch_Proxy(IHTMLTableCell2 *This,BSTR v);

  void __RPC_STUB IHTMLTableCell2_put_ch_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell2_get_ch_Proxy(IHTMLTableCell2 *This,BSTR *p);

  void __RPC_STUB IHTMLTableCell2_get_ch_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell2_put_chOff_Proxy(IHTMLTableCell2 *This,BSTR v);

  void __RPC_STUB IHTMLTableCell2_put_chOff_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell2_get_chOff_Proxy(IHTMLTableCell2 *This,BSTR *p);

  void __RPC_STUB IHTMLTableCell2_get_chOff_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell2_put_headers_Proxy(IHTMLTableCell2 *This,BSTR v);

  void __RPC_STUB IHTMLTableCell2_put_headers_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell2_get_headers_Proxy(IHTMLTableCell2 *This,BSTR *p);

  void __RPC_STUB IHTMLTableCell2_get_headers_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell2_put_scope_Proxy(IHTMLTableCell2 *This,BSTR v);

  void __RPC_STUB IHTMLTableCell2_put_scope_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLTableCell2_get_scope_Proxy(IHTMLTableCell2 *This,BSTR *p);

  void __RPC_STUB IHTMLTableCell2_get_scope_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLTable_DISPINTERFACE_DEFINED__
#define __DispHTMLTable_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLTable;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLTable : public IDispatch
  {
  };
#else

  typedef struct DispHTMLTableVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLTable *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLTable *This);

      ULONG (WINAPI *Release)(DispHTMLTable *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLTable *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLTable *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLTableVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLTable;

#ifdef __cplusplus

  class HTMLTable;
#endif

#ifndef __DispHTMLTableCol_DISPINTERFACE_DEFINED__
#define __DispHTMLTableCol_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLTableCol;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLTableCol : public IDispatch
  {
  };
#else

  typedef struct DispHTMLTableColVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLTableCol *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLTableCol *This);

      ULONG (WINAPI *Release)(DispHTMLTableCol *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLTableCol *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLTableCol *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLTableColVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLTableCol;

#ifdef __cplusplus

  class HTMLTableCol;
#endif

#ifndef __DispHTMLTableSection_DISPINTERFACE_DEFINED__
#define __DispHTMLTableSection_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLTableSection;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLTableSection : public IDispatch
  {
  };
#else

  typedef struct DispHTMLTableSectionVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLTableSection *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLTableSection *This);

      ULONG (WINAPI *Release)(DispHTMLTableSection *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLTableSection *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLTableSection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLTableSectionVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLTableSection;

#ifdef __cplusplus

  class HTMLTableSection;
#endif

#ifndef __DispHTMLTableRow_DISPINTERFACE_DEFINED__
#define __DispHTMLTableRow_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLTableRow;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLTableRow : public IDispatch
  {
  };
#else

  typedef struct DispHTMLTableRowVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLTableRow *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLTableRow *This);

      ULONG (WINAPI *Release)(DispHTMLTableRow *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLTableRow *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLTableRow *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLTableRowVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLTableRow;

#ifdef __cplusplus

  class HTMLTableRow;
#endif

#ifndef __DispHTMLTableCell_DISPINTERFACE_DEFINED__
#define __DispHTMLTableCell_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLTableCell;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLTableCell : public IDispatch
  {
  };
#else

  typedef struct DispHTMLTableCellVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLTableCell *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLTableCell *This);

      ULONG (WINAPI *Release)(DispHTMLTableCell *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLTableCell *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLTableCell *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLTableCellVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLTableCell;

#ifdef __cplusplus

  class HTMLTableCell;
#endif

#ifndef __HTMLScriptEvents2_DISPINTERFACE_DEFINED__
#define __HTMLScriptEvents2_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLScriptEvents2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLScriptEvents2 : public IDispatch
  {
  };
#else

  typedef struct HTMLScriptEvents2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLScriptEvents2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLScriptEvents2 *This);

      ULONG (WINAPI *Release)(HTMLScriptEvents2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLScriptEvents2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLScriptEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLScriptEvents2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __HTMLScriptEvents_DISPINTERFACE_DEFINED__
#define __HTMLScriptEvents_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLScriptEvents;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLScriptEvents : public IDispatch
  {
  };
#else

  typedef struct HTMLScriptEventsVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLScriptEvents *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLScriptEvents *This);

      ULONG (WINAPI *Release)(HTMLScriptEvents *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLScriptEvents *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLScriptEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLScriptEventsVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __IHTMLScriptElement_INTERFACE_DEFINED__
#define __IHTMLScriptElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLScriptElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLScriptElement : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_src(BSTR v) = 0;

    virtual HRESULT WINAPI get_src(BSTR *p) = 0;

    virtual HRESULT WINAPI put_htmlFor(BSTR v) = 0;

    virtual HRESULT WINAPI get_htmlFor(BSTR *p) = 0;

    virtual HRESULT WINAPI put_event(BSTR v) = 0;

    virtual HRESULT WINAPI get_event(BSTR *p) = 0;

    virtual HRESULT WINAPI put_text(BSTR v) = 0;

    virtual HRESULT WINAPI get_text(BSTR *p) = 0;

    virtual HRESULT WINAPI put_defer(VARIANT_BOOL v) = 0;

    virtual HRESULT WINAPI get_defer(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_readyState(BSTR *p) = 0;

    virtual HRESULT WINAPI put_onerror(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onerror(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_type(BSTR v) = 0;

    virtual HRESULT WINAPI get_type(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLScriptElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLScriptElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLScriptElement *This);

      ULONG (WINAPI *Release)(IHTMLScriptElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLScriptElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLScriptElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_src)(IHTMLScriptElement *This,BSTR v);

      HRESULT (WINAPI *get_src)(IHTMLScriptElement *This,BSTR *p);

      HRESULT (WINAPI *put_htmlFor)(IHTMLScriptElement *This,BSTR v);

      HRESULT (WINAPI *get_htmlFor)(IHTMLScriptElement *This,BSTR *p);

      HRESULT (WINAPI *put_event)(IHTMLScriptElement *This,BSTR v);

      HRESULT (WINAPI *get_event)(IHTMLScriptElement *This,BSTR *p);

      HRESULT (WINAPI *put_text)(IHTMLScriptElement *This,BSTR v);

      HRESULT (WINAPI *get_text)(IHTMLScriptElement *This,BSTR *p);

      HRESULT (WINAPI *put_defer)(IHTMLScriptElement *This,VARIANT_BOOL v);

      HRESULT (WINAPI *get_defer)(IHTMLScriptElement *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_readyState)(IHTMLScriptElement *This,BSTR *p);

      HRESULT (WINAPI *put_onerror)(IHTMLScriptElement *This,VARIANT v);

      HRESULT (WINAPI *get_onerror)(IHTMLScriptElement *This,VARIANT *p);

      HRESULT (WINAPI *put_type)(IHTMLScriptElement *This,BSTR v);

      HRESULT (WINAPI *get_type)(IHTMLScriptElement *This,BSTR *p);

    END_INTERFACE
  } IHTMLScriptElementVtbl;

  interface IHTMLScriptElement
  {
    CONST_VTBL struct IHTMLScriptElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLScriptElement_put_src_Proxy(IHTMLScriptElement *This,BSTR v);

  void __RPC_STUB IHTMLScriptElement_put_src_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement_get_src_Proxy(IHTMLScriptElement *This,BSTR *p);

  void __RPC_STUB IHTMLScriptElement_get_src_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement_put_htmlFor_Proxy(IHTMLScriptElement *This,BSTR v);

  void __RPC_STUB IHTMLScriptElement_put_htmlFor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement_get_htmlFor_Proxy(IHTMLScriptElement *This,BSTR *p);

  void __RPC_STUB IHTMLScriptElement_get_htmlFor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement_put_event_Proxy(IHTMLScriptElement *This,BSTR v);

  void __RPC_STUB IHTMLScriptElement_put_event_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement_get_event_Proxy(IHTMLScriptElement *This,BSTR *p);

  void __RPC_STUB IHTMLScriptElement_get_event_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement_put_text_Proxy(IHTMLScriptElement *This,BSTR v);

  void __RPC_STUB IHTMLScriptElement_put_text_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement_get_text_Proxy(IHTMLScriptElement *This,BSTR *p);

  void __RPC_STUB IHTMLScriptElement_get_text_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement_put_defer_Proxy(IHTMLScriptElement *This,VARIANT_BOOL v);

  void __RPC_STUB IHTMLScriptElement_put_defer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement_get_defer_Proxy(IHTMLScriptElement *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLScriptElement_get_defer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement_get_readyState_Proxy(IHTMLScriptElement *This,BSTR *p);

  void __RPC_STUB IHTMLScriptElement_get_readyState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement_put_onerror_Proxy(IHTMLScriptElement *This,VARIANT v);

  void __RPC_STUB IHTMLScriptElement_put_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement_get_onerror_Proxy(IHTMLScriptElement *This,VARIANT *p);

  void __RPC_STUB IHTMLScriptElement_get_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement_put_type_Proxy(IHTMLScriptElement *This,BSTR v);

  void __RPC_STUB IHTMLScriptElement_put_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement_get_type_Proxy(IHTMLScriptElement *This,BSTR *p);

  void __RPC_STUB IHTMLScriptElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLScriptElement2_INTERFACE_DEFINED__
#define __IHTMLScriptElement2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLScriptElement2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLScriptElement2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_charset(BSTR v) = 0;

    virtual HRESULT WINAPI get_charset(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLScriptElement2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLScriptElement2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLScriptElement2 *This);

      ULONG (WINAPI *Release)(IHTMLScriptElement2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLScriptElement2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLScriptElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_charset)(IHTMLScriptElement2 *This,BSTR v);

      HRESULT (WINAPI *get_charset)(IHTMLScriptElement2 *This,BSTR *p);

    END_INTERFACE
  } IHTMLScriptElement2Vtbl;

  interface IHTMLScriptElement2
  {
    CONST_VTBL struct IHTMLScriptElement2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLScriptElement2_put_charset(This,v) (This)->lpVtbl->put_charset(This,v)

#define IHTMLScriptElement2_get_charset(This,p) (This)->lpVtbl->get_charset(This,p)
#endif
#endif

  HRESULT WINAPI IHTMLScriptElement2_put_charset_Proxy(IHTMLScriptElement2 *This,BSTR v);

  void __RPC_STUB IHTMLScriptElement2_put_charset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLScriptElement2_get_charset_Proxy(IHTMLScriptElement2 *This,BSTR *p);

  void __RPC_STUB IHTMLScriptElement2_get_charset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLScriptElement_DISPINTERFACE_DEFINED__
#define __DispHTMLScriptElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLScriptElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLScriptElement : public IDispatch
  {
  };
#else

  typedef struct DispHTMLScriptElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLScriptElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLScriptElement *This);

      ULONG (WINAPI *Release)(DispHTMLScriptElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLScriptElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLScriptElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLScriptElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLScriptElement;

#ifdef __cplusplus

  class HTMLScriptElement;
#endif

#ifndef __IHTMLNoShowElement_INTERFACE_DEFINED__
#define __IHTMLNoShowElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLNoShowElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLNoShowElement : public IDispatch
  {
  public:
  };
#else

  typedef struct IHTMLNoShowElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLNoShowElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLNoShowElement *This);

      ULONG (WINAPI *Release)(IHTMLNoShowElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLNoShowElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLNoShowElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct IHTMLNoShowElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __DispHTMLNoShowElement_DISPINTERFACE_DEFINED__
#define __DispHTMLNoShowElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLNoShowElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLNoShowElement : public IDispatch
  {
  };
#else

  typedef struct DispHTMLNoShowElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLNoShowElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLNoShowElement *This);

      ULONG (WINAPI *Release)(DispHTMLNoShowElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLNoShowElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLNoShowElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLNoShowElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLNoShowElement;

#ifdef __cplusplus

  class HTMLNoShowElement;
#endif

#ifndef __HTMLObjectElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLObjectElementEvents2_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLObjectElementEvents2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLObjectElementEvents2 : public IDispatch
  {
  };
#else

  typedef struct HTMLObjectElementEvents2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLObjectElementEvents2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLObjectElementEvents2 *This);

      ULONG (WINAPI *Release)(HTMLObjectElementEvents2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLObjectElementEvents2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLObjectElementEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLObjectElementEvents2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __HTMLObjectElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLObjectElementEvents_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLObjectElementEvents;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLObjectElementEvents : public IDispatch
  {
  };
#else

  typedef struct HTMLObjectElementEventsVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLObjectElementEvents *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLObjectElementEvents *This);

      ULONG (WINAPI *Release)(HTMLObjectElementEvents *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLObjectElementEvents *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLObjectElementEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLObjectElementEventsVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __IHTMLObjectElement_INTERFACE_DEFINED__
#define __IHTMLObjectElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLObjectElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLObjectElement : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get_object(IDispatch **p) = 0;

    virtual HRESULT WINAPI get_classid(BSTR *p) = 0;

    virtual HRESULT WINAPI get_data(BSTR *p) = 0;

    virtual HRESULT WINAPI putref_recordset(IDispatch *v) = 0;

    virtual HRESULT WINAPI get_recordset(IDispatch **p) = 0;

    virtual HRESULT WINAPI put_align(BSTR v) = 0;

    virtual HRESULT WINAPI get_align(BSTR *p) = 0;

    virtual HRESULT WINAPI put_name(BSTR v) = 0;

    virtual HRESULT WINAPI get_name(BSTR *p) = 0;

    virtual HRESULT WINAPI put_codeBase(BSTR v) = 0;

    virtual HRESULT WINAPI get_codeBase(BSTR *p) = 0;

    virtual HRESULT WINAPI put_codeType(BSTR v) = 0;

    virtual HRESULT WINAPI get_codeType(BSTR *p) = 0;

    virtual HRESULT WINAPI put_code(BSTR v) = 0;

    virtual HRESULT WINAPI get_code(BSTR *p) = 0;

    virtual HRESULT WINAPI get_BaseHref(BSTR *p) = 0;

    virtual HRESULT WINAPI put_type(BSTR v) = 0;

    virtual HRESULT WINAPI get_type(BSTR *p) = 0;

    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;

    virtual HRESULT WINAPI put_width(VARIANT v) = 0;

    virtual HRESULT WINAPI get_width(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_height(VARIANT v) = 0;

    virtual HRESULT WINAPI get_height(VARIANT *p) = 0;

    virtual HRESULT WINAPI get_readyState(long *p) = 0;

    virtual HRESULT WINAPI put_onreadystatechange(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onreadystatechange(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onerror(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onerror(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_altHtml(BSTR v) = 0;

    virtual HRESULT WINAPI get_altHtml(BSTR *p) = 0;

    virtual HRESULT WINAPI put_vspace(long v) = 0;

    virtual HRESULT WINAPI get_vspace(long *p) = 0;

    virtual HRESULT WINAPI put_hspace(long v) = 0;

    virtual HRESULT WINAPI get_hspace(long *p) = 0;

  };
#else

  typedef struct IHTMLObjectElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLObjectElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLObjectElement *This);

      ULONG (WINAPI *Release)(IHTMLObjectElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLObjectElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLObjectElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get_object)(IHTMLObjectElement *This,IDispatch **p);

      HRESULT (WINAPI *get_classid)(IHTMLObjectElement *This,BSTR *p);

      HRESULT (WINAPI *get_data)(IHTMLObjectElement *This,BSTR *p);

      HRESULT (WINAPI *putref_recordset)(IHTMLObjectElement *This,IDispatch *v);

      HRESULT (WINAPI *get_recordset)(IHTMLObjectElement *This,IDispatch **p);

      HRESULT (WINAPI *put_align)(IHTMLObjectElement *This,BSTR v);

      HRESULT (WINAPI *get_align)(IHTMLObjectElement *This,BSTR *p);

      HRESULT (WINAPI *put_name)(IHTMLObjectElement *This,BSTR v);

      HRESULT (WINAPI *get_name)(IHTMLObjectElement *This,BSTR *p);

      HRESULT (WINAPI *put_codeBase)(IHTMLObjectElement *This,BSTR v);

      HRESULT (WINAPI *get_codeBase)(IHTMLObjectElement *This,BSTR *p);

      HRESULT (WINAPI *put_codeType)(IHTMLObjectElement *This,BSTR v);

      HRESULT (WINAPI *get_codeType)(IHTMLObjectElement *This,BSTR *p);

      HRESULT (WINAPI *put_code)(IHTMLObjectElement *This,BSTR v);

      HRESULT (WINAPI *get_code)(IHTMLObjectElement *This,BSTR *p);

      HRESULT (WINAPI *get_BaseHref)(IHTMLObjectElement *This,BSTR *p);

      HRESULT (WINAPI *put_type)(IHTMLObjectElement *This,BSTR v);

      HRESULT (WINAPI *get_type)(IHTMLObjectElement *This,BSTR *p);

      HRESULT (WINAPI *get_form)(IHTMLObjectElement *This,IHTMLFormElement **p);

      HRESULT (WINAPI *put_width)(IHTMLObjectElement *This,VARIANT v);

      HRESULT (WINAPI *get_width)(IHTMLObjectElement *This,VARIANT *p);

      HRESULT (WINAPI *put_height)(IHTMLObjectElement *This,VARIANT v);

      HRESULT (WINAPI *get_height)(IHTMLObjectElement *This,VARIANT *p);

      HRESULT (WINAPI *get_readyState)(IHTMLObjectElement *This,long *p);

      HRESULT (WINAPI *put_onreadystatechange)(IHTMLObjectElement *This,VARIANT v);

      HRESULT (WINAPI *get_onreadystatechange)(IHTMLObjectElement *This,VARIANT *p);

      HRESULT (WINAPI *put_onerror)(IHTMLObjectElement *This,VARIANT v);

      HRESULT (WINAPI *get_onerror)(IHTMLObjectElement *This,VARIANT *p);

      HRESULT (WINAPI *put_altHtml)(IHTMLObjectElement *This,BSTR v);

      HRESULT (WINAPI *get_altHtml)(IHTMLObjectElement *This,BSTR *p);

      HRESULT (WINAPI *put_vspace)(IHTMLObjectElement *This,long v);

      HRESULT (WINAPI *get_vspace)(IHTMLObjectElement *This,long *p);

      HRESULT (WINAPI *put_hspace)(IHTMLObjectElement *This,long v);

      HRESULT (WINAPI *get_hspace)(IHTMLObjectElement *This,long *p);

    END_INTERFACE
  } IHTMLObjectElementVtbl;

  interface IHTMLObjectElement
  {
    CONST_VTBL struct IHTMLObjectElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLObjectElement_get_object_Proxy(IHTMLObjectElement *This,IDispatch **p);

  void __RPC_STUB IHTMLObjectElement_get_object_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_classid_Proxy(IHTMLObjectElement *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement_get_classid_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_data_Proxy(IHTMLObjectElement *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement_get_data_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_putref_recordset_Proxy(IHTMLObjectElement *This,IDispatch *v);

  void __RPC_STUB IHTMLObjectElement_putref_recordset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_recordset_Proxy(IHTMLObjectElement *This,IDispatch **p);

  void __RPC_STUB IHTMLObjectElement_get_recordset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_put_align_Proxy(IHTMLObjectElement *This,BSTR v);

  void __RPC_STUB IHTMLObjectElement_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_align_Proxy(IHTMLObjectElement *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_put_name_Proxy(IHTMLObjectElement *This,BSTR v);

  void __RPC_STUB IHTMLObjectElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_name_Proxy(IHTMLObjectElement *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_put_codeBase_Proxy(IHTMLObjectElement *This,BSTR v);

  void __RPC_STUB IHTMLObjectElement_put_codeBase_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_codeBase_Proxy(IHTMLObjectElement *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement_get_codeBase_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_put_codeType_Proxy(IHTMLObjectElement *This,BSTR v);

  void __RPC_STUB IHTMLObjectElement_put_codeType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_codeType_Proxy(IHTMLObjectElement *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement_get_codeType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_put_code_Proxy(IHTMLObjectElement *This,BSTR v);

  void __RPC_STUB IHTMLObjectElement_put_code_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_code_Proxy(IHTMLObjectElement *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement_get_code_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_BaseHref_Proxy(IHTMLObjectElement *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement_get_BaseHref_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_put_type_Proxy(IHTMLObjectElement *This,BSTR v);

  void __RPC_STUB IHTMLObjectElement_put_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_type_Proxy(IHTMLObjectElement *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_form_Proxy(IHTMLObjectElement *This,IHTMLFormElement **p);

  void __RPC_STUB IHTMLObjectElement_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_put_width_Proxy(IHTMLObjectElement *This,VARIANT v);

  void __RPC_STUB IHTMLObjectElement_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_width_Proxy(IHTMLObjectElement *This,VARIANT *p);

  void __RPC_STUB IHTMLObjectElement_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_put_height_Proxy(IHTMLObjectElement *This,VARIANT v);

  void __RPC_STUB IHTMLObjectElement_put_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_height_Proxy(IHTMLObjectElement *This,VARIANT *p);

  void __RPC_STUB IHTMLObjectElement_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_readyState_Proxy(IHTMLObjectElement *This,long *p);

  void __RPC_STUB IHTMLObjectElement_get_readyState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_put_onreadystatechange_Proxy(IHTMLObjectElement *This,VARIANT v);

  void __RPC_STUB IHTMLObjectElement_put_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_onreadystatechange_Proxy(IHTMLObjectElement *This,VARIANT *p);

  void __RPC_STUB IHTMLObjectElement_get_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_put_onerror_Proxy(IHTMLObjectElement *This,VARIANT v);

  void __RPC_STUB IHTMLObjectElement_put_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_onerror_Proxy(IHTMLObjectElement *This,VARIANT *p);

  void __RPC_STUB IHTMLObjectElement_get_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_put_altHtml_Proxy(IHTMLObjectElement *This,BSTR v);

  void __RPC_STUB IHTMLObjectElement_put_altHtml_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_altHtml_Proxy(IHTMLObjectElement *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement_get_altHtml_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_put_vspace_Proxy(IHTMLObjectElement *This,long v);

  void __RPC_STUB IHTMLObjectElement_put_vspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_vspace_Proxy(IHTMLObjectElement *This,long *p);

  void __RPC_STUB IHTMLObjectElement_get_vspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_put_hspace_Proxy(IHTMLObjectElement *This,long v);

  void __RPC_STUB IHTMLObjectElement_put_hspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement_get_hspace_Proxy(IHTMLObjectElement *This,long *p);

  void __RPC_STUB IHTMLObjectElement_get_hspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLObjectElement2_INTERFACE_DEFINED__
#define __IHTMLObjectElement2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLObjectElement2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLObjectElement2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI namedRecordset(BSTR dataMember,VARIANT *hierarchy,IDispatch **ppRecordset) = 0;

    virtual HRESULT WINAPI put_classid(BSTR v) = 0;

    virtual HRESULT WINAPI get_classid(BSTR *p) = 0;

    virtual HRESULT WINAPI put_data(BSTR v) = 0;

    virtual HRESULT WINAPI get_data(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLObjectElement2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLObjectElement2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLObjectElement2 *This);

      ULONG (WINAPI *Release)(IHTMLObjectElement2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLObjectElement2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLObjectElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *namedRecordset)(IHTMLObjectElement2 *This,BSTR dataMember,VARIANT *hierarchy,IDispatch **ppRecordset);

      HRESULT (WINAPI *put_classid)(IHTMLObjectElement2 *This,BSTR v);

      HRESULT (WINAPI *get_classid)(IHTMLObjectElement2 *This,BSTR *p);

      HRESULT (WINAPI *put_data)(IHTMLObjectElement2 *This,BSTR v);

      HRESULT (WINAPI *get_data)(IHTMLObjectElement2 *This,BSTR *p);

    END_INTERFACE
  } IHTMLObjectElement2Vtbl;

  interface IHTMLObjectElement2
  {
    CONST_VTBL struct IHTMLObjectElement2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLObjectElement2_namedRecordset_Proxy(IHTMLObjectElement2 *This,BSTR dataMember,VARIANT *hierarchy,IDispatch **ppRecordset);

  void __RPC_STUB IHTMLObjectElement2_namedRecordset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement2_put_classid_Proxy(IHTMLObjectElement2 *This,BSTR v);

  void __RPC_STUB IHTMLObjectElement2_put_classid_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement2_get_classid_Proxy(IHTMLObjectElement2 *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement2_get_classid_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement2_put_data_Proxy(IHTMLObjectElement2 *This,BSTR v);

  void __RPC_STUB IHTMLObjectElement2_put_data_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement2_get_data_Proxy(IHTMLObjectElement2 *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement2_get_data_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLObjectElement3_INTERFACE_DEFINED__
#define __IHTMLObjectElement3_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLObjectElement3;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLObjectElement3 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_archive(BSTR v) = 0;

    virtual HRESULT WINAPI get_archive(BSTR *p) = 0;

    virtual HRESULT WINAPI put_alt(BSTR v) = 0;

    virtual HRESULT WINAPI get_alt(BSTR *p) = 0;

    virtual HRESULT WINAPI put_declare(VARIANT_BOOL v) = 0;

    virtual HRESULT WINAPI get_declare(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI put_standby(BSTR v) = 0;

    virtual HRESULT WINAPI get_standby(BSTR *p) = 0;

    virtual HRESULT WINAPI put_border(VARIANT v) = 0;

    virtual HRESULT WINAPI get_border(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_useMap(BSTR v) = 0;

    virtual HRESULT WINAPI get_useMap(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLObjectElement3Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLObjectElement3 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLObjectElement3 *This);

      ULONG (WINAPI *Release)(IHTMLObjectElement3 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLObjectElement3 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLObjectElement3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_archive)(IHTMLObjectElement3 *This,BSTR v);

      HRESULT (WINAPI *get_archive)(IHTMLObjectElement3 *This,BSTR *p);

      HRESULT (WINAPI *put_alt)(IHTMLObjectElement3 *This,BSTR v);

      HRESULT (WINAPI *get_alt)(IHTMLObjectElement3 *This,BSTR *p);

      HRESULT (WINAPI *put_declare)(IHTMLObjectElement3 *This,VARIANT_BOOL v);

      HRESULT (WINAPI *get_declare)(IHTMLObjectElement3 *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *put_standby)(IHTMLObjectElement3 *This,BSTR v);

      HRESULT (WINAPI *get_standby)(IHTMLObjectElement3 *This,BSTR *p);

      HRESULT (WINAPI *put_border)(IHTMLObjectElement3 *This,VARIANT v);

      HRESULT (WINAPI *get_border)(IHTMLObjectElement3 *This,VARIANT *p);

      HRESULT (WINAPI *put_useMap)(IHTMLObjectElement3 *This,BSTR v);

      HRESULT (WINAPI *get_useMap)(IHTMLObjectElement3 *This,BSTR *p);

    END_INTERFACE
  } IHTMLObjectElement3Vtbl;

  interface IHTMLObjectElement3
  {
    CONST_VTBL struct IHTMLObjectElement3Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLObjectElement3_put_archive_Proxy(IHTMLObjectElement3 *This,BSTR v);

  void __RPC_STUB IHTMLObjectElement3_put_archive_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement3_get_archive_Proxy(IHTMLObjectElement3 *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement3_get_archive_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement3_put_alt_Proxy(IHTMLObjectElement3 *This,BSTR v);

  void __RPC_STUB IHTMLObjectElement3_put_alt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement3_get_alt_Proxy(IHTMLObjectElement3 *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement3_get_alt_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement3_put_declare_Proxy(IHTMLObjectElement3 *This,VARIANT_BOOL v);

  void __RPC_STUB IHTMLObjectElement3_put_declare_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement3_get_declare_Proxy(IHTMLObjectElement3 *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLObjectElement3_get_declare_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement3_put_standby_Proxy(IHTMLObjectElement3 *This,BSTR v);

  void __RPC_STUB IHTMLObjectElement3_put_standby_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement3_get_standby_Proxy(IHTMLObjectElement3 *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement3_get_standby_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement3_put_border_Proxy(IHTMLObjectElement3 *This,VARIANT v);

  void __RPC_STUB IHTMLObjectElement3_put_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement3_get_border_Proxy(IHTMLObjectElement3 *This,VARIANT *p);

  void __RPC_STUB IHTMLObjectElement3_get_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement3_put_useMap_Proxy(IHTMLObjectElement3 *This,BSTR v);

  void __RPC_STUB IHTMLObjectElement3_put_useMap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLObjectElement3_get_useMap_Proxy(IHTMLObjectElement3 *This,BSTR *p);

  void __RPC_STUB IHTMLObjectElement3_get_useMap_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLParamElement_INTERFACE_DEFINED__
#define __IHTMLParamElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLParamElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLParamElement : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_name(BSTR v) = 0;

    virtual HRESULT WINAPI get_name(BSTR *p) = 0;

    virtual HRESULT WINAPI put_value(BSTR v) = 0;

    virtual HRESULT WINAPI get_value(BSTR *p) = 0;

    virtual HRESULT WINAPI put_type(BSTR v) = 0;

    virtual HRESULT WINAPI get_type(BSTR *p) = 0;

    virtual HRESULT WINAPI put_valueType(BSTR v) = 0;

    virtual HRESULT WINAPI get_valueType(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLParamElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLParamElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLParamElement *This);

      ULONG (WINAPI *Release)(IHTMLParamElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLParamElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLParamElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_name)(IHTMLParamElement *This,BSTR v);

      HRESULT (WINAPI *get_name)(IHTMLParamElement *This,BSTR *p);

      HRESULT (WINAPI *put_value)(IHTMLParamElement *This,BSTR v);

      HRESULT (WINAPI *get_value)(IHTMLParamElement *This,BSTR *p);

      HRESULT (WINAPI *put_type)(IHTMLParamElement *This,BSTR v);

      HRESULT (WINAPI *get_type)(IHTMLParamElement *This,BSTR *p);

      HRESULT (WINAPI *put_valueType)(IHTMLParamElement *This,BSTR v);

      HRESULT (WINAPI *get_valueType)(IHTMLParamElement *This,BSTR *p);

    END_INTERFACE
  } IHTMLParamElementVtbl;

  interface IHTMLParamElement
  {
    CONST_VTBL struct IHTMLParamElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLParamElement_put_name_Proxy(IHTMLParamElement *This,BSTR v);

  void __RPC_STUB IHTMLParamElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLParamElement_get_name_Proxy(IHTMLParamElement *This,BSTR *p);

  void __RPC_STUB IHTMLParamElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLParamElement_put_value_Proxy(IHTMLParamElement *This,BSTR v);

  void __RPC_STUB IHTMLParamElement_put_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLParamElement_get_value_Proxy(IHTMLParamElement *This,BSTR *p);

  void __RPC_STUB IHTMLParamElement_get_value_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLParamElement_put_type_Proxy(IHTMLParamElement *This,BSTR v);

  void __RPC_STUB IHTMLParamElement_put_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLParamElement_get_type_Proxy(IHTMLParamElement *This,BSTR *p);

  void __RPC_STUB IHTMLParamElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLParamElement_put_valueType_Proxy(IHTMLParamElement *This,BSTR v);

  void __RPC_STUB IHTMLParamElement_put_valueType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLParamElement_get_valueType_Proxy(IHTMLParamElement *This,BSTR *p);

  void __RPC_STUB IHTMLParamElement_get_valueType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLObjectElement_DISPINTERFACE_DEFINED__
#define __DispHTMLObjectElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLObjectElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLObjectElement : public IDispatch
  {
  };
#else

  typedef struct DispHTMLObjectElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLObjectElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLObjectElement *This);

      ULONG (WINAPI *Release)(DispHTMLObjectElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLObjectElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLObjectElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLObjectElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLObjectElement;

#ifdef __cplusplus

  class HTMLObjectElement;
#endif

#ifndef __DispHTMLParamElement_DISPINTERFACE_DEFINED__
#define __DispHTMLParamElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLParamElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLParamElement : public IDispatch
  {
  };
#else

  typedef struct DispHTMLParamElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLParamElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLParamElement *This);

      ULONG (WINAPI *Release)(DispHTMLParamElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLParamElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLParamElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLParamElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLParamElement;

#ifdef __cplusplus

  class HTMLParamElement;
#endif

#ifndef __HTMLFrameSiteEvents2_DISPINTERFACE_DEFINED__
#define __HTMLFrameSiteEvents2_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLFrameSiteEvents2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLFrameSiteEvents2 : public IDispatch
  {
  };
#else

  typedef struct HTMLFrameSiteEvents2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLFrameSiteEvents2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLFrameSiteEvents2 *This);

      ULONG (WINAPI *Release)(HTMLFrameSiteEvents2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLFrameSiteEvents2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLFrameSiteEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLFrameSiteEvents2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __HTMLFrameSiteEvents_DISPINTERFACE_DEFINED__
#define __HTMLFrameSiteEvents_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLFrameSiteEvents;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLFrameSiteEvents : public IDispatch
  {
  };
#else

  typedef struct HTMLFrameSiteEventsVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLFrameSiteEvents *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLFrameSiteEvents *This);

      ULONG (WINAPI *Release)(HTMLFrameSiteEvents *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLFrameSiteEvents *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLFrameSiteEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLFrameSiteEventsVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __IHTMLFrameBase2_INTERFACE_DEFINED__
#define __IHTMLFrameBase2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLFrameBase2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLFrameBase2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get_contentWindow(IHTMLWindow2 **p) = 0;

    virtual HRESULT WINAPI put_onload(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onload(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onreadystatechange(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onreadystatechange(VARIANT *p) = 0;

    virtual HRESULT WINAPI get_readyState(BSTR *p) = 0;

    virtual HRESULT WINAPI put_allowTransparency(VARIANT_BOOL v) = 0;

    virtual HRESULT WINAPI get_allowTransparency(VARIANT_BOOL *p) = 0;

  };
#else

  typedef struct IHTMLFrameBase2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLFrameBase2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLFrameBase2 *This);

      ULONG (WINAPI *Release)(IHTMLFrameBase2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFrameBase2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLFrameBase2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get_contentWindow)(IHTMLFrameBase2 *This,IHTMLWindow2 **p);

      HRESULT (WINAPI *put_onload)(IHTMLFrameBase2 *This,VARIANT v);

      HRESULT (WINAPI *get_onload)(IHTMLFrameBase2 *This,VARIANT *p);

      HRESULT (WINAPI *put_onreadystatechange)(IHTMLFrameBase2 *This,VARIANT v);

      HRESULT (WINAPI *get_onreadystatechange)(IHTMLFrameBase2 *This,VARIANT *p);

      HRESULT (WINAPI *get_readyState)(IHTMLFrameBase2 *This,BSTR *p);

      HRESULT (WINAPI *put_allowTransparency)(IHTMLFrameBase2 *This,VARIANT_BOOL v);

      HRESULT (WINAPI *get_allowTransparency)(IHTMLFrameBase2 *This,VARIANT_BOOL *p);

    END_INTERFACE
  } IHTMLFrameBase2Vtbl;

  interface IHTMLFrameBase2
  {
    CONST_VTBL struct IHTMLFrameBase2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLFrameBase2_get_contentWindow_Proxy(IHTMLFrameBase2 *This,IHTMLWindow2 **p);

  void __RPC_STUB IHTMLFrameBase2_get_contentWindow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameBase2_put_onload_Proxy(IHTMLFrameBase2 *This,VARIANT v);

  void __RPC_STUB IHTMLFrameBase2_put_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameBase2_get_onload_Proxy(IHTMLFrameBase2 *This,VARIANT *p);

  void __RPC_STUB IHTMLFrameBase2_get_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameBase2_put_onreadystatechange_Proxy(IHTMLFrameBase2 *This,VARIANT v);

  void __RPC_STUB IHTMLFrameBase2_put_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameBase2_get_onreadystatechange_Proxy(IHTMLFrameBase2 *This,VARIANT *p);

  void __RPC_STUB IHTMLFrameBase2_get_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameBase2_get_readyState_Proxy(IHTMLFrameBase2 *This,BSTR *p);

  void __RPC_STUB IHTMLFrameBase2_get_readyState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameBase2_put_allowTransparency_Proxy(IHTMLFrameBase2 *This,VARIANT_BOOL v);

  void __RPC_STUB IHTMLFrameBase2_put_allowTransparency_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameBase2_get_allowTransparency_Proxy(IHTMLFrameBase2 *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLFrameBase2_get_allowTransparency_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLFrameBase3_INTERFACE_DEFINED__
#define __IHTMLFrameBase3_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLFrameBase3;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLFrameBase3 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_longDesc(BSTR v) = 0;

    virtual HRESULT WINAPI get_longDesc(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLFrameBase3Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLFrameBase3 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLFrameBase3 *This);

      ULONG (WINAPI *Release)(IHTMLFrameBase3 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFrameBase3 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLFrameBase3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_longDesc)(IHTMLFrameBase3 *This,BSTR v);

      HRESULT (WINAPI *get_longDesc)(IHTMLFrameBase3 *This,BSTR *p);

    END_INTERFACE
  } IHTMLFrameBase3Vtbl;

  interface IHTMLFrameBase3
  {
    CONST_VTBL struct IHTMLFrameBase3Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLFrameBase3_put_longDesc(This,v) (This)->lpVtbl->put_longDesc(This,v)

#define IHTMLFrameBase3_get_longDesc(This,p) (This)->lpVtbl->get_longDesc(This,p)
#endif
#endif

  HRESULT WINAPI IHTMLFrameBase3_put_longDesc_Proxy(IHTMLFrameBase3 *This,BSTR v);

  void __RPC_STUB IHTMLFrameBase3_put_longDesc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameBase3_get_longDesc_Proxy(IHTMLFrameBase3 *This,BSTR *p);

  void __RPC_STUB IHTMLFrameBase3_get_longDesc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLFrameBase_DISPINTERFACE_DEFINED__
#define __DispHTMLFrameBase_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLFrameBase;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLFrameBase : public IDispatch
  {
  };
#else

  typedef struct DispHTMLFrameBaseVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLFrameBase *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLFrameBase *This);

      ULONG (WINAPI *Release)(DispHTMLFrameBase *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLFrameBase *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLFrameBase *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLFrameBaseVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLFrameBase;

#ifdef __cplusplus

  class HTMLFrameBase;
#endif

#ifndef __IHTMLFrameElement_INTERFACE_DEFINED__
#define __IHTMLFrameElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLFrameElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLFrameElement : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_borderColor(VARIANT v) = 0;

    virtual HRESULT WINAPI get_borderColor(VARIANT *p) = 0;

  };
#else

  typedef struct IHTMLFrameElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLFrameElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLFrameElement *This);

      ULONG (WINAPI *Release)(IHTMLFrameElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFrameElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLFrameElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_borderColor)(IHTMLFrameElement *This,VARIANT v);

      HRESULT (WINAPI *get_borderColor)(IHTMLFrameElement *This,VARIANT *p);

    END_INTERFACE
  } IHTMLFrameElementVtbl;

  interface IHTMLFrameElement
  {
    CONST_VTBL struct IHTMLFrameElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLFrameElement_put_borderColor(This,v) (This)->lpVtbl->put_borderColor(This,v)

#define IHTMLFrameElement_get_borderColor(This,p) (This)->lpVtbl->get_borderColor(This,p)
#endif
#endif

  HRESULT WINAPI IHTMLFrameElement_put_borderColor_Proxy(IHTMLFrameElement *This,VARIANT v);

  void __RPC_STUB IHTMLFrameElement_put_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameElement_get_borderColor_Proxy(IHTMLFrameElement *This,VARIANT *p);

  void __RPC_STUB IHTMLFrameElement_get_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLFrameElement2_INTERFACE_DEFINED__
#define __IHTMLFrameElement2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLFrameElement2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLFrameElement2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_height(VARIANT v) = 0;

    virtual HRESULT WINAPI get_height(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_width(VARIANT v) = 0;

    virtual HRESULT WINAPI get_width(VARIANT *p) = 0;

  };
#else

  typedef struct IHTMLFrameElement2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLFrameElement2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLFrameElement2 *This);

      ULONG (WINAPI *Release)(IHTMLFrameElement2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFrameElement2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLFrameElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_height)(IHTMLFrameElement2 *This,VARIANT v);

      HRESULT (WINAPI *get_height)(IHTMLFrameElement2 *This,VARIANT *p);

      HRESULT (WINAPI *put_width)(IHTMLFrameElement2 *This,VARIANT v);

      HRESULT (WINAPI *get_width)(IHTMLFrameElement2 *This,VARIANT *p);

    END_INTERFACE
  } IHTMLFrameElement2Vtbl;

  interface IHTMLFrameElement2
  {
    CONST_VTBL struct IHTMLFrameElement2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLFrameElement2_put_height_Proxy(IHTMLFrameElement2 *This,VARIANT v);

  void __RPC_STUB IHTMLFrameElement2_put_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameElement2_get_height_Proxy(IHTMLFrameElement2 *This,VARIANT *p);

  void __RPC_STUB IHTMLFrameElement2_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameElement2_put_width_Proxy(IHTMLFrameElement2 *This,VARIANT v);

  void __RPC_STUB IHTMLFrameElement2_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameElement2_get_width_Proxy(IHTMLFrameElement2 *This,VARIANT *p);

  void __RPC_STUB IHTMLFrameElement2_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLFrameElement_DISPINTERFACE_DEFINED__
#define __DispHTMLFrameElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLFrameElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLFrameElement : public IDispatch
  {
  };
#else

  typedef struct DispHTMLFrameElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLFrameElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLFrameElement *This);

      ULONG (WINAPI *Release)(DispHTMLFrameElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLFrameElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLFrameElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLFrameElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLFrameElement;

#ifdef __cplusplus

  class HTMLFrameElement;
#endif

#ifndef __IHTMLIFrameElement_INTERFACE_DEFINED__
#define __IHTMLIFrameElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLIFrameElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLIFrameElement : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_vspace(long v) = 0;

    virtual HRESULT WINAPI get_vspace(long *p) = 0;

    virtual HRESULT WINAPI put_hspace(long v) = 0;

    virtual HRESULT WINAPI get_hspace(long *p) = 0;

    virtual HRESULT WINAPI put_align(BSTR v) = 0;

    virtual HRESULT WINAPI get_align(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLIFrameElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLIFrameElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLIFrameElement *This);

      ULONG (WINAPI *Release)(IHTMLIFrameElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLIFrameElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLIFrameElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_vspace)(IHTMLIFrameElement *This,long v);

      HRESULT (WINAPI *get_vspace)(IHTMLIFrameElement *This,long *p);

      HRESULT (WINAPI *put_hspace)(IHTMLIFrameElement *This,long v);

      HRESULT (WINAPI *get_hspace)(IHTMLIFrameElement *This,long *p);

      HRESULT (WINAPI *put_align)(IHTMLIFrameElement *This,BSTR v);

      HRESULT (WINAPI *get_align)(IHTMLIFrameElement *This,BSTR *p);

    END_INTERFACE
  } IHTMLIFrameElementVtbl;

  interface IHTMLIFrameElement
  {
    CONST_VTBL struct IHTMLIFrameElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLIFrameElement_put_vspace_Proxy(IHTMLIFrameElement *This,long v);

  void __RPC_STUB IHTMLIFrameElement_put_vspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLIFrameElement_get_vspace_Proxy(IHTMLIFrameElement *This,long *p);

  void __RPC_STUB IHTMLIFrameElement_get_vspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLIFrameElement_put_hspace_Proxy(IHTMLIFrameElement *This,long v);

  void __RPC_STUB IHTMLIFrameElement_put_hspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLIFrameElement_get_hspace_Proxy(IHTMLIFrameElement *This,long *p);

  void __RPC_STUB IHTMLIFrameElement_get_hspace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLIFrameElement_put_align_Proxy(IHTMLIFrameElement *This,BSTR v);

  void __RPC_STUB IHTMLIFrameElement_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLIFrameElement_get_align_Proxy(IHTMLIFrameElement *This,BSTR *p);

  void __RPC_STUB IHTMLIFrameElement_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLIFrameElement2_INTERFACE_DEFINED__
#define __IHTMLIFrameElement2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLIFrameElement2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLIFrameElement2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_height(VARIANT v) = 0;

    virtual HRESULT WINAPI get_height(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_width(VARIANT v) = 0;

    virtual HRESULT WINAPI get_width(VARIANT *p) = 0;

  };
#else

  typedef struct IHTMLIFrameElement2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLIFrameElement2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLIFrameElement2 *This);

      ULONG (WINAPI *Release)(IHTMLIFrameElement2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLIFrameElement2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLIFrameElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_height)(IHTMLIFrameElement2 *This,VARIANT v);

      HRESULT (WINAPI *get_height)(IHTMLIFrameElement2 *This,VARIANT *p);

      HRESULT (WINAPI *put_width)(IHTMLIFrameElement2 *This,VARIANT v);

      HRESULT (WINAPI *get_width)(IHTMLIFrameElement2 *This,VARIANT *p);

    END_INTERFACE
  } IHTMLIFrameElement2Vtbl;

  interface IHTMLIFrameElement2
  {
    CONST_VTBL struct IHTMLIFrameElement2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLIFrameElement2_put_height_Proxy(IHTMLIFrameElement2 *This,VARIANT v);

  void __RPC_STUB IHTMLIFrameElement2_put_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLIFrameElement2_get_height_Proxy(IHTMLIFrameElement2 *This,VARIANT *p);

  void __RPC_STUB IHTMLIFrameElement2_get_height_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLIFrameElement2_put_width_Proxy(IHTMLIFrameElement2 *This,VARIANT v);

  void __RPC_STUB IHTMLIFrameElement2_put_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLIFrameElement2_get_width_Proxy(IHTMLIFrameElement2 *This,VARIANT *p);

  void __RPC_STUB IHTMLIFrameElement2_get_width_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLIFrame_DISPINTERFACE_DEFINED__
#define __DispHTMLIFrame_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLIFrame;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLIFrame : public IDispatch
  {
  };
#else

  typedef struct DispHTMLIFrameVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLIFrame *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLIFrame *This);

      ULONG (WINAPI *Release)(DispHTMLIFrame *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLIFrame *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLIFrame *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLIFrameVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLIFrame;

#ifdef __cplusplus

  class HTMLIFrame;
#endif

#ifndef __IHTMLDivPosition_INTERFACE_DEFINED__
#define __IHTMLDivPosition_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLDivPosition;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLDivPosition : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_align(BSTR v) = 0;

    virtual HRESULT WINAPI get_align(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLDivPositionVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLDivPosition *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLDivPosition *This);

      ULONG (WINAPI *Release)(IHTMLDivPosition *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDivPosition *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLDivPosition *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_align)(IHTMLDivPosition *This,BSTR v);

      HRESULT (WINAPI *get_align)(IHTMLDivPosition *This,BSTR *p);

    END_INTERFACE
  } IHTMLDivPositionVtbl;

  interface IHTMLDivPosition
  {
    CONST_VTBL struct IHTMLDivPositionVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLDivPosition_put_align(This,v) (This)->lpVtbl->put_align(This,v)

#define IHTMLDivPosition_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#endif
#endif

  HRESULT WINAPI IHTMLDivPosition_put_align_Proxy(IHTMLDivPosition *This,BSTR v);

  void __RPC_STUB IHTMLDivPosition_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDivPosition_get_align_Proxy(IHTMLDivPosition *This,BSTR *p);

  void __RPC_STUB IHTMLDivPosition_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLFieldSetElement_INTERFACE_DEFINED__
#define __IHTMLFieldSetElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLFieldSetElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLFieldSetElement : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_align(BSTR v) = 0;

    virtual HRESULT WINAPI get_align(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLFieldSetElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLFieldSetElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLFieldSetElement *This);

      ULONG (WINAPI *Release)(IHTMLFieldSetElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFieldSetElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLFieldSetElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_align)(IHTMLFieldSetElement *This,BSTR v);

      HRESULT (WINAPI *get_align)(IHTMLFieldSetElement *This,BSTR *p);

    END_INTERFACE
  } IHTMLFieldSetElementVtbl;

  interface IHTMLFieldSetElement
  {
    CONST_VTBL struct IHTMLFieldSetElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLFieldSetElement_put_align(This,v) (This)->lpVtbl->put_align(This,v)

#define IHTMLFieldSetElement_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#endif
#endif

  HRESULT WINAPI IHTMLFieldSetElement_put_align_Proxy(IHTMLFieldSetElement *This,BSTR v);

  void __RPC_STUB IHTMLFieldSetElement_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFieldSetElement_get_align_Proxy(IHTMLFieldSetElement *This,BSTR *p);

  void __RPC_STUB IHTMLFieldSetElement_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLFieldSetElement2_INTERFACE_DEFINED__
#define __IHTMLFieldSetElement2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLFieldSetElement2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLFieldSetElement2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;

  };
#else

  typedef struct IHTMLFieldSetElement2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLFieldSetElement2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLFieldSetElement2 *This);

      ULONG (WINAPI *Release)(IHTMLFieldSetElement2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFieldSetElement2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLFieldSetElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get_form)(IHTMLFieldSetElement2 *This,IHTMLFormElement **p);

    END_INTERFACE
  } IHTMLFieldSetElement2Vtbl;

  interface IHTMLFieldSetElement2
  {
    CONST_VTBL struct IHTMLFieldSetElement2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLFieldSetElement2_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#endif
#endif

  HRESULT WINAPI IHTMLFieldSetElement2_get_form_Proxy(IHTMLFieldSetElement2 *This,IHTMLFormElement **p);

  void __RPC_STUB IHTMLFieldSetElement2_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLLegendElement_INTERFACE_DEFINED__
#define __IHTMLLegendElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLLegendElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLLegendElement : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_align(BSTR v) = 0;

    virtual HRESULT WINAPI get_align(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLLegendElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLLegendElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLLegendElement *This);

      ULONG (WINAPI *Release)(IHTMLLegendElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLLegendElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLLegendElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_align)(IHTMLLegendElement *This,BSTR v);

      HRESULT (WINAPI *get_align)(IHTMLLegendElement *This,BSTR *p);

    END_INTERFACE
  } IHTMLLegendElementVtbl;

  interface IHTMLLegendElement
  {
    CONST_VTBL struct IHTMLLegendElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLLegendElement_put_align(This,v) (This)->lpVtbl->put_align(This,v)

#define IHTMLLegendElement_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#endif
#endif

  HRESULT WINAPI IHTMLLegendElement_put_align_Proxy(IHTMLLegendElement *This,BSTR v);

  void __RPC_STUB IHTMLLegendElement_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLLegendElement_get_align_Proxy(IHTMLLegendElement *This,BSTR *p);

  void __RPC_STUB IHTMLLegendElement_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLLegendElement2_INTERFACE_DEFINED__
#define __IHTMLLegendElement2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLLegendElement2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLLegendElement2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get_form(IHTMLFormElement **p) = 0;

  };
#else

  typedef struct IHTMLLegendElement2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLLegendElement2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLLegendElement2 *This);

      ULONG (WINAPI *Release)(IHTMLLegendElement2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLLegendElement2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLLegendElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get_form)(IHTMLLegendElement2 *This,IHTMLFormElement **p);

    END_INTERFACE
  } IHTMLLegendElement2Vtbl;

  interface IHTMLLegendElement2
  {
    CONST_VTBL struct IHTMLLegendElement2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLLegendElement2_get_form(This,p) (This)->lpVtbl->get_form(This,p)
#endif
#endif

  HRESULT WINAPI IHTMLLegendElement2_get_form_Proxy(IHTMLLegendElement2 *This,IHTMLFormElement **p);

  void __RPC_STUB IHTMLLegendElement2_get_form_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLDivPosition_DISPINTERFACE_DEFINED__
#define __DispHTMLDivPosition_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLDivPosition;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLDivPosition : public IDispatch
  {
  };
#else

  typedef struct DispHTMLDivPositionVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLDivPosition *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLDivPosition *This);

      ULONG (WINAPI *Release)(DispHTMLDivPosition *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLDivPosition *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLDivPosition *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLDivPositionVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLDivPosition;

#ifdef __cplusplus

  class HTMLDivPosition;
#endif

#ifndef __DispHTMLFieldSetElement_DISPINTERFACE_DEFINED__
#define __DispHTMLFieldSetElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLFieldSetElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLFieldSetElement : public IDispatch
  {
  };
#else

  typedef struct DispHTMLFieldSetElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLFieldSetElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLFieldSetElement *This);

      ULONG (WINAPI *Release)(DispHTMLFieldSetElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLFieldSetElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLFieldSetElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLFieldSetElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLFieldSetElement;

#ifdef __cplusplus

  class HTMLFieldSetElement;
#endif

#ifndef __DispHTMLLegendElement_DISPINTERFACE_DEFINED__
#define __DispHTMLLegendElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLLegendElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLLegendElement : public IDispatch
  {
  };
#else

  typedef struct DispHTMLLegendElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLLegendElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLLegendElement *This);

      ULONG (WINAPI *Release)(DispHTMLLegendElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLLegendElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLLegendElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLLegendElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLLegendElement;

#ifdef __cplusplus

  class HTMLLegendElement;
#endif

#ifndef __IHTMLSpanFlow_INTERFACE_DEFINED__
#define __IHTMLSpanFlow_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLSpanFlow;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLSpanFlow : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_align(BSTR v) = 0;

    virtual HRESULT WINAPI get_align(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLSpanFlowVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLSpanFlow *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLSpanFlow *This);

      ULONG (WINAPI *Release)(IHTMLSpanFlow *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLSpanFlow *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLSpanFlow *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_align)(IHTMLSpanFlow *This,BSTR v);

      HRESULT (WINAPI *get_align)(IHTMLSpanFlow *This,BSTR *p);

    END_INTERFACE
  } IHTMLSpanFlowVtbl;

  interface IHTMLSpanFlow
  {
    CONST_VTBL struct IHTMLSpanFlowVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLSpanFlow_put_align(This,v) (This)->lpVtbl->put_align(This,v)

#define IHTMLSpanFlow_get_align(This,p) (This)->lpVtbl->get_align(This,p)
#endif
#endif

  HRESULT WINAPI IHTMLSpanFlow_put_align_Proxy(IHTMLSpanFlow *This,BSTR v);

  void __RPC_STUB IHTMLSpanFlow_put_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLSpanFlow_get_align_Proxy(IHTMLSpanFlow *This,BSTR *p);

  void __RPC_STUB IHTMLSpanFlow_get_align_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLSpanFlow_DISPINTERFACE_DEFINED__
#define __DispHTMLSpanFlow_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLSpanFlow;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLSpanFlow : public IDispatch
  {
  };
#else

  typedef struct DispHTMLSpanFlowVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLSpanFlow *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLSpanFlow *This);

      ULONG (WINAPI *Release)(DispHTMLSpanFlow *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLSpanFlow *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLSpanFlow *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLSpanFlowVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLSpanFlow;

#ifdef __cplusplus

  class HTMLSpanFlow;
#endif

#ifndef __IHTMLFrameSetElement_INTERFACE_DEFINED__
#define __IHTMLFrameSetElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLFrameSetElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLFrameSetElement : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_rows(BSTR v) = 0;

    virtual HRESULT WINAPI get_rows(BSTR *p) = 0;

    virtual HRESULT WINAPI put_cols(BSTR v) = 0;

    virtual HRESULT WINAPI get_cols(BSTR *p) = 0;

    virtual HRESULT WINAPI put_border(VARIANT v) = 0;

    virtual HRESULT WINAPI get_border(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_borderColor(VARIANT v) = 0;

    virtual HRESULT WINAPI get_borderColor(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_frameBorder(BSTR v) = 0;

    virtual HRESULT WINAPI get_frameBorder(BSTR *p) = 0;

    virtual HRESULT WINAPI put_frameSpacing(VARIANT v) = 0;

    virtual HRESULT WINAPI get_frameSpacing(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_name(BSTR v) = 0;

    virtual HRESULT WINAPI get_name(BSTR *p) = 0;

    virtual HRESULT WINAPI put_onload(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onload(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onunload(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onunload(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onbeforeunload(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onbeforeunload(VARIANT *p) = 0;

  };
#else

  typedef struct IHTMLFrameSetElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLFrameSetElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLFrameSetElement *This);

      ULONG (WINAPI *Release)(IHTMLFrameSetElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFrameSetElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLFrameSetElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_rows)(IHTMLFrameSetElement *This,BSTR v);

      HRESULT (WINAPI *get_rows)(IHTMLFrameSetElement *This,BSTR *p);

      HRESULT (WINAPI *put_cols)(IHTMLFrameSetElement *This,BSTR v);

      HRESULT (WINAPI *get_cols)(IHTMLFrameSetElement *This,BSTR *p);

      HRESULT (WINAPI *put_border)(IHTMLFrameSetElement *This,VARIANT v);

      HRESULT (WINAPI *get_border)(IHTMLFrameSetElement *This,VARIANT *p);

      HRESULT (WINAPI *put_borderColor)(IHTMLFrameSetElement *This,VARIANT v);

      HRESULT (WINAPI *get_borderColor)(IHTMLFrameSetElement *This,VARIANT *p);

      HRESULT (WINAPI *put_frameBorder)(IHTMLFrameSetElement *This,BSTR v);

      HRESULT (WINAPI *get_frameBorder)(IHTMLFrameSetElement *This,BSTR *p);

      HRESULT (WINAPI *put_frameSpacing)(IHTMLFrameSetElement *This,VARIANT v);

      HRESULT (WINAPI *get_frameSpacing)(IHTMLFrameSetElement *This,VARIANT *p);

      HRESULT (WINAPI *put_name)(IHTMLFrameSetElement *This,BSTR v);

      HRESULT (WINAPI *get_name)(IHTMLFrameSetElement *This,BSTR *p);

      HRESULT (WINAPI *put_onload)(IHTMLFrameSetElement *This,VARIANT v);

      HRESULT (WINAPI *get_onload)(IHTMLFrameSetElement *This,VARIANT *p);

      HRESULT (WINAPI *put_onunload)(IHTMLFrameSetElement *This,VARIANT v);

      HRESULT (WINAPI *get_onunload)(IHTMLFrameSetElement *This,VARIANT *p);

      HRESULT (WINAPI *put_onbeforeunload)(IHTMLFrameSetElement *This,VARIANT v);

      HRESULT (WINAPI *get_onbeforeunload)(IHTMLFrameSetElement *This,VARIANT *p);

    END_INTERFACE
  } IHTMLFrameSetElementVtbl;

  interface IHTMLFrameSetElement
  {
    CONST_VTBL struct IHTMLFrameSetElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLFrameSetElement_put_rows_Proxy(IHTMLFrameSetElement *This,BSTR v);

  void __RPC_STUB IHTMLFrameSetElement_put_rows_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_get_rows_Proxy(IHTMLFrameSetElement *This,BSTR *p);

  void __RPC_STUB IHTMLFrameSetElement_get_rows_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_put_cols_Proxy(IHTMLFrameSetElement *This,BSTR v);

  void __RPC_STUB IHTMLFrameSetElement_put_cols_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_get_cols_Proxy(IHTMLFrameSetElement *This,BSTR *p);

  void __RPC_STUB IHTMLFrameSetElement_get_cols_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_put_border_Proxy(IHTMLFrameSetElement *This,VARIANT v);

  void __RPC_STUB IHTMLFrameSetElement_put_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_get_border_Proxy(IHTMLFrameSetElement *This,VARIANT *p);

  void __RPC_STUB IHTMLFrameSetElement_get_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_put_borderColor_Proxy(IHTMLFrameSetElement *This,VARIANT v);

  void __RPC_STUB IHTMLFrameSetElement_put_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_get_borderColor_Proxy(IHTMLFrameSetElement *This,VARIANT *p);

  void __RPC_STUB IHTMLFrameSetElement_get_borderColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_put_frameBorder_Proxy(IHTMLFrameSetElement *This,BSTR v);

  void __RPC_STUB IHTMLFrameSetElement_put_frameBorder_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_get_frameBorder_Proxy(IHTMLFrameSetElement *This,BSTR *p);

  void __RPC_STUB IHTMLFrameSetElement_get_frameBorder_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_put_frameSpacing_Proxy(IHTMLFrameSetElement *This,VARIANT v);

  void __RPC_STUB IHTMLFrameSetElement_put_frameSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_get_frameSpacing_Proxy(IHTMLFrameSetElement *This,VARIANT *p);

  void __RPC_STUB IHTMLFrameSetElement_get_frameSpacing_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_put_name_Proxy(IHTMLFrameSetElement *This,BSTR v);

  void __RPC_STUB IHTMLFrameSetElement_put_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_get_name_Proxy(IHTMLFrameSetElement *This,BSTR *p);

  void __RPC_STUB IHTMLFrameSetElement_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_put_onload_Proxy(IHTMLFrameSetElement *This,VARIANT v);

  void __RPC_STUB IHTMLFrameSetElement_put_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_get_onload_Proxy(IHTMLFrameSetElement *This,VARIANT *p);

  void __RPC_STUB IHTMLFrameSetElement_get_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_put_onunload_Proxy(IHTMLFrameSetElement *This,VARIANT v);

  void __RPC_STUB IHTMLFrameSetElement_put_onunload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_get_onunload_Proxy(IHTMLFrameSetElement *This,VARIANT *p);

  void __RPC_STUB IHTMLFrameSetElement_get_onunload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_put_onbeforeunload_Proxy(IHTMLFrameSetElement *This,VARIANT v);

  void __RPC_STUB IHTMLFrameSetElement_put_onbeforeunload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement_get_onbeforeunload_Proxy(IHTMLFrameSetElement *This,VARIANT *p);

  void __RPC_STUB IHTMLFrameSetElement_get_onbeforeunload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLFrameSetElement2_INTERFACE_DEFINED__
#define __IHTMLFrameSetElement2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLFrameSetElement2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLFrameSetElement2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_onbeforeprint(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onbeforeprint(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onafterprint(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onafterprint(VARIANT *p) = 0;

  };
#else

  typedef struct IHTMLFrameSetElement2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLFrameSetElement2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLFrameSetElement2 *This);

      ULONG (WINAPI *Release)(IHTMLFrameSetElement2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFrameSetElement2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLFrameSetElement2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_onbeforeprint)(IHTMLFrameSetElement2 *This,VARIANT v);

      HRESULT (WINAPI *get_onbeforeprint)(IHTMLFrameSetElement2 *This,VARIANT *p);

      HRESULT (WINAPI *put_onafterprint)(IHTMLFrameSetElement2 *This,VARIANT v);

      HRESULT (WINAPI *get_onafterprint)(IHTMLFrameSetElement2 *This,VARIANT *p);

    END_INTERFACE
  } IHTMLFrameSetElement2Vtbl;

  interface IHTMLFrameSetElement2
  {
    CONST_VTBL struct IHTMLFrameSetElement2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLFrameSetElement2_put_onbeforeprint_Proxy(IHTMLFrameSetElement2 *This,VARIANT v);

  void __RPC_STUB IHTMLFrameSetElement2_put_onbeforeprint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement2_get_onbeforeprint_Proxy(IHTMLFrameSetElement2 *This,VARIANT *p);

  void __RPC_STUB IHTMLFrameSetElement2_get_onbeforeprint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement2_put_onafterprint_Proxy(IHTMLFrameSetElement2 *This,VARIANT v);

  void __RPC_STUB IHTMLFrameSetElement2_put_onafterprint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFrameSetElement2_get_onafterprint_Proxy(IHTMLFrameSetElement2 *This,VARIANT *p);

  void __RPC_STUB IHTMLFrameSetElement2_get_onafterprint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLFrameSetSite_DISPINTERFACE_DEFINED__
#define __DispHTMLFrameSetSite_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLFrameSetSite;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLFrameSetSite : public IDispatch
  {
  };
#else

  typedef struct DispHTMLFrameSetSiteVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLFrameSetSite *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLFrameSetSite *This);

      ULONG (WINAPI *Release)(DispHTMLFrameSetSite *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLFrameSetSite *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLFrameSetSite *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLFrameSetSiteVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLFrameSetSite;

#ifdef __cplusplus

  class HTMLFrameSetSite;
#endif

#ifndef __IHTMLBGsound_INTERFACE_DEFINED__
#define __IHTMLBGsound_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLBGsound;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLBGsound : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_src(BSTR v) = 0;

    virtual HRESULT WINAPI get_src(BSTR *p) = 0;

    virtual HRESULT WINAPI put_loop(VARIANT v) = 0;

    virtual HRESULT WINAPI get_loop(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_volume(VARIANT v) = 0;

    virtual HRESULT WINAPI get_volume(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_balance(VARIANT v) = 0;

    virtual HRESULT WINAPI get_balance(VARIANT *p) = 0;

  };
#else

  typedef struct IHTMLBGsoundVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLBGsound *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLBGsound *This);

      ULONG (WINAPI *Release)(IHTMLBGsound *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLBGsound *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLBGsound *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_src)(IHTMLBGsound *This,BSTR v);

      HRESULT (WINAPI *get_src)(IHTMLBGsound *This,BSTR *p);

      HRESULT (WINAPI *put_loop)(IHTMLBGsound *This,VARIANT v);

      HRESULT (WINAPI *get_loop)(IHTMLBGsound *This,VARIANT *p);

      HRESULT (WINAPI *put_volume)(IHTMLBGsound *This,VARIANT v);

      HRESULT (WINAPI *get_volume)(IHTMLBGsound *This,VARIANT *p);

      HRESULT (WINAPI *put_balance)(IHTMLBGsound *This,VARIANT v);

      HRESULT (WINAPI *get_balance)(IHTMLBGsound *This,VARIANT *p);

    END_INTERFACE
  } IHTMLBGsoundVtbl;

  interface IHTMLBGsound
  {
    CONST_VTBL struct IHTMLBGsoundVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLBGsound_put_src_Proxy(IHTMLBGsound *This,BSTR v);

  void __RPC_STUB IHTMLBGsound_put_src_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLBGsound_get_src_Proxy(IHTMLBGsound *This,BSTR *p);

  void __RPC_STUB IHTMLBGsound_get_src_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLBGsound_put_loop_Proxy(IHTMLBGsound *This,VARIANT v);

  void __RPC_STUB IHTMLBGsound_put_loop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLBGsound_get_loop_Proxy(IHTMLBGsound *This,VARIANT *p);

  void __RPC_STUB IHTMLBGsound_get_loop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLBGsound_put_volume_Proxy(IHTMLBGsound *This,VARIANT v);

  void __RPC_STUB IHTMLBGsound_put_volume_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLBGsound_get_volume_Proxy(IHTMLBGsound *This,VARIANT *p);

  void __RPC_STUB IHTMLBGsound_get_volume_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLBGsound_put_balance_Proxy(IHTMLBGsound *This,VARIANT v);

  void __RPC_STUB IHTMLBGsound_put_balance_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLBGsound_get_balance_Proxy(IHTMLBGsound *This,VARIANT *p);

  void __RPC_STUB IHTMLBGsound_get_balance_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLBGsound_DISPINTERFACE_DEFINED__
#define __DispHTMLBGsound_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLBGsound;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLBGsound : public IDispatch
  {
  };
#else

  typedef struct DispHTMLBGsoundVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLBGsound *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLBGsound *This);

      ULONG (WINAPI *Release)(DispHTMLBGsound *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLBGsound *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLBGsound *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLBGsoundVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLBGsound;

#ifdef __cplusplus

  class HTMLBGsound;
#endif

#ifndef __IHTMLFontNamesCollection_INTERFACE_DEFINED__
#define __IHTMLFontNamesCollection_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLFontNamesCollection;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLFontNamesCollection : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;

    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;

    virtual HRESULT WINAPI item(long index,BSTR *pBstr) = 0;

  };
#else

  typedef struct IHTMLFontNamesCollectionVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLFontNamesCollection *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLFontNamesCollection *This);

      ULONG (WINAPI *Release)(IHTMLFontNamesCollection *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFontNamesCollection *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLFontNamesCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get_length)(IHTMLFontNamesCollection *This,long *p);

      HRESULT (WINAPI *get__newEnum)(IHTMLFontNamesCollection *This,IUnknown **p);

      HRESULT (WINAPI *item)(IHTMLFontNamesCollection *This,long index,BSTR *pBstr);

    END_INTERFACE
  } IHTMLFontNamesCollectionVtbl;

  interface IHTMLFontNamesCollection
  {
    CONST_VTBL struct IHTMLFontNamesCollectionVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLFontNamesCollection_get_length_Proxy(IHTMLFontNamesCollection *This,long *p);

  void __RPC_STUB IHTMLFontNamesCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFontNamesCollection_get__newEnum_Proxy(IHTMLFontNamesCollection *This,IUnknown **p);

  void __RPC_STUB IHTMLFontNamesCollection_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFontNamesCollection_item_Proxy(IHTMLFontNamesCollection *This,long index,BSTR *pBstr);

  void __RPC_STUB IHTMLFontNamesCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLFontSizesCollection_INTERFACE_DEFINED__
#define __IHTMLFontSizesCollection_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLFontSizesCollection;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLFontSizesCollection : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;

    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;

    virtual HRESULT WINAPI get_forFont(BSTR *p) = 0;

    virtual HRESULT WINAPI item(long index,long *plSize) = 0;

  };
#else

  typedef struct IHTMLFontSizesCollectionVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLFontSizesCollection *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLFontSizesCollection *This);

      ULONG (WINAPI *Release)(IHTMLFontSizesCollection *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLFontSizesCollection *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLFontSizesCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get_length)(IHTMLFontSizesCollection *This,long *p);

      HRESULT (WINAPI *get__newEnum)(IHTMLFontSizesCollection *This,IUnknown **p);

      HRESULT (WINAPI *get_forFont)(IHTMLFontSizesCollection *This,BSTR *p);

      HRESULT (WINAPI *item)(IHTMLFontSizesCollection *This,long index,long *plSize);

    END_INTERFACE
  } IHTMLFontSizesCollectionVtbl;

  interface IHTMLFontSizesCollection
  {
    CONST_VTBL struct IHTMLFontSizesCollectionVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLFontSizesCollection_get_length_Proxy(IHTMLFontSizesCollection *This,long *p);

  void __RPC_STUB IHTMLFontSizesCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFontSizesCollection_get__newEnum_Proxy(IHTMLFontSizesCollection *This,IUnknown **p);

  void __RPC_STUB IHTMLFontSizesCollection_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFontSizesCollection_get_forFont_Proxy(IHTMLFontSizesCollection *This,BSTR *p);

  void __RPC_STUB IHTMLFontSizesCollection_get_forFont_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLFontSizesCollection_item_Proxy(IHTMLFontSizesCollection *This,long index,long *plSize);

  void __RPC_STUB IHTMLFontSizesCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLOptionsHolder_INTERFACE_DEFINED__
#define __IHTMLOptionsHolder_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLOptionsHolder;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLOptionsHolder : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get_document(IHTMLDocument2 **p) = 0;

    virtual HRESULT WINAPI get_fonts(IHTMLFontNamesCollection **p) = 0;

    virtual HRESULT WINAPI put_execArg(VARIANT v) = 0;

    virtual HRESULT WINAPI get_execArg(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_errorLine(long v) = 0;

    virtual HRESULT WINAPI get_errorLine(long *p) = 0;

    virtual HRESULT WINAPI put_errorCharacter(long v) = 0;

    virtual HRESULT WINAPI get_errorCharacter(long *p) = 0;

    virtual HRESULT WINAPI put_errorCode(long v) = 0;

    virtual HRESULT WINAPI get_errorCode(long *p) = 0;

    virtual HRESULT WINAPI put_errorMessage(BSTR v) = 0;

    virtual HRESULT WINAPI get_errorMessage(BSTR *p) = 0;

    virtual HRESULT WINAPI put_errorDebug(VARIANT_BOOL v) = 0;

    virtual HRESULT WINAPI get_errorDebug(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_unsecuredWindowOfDocument(IHTMLWindow2 **p) = 0;

    virtual HRESULT WINAPI put_findText(BSTR v) = 0;

    virtual HRESULT WINAPI get_findText(BSTR *p) = 0;

    virtual HRESULT WINAPI put_anythingAfterFrameset(VARIANT_BOOL v) = 0;

    virtual HRESULT WINAPI get_anythingAfterFrameset(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI sizes(BSTR fontName,IHTMLFontSizesCollection **pSizesCollection) = 0;

    virtual HRESULT WINAPI openfiledlg(VARIANT initFile,VARIANT initDir,VARIANT filter,VARIANT title,BSTR *pathName) = 0;

    virtual HRESULT WINAPI savefiledlg(VARIANT initFile,VARIANT initDir,VARIANT filter,VARIANT title,BSTR *pathName) = 0;

    virtual HRESULT WINAPI choosecolordlg(VARIANT initColor,long *rgbColor) = 0;

    virtual HRESULT WINAPI showSecurityInfo(void) = 0;

    virtual HRESULT WINAPI isApartmentModel(IHTMLObjectElement *object,VARIANT_BOOL *fApartment) = 0;

    virtual HRESULT WINAPI getCharset(BSTR fontName,long *charset) = 0;

    virtual HRESULT WINAPI get_secureConnectionInfo(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLOptionsHolderVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLOptionsHolder *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLOptionsHolder *This);

      ULONG (WINAPI *Release)(IHTMLOptionsHolder *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLOptionsHolder *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLOptionsHolder *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get_document)(IHTMLOptionsHolder *This,IHTMLDocument2 **p);

      HRESULT (WINAPI *get_fonts)(IHTMLOptionsHolder *This,IHTMLFontNamesCollection **p);

      HRESULT (WINAPI *put_execArg)(IHTMLOptionsHolder *This,VARIANT v);

      HRESULT (WINAPI *get_execArg)(IHTMLOptionsHolder *This,VARIANT *p);

      HRESULT (WINAPI *put_errorLine)(IHTMLOptionsHolder *This,long v);

      HRESULT (WINAPI *get_errorLine)(IHTMLOptionsHolder *This,long *p);

      HRESULT (WINAPI *put_errorCharacter)(IHTMLOptionsHolder *This,long v);

      HRESULT (WINAPI *get_errorCharacter)(IHTMLOptionsHolder *This,long *p);

      HRESULT (WINAPI *put_errorCode)(IHTMLOptionsHolder *This,long v);

      HRESULT (WINAPI *get_errorCode)(IHTMLOptionsHolder *This,long *p);

      HRESULT (WINAPI *put_errorMessage)(IHTMLOptionsHolder *This,BSTR v);

      HRESULT (WINAPI *get_errorMessage)(IHTMLOptionsHolder *This,BSTR *p);

      HRESULT (WINAPI *put_errorDebug)(IHTMLOptionsHolder *This,VARIANT_BOOL v);

      HRESULT (WINAPI *get_errorDebug)(IHTMLOptionsHolder *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_unsecuredWindowOfDocument)(IHTMLOptionsHolder *This,IHTMLWindow2 **p);

      HRESULT (WINAPI *put_findText)(IHTMLOptionsHolder *This,BSTR v);

      HRESULT (WINAPI *get_findText)(IHTMLOptionsHolder *This,BSTR *p);

      HRESULT (WINAPI *put_anythingAfterFrameset)(IHTMLOptionsHolder *This,VARIANT_BOOL v);

      HRESULT (WINAPI *get_anythingAfterFrameset)(IHTMLOptionsHolder *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *sizes)(IHTMLOptionsHolder *This,BSTR fontName,IHTMLFontSizesCollection **pSizesCollection);

      HRESULT (WINAPI *openfiledlg)(IHTMLOptionsHolder *This,VARIANT initFile,VARIANT initDir,VARIANT filter,VARIANT title,BSTR *pathName);

      HRESULT (WINAPI *savefiledlg)(IHTMLOptionsHolder *This,VARIANT initFile,VARIANT initDir,VARIANT filter,VARIANT title,BSTR *pathName);

      HRESULT (WINAPI *choosecolordlg)(IHTMLOptionsHolder *This,VARIANT initColor,long *rgbColor);

      HRESULT (WINAPI *showSecurityInfo)(IHTMLOptionsHolder *This);

      HRESULT (WINAPI *isApartmentModel)(IHTMLOptionsHolder *This,IHTMLObjectElement *object,VARIANT_BOOL *fApartment);

      HRESULT (WINAPI *getCharset)(IHTMLOptionsHolder *This,BSTR fontName,long *charset);

      HRESULT (WINAPI *get_secureConnectionInfo)(IHTMLOptionsHolder *This,BSTR *p);

    END_INTERFACE
  } IHTMLOptionsHolderVtbl;

  interface IHTMLOptionsHolder
  {
    CONST_VTBL struct IHTMLOptionsHolderVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLOptionsHolder_get_document_Proxy(IHTMLOptionsHolder *This,IHTMLDocument2 **p);

  void __RPC_STUB IHTMLOptionsHolder_get_document_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_get_fonts_Proxy(IHTMLOptionsHolder *This,IHTMLFontNamesCollection **p);

  void __RPC_STUB IHTMLOptionsHolder_get_fonts_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_put_execArg_Proxy(IHTMLOptionsHolder *This,VARIANT v);

  void __RPC_STUB IHTMLOptionsHolder_put_execArg_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_get_execArg_Proxy(IHTMLOptionsHolder *This,VARIANT *p);

  void __RPC_STUB IHTMLOptionsHolder_get_execArg_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_put_errorLine_Proxy(IHTMLOptionsHolder *This,long v);

  void __RPC_STUB IHTMLOptionsHolder_put_errorLine_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_get_errorLine_Proxy(IHTMLOptionsHolder *This,long *p);

  void __RPC_STUB IHTMLOptionsHolder_get_errorLine_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_put_errorCharacter_Proxy(IHTMLOptionsHolder *This,long v);

  void __RPC_STUB IHTMLOptionsHolder_put_errorCharacter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_get_errorCharacter_Proxy(IHTMLOptionsHolder *This,long *p);

  void __RPC_STUB IHTMLOptionsHolder_get_errorCharacter_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_put_errorCode_Proxy(IHTMLOptionsHolder *This,long v);

  void __RPC_STUB IHTMLOptionsHolder_put_errorCode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_get_errorCode_Proxy(IHTMLOptionsHolder *This,long *p);

  void __RPC_STUB IHTMLOptionsHolder_get_errorCode_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_put_errorMessage_Proxy(IHTMLOptionsHolder *This,BSTR v);

  void __RPC_STUB IHTMLOptionsHolder_put_errorMessage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_get_errorMessage_Proxy(IHTMLOptionsHolder *This,BSTR *p);

  void __RPC_STUB IHTMLOptionsHolder_get_errorMessage_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_put_errorDebug_Proxy(IHTMLOptionsHolder *This,VARIANT_BOOL v);

  void __RPC_STUB IHTMLOptionsHolder_put_errorDebug_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_get_errorDebug_Proxy(IHTMLOptionsHolder *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLOptionsHolder_get_errorDebug_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_get_unsecuredWindowOfDocument_Proxy(IHTMLOptionsHolder *This,IHTMLWindow2 **p);

  void __RPC_STUB IHTMLOptionsHolder_get_unsecuredWindowOfDocument_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_put_findText_Proxy(IHTMLOptionsHolder *This,BSTR v);

  void __RPC_STUB IHTMLOptionsHolder_put_findText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_get_findText_Proxy(IHTMLOptionsHolder *This,BSTR *p);

  void __RPC_STUB IHTMLOptionsHolder_get_findText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_put_anythingAfterFrameset_Proxy(IHTMLOptionsHolder *This,VARIANT_BOOL v);

  void __RPC_STUB IHTMLOptionsHolder_put_anythingAfterFrameset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_get_anythingAfterFrameset_Proxy(IHTMLOptionsHolder *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLOptionsHolder_get_anythingAfterFrameset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_sizes_Proxy(IHTMLOptionsHolder *This,BSTR fontName,IHTMLFontSizesCollection **pSizesCollection);

  void __RPC_STUB IHTMLOptionsHolder_sizes_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_openfiledlg_Proxy(IHTMLOptionsHolder *This,VARIANT initFile,VARIANT initDir,VARIANT filter,VARIANT title,BSTR *pathName);

  void __RPC_STUB IHTMLOptionsHolder_openfiledlg_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_savefiledlg_Proxy(IHTMLOptionsHolder *This,VARIANT initFile,VARIANT initDir,VARIANT filter,VARIANT title,BSTR *pathName);

  void __RPC_STUB IHTMLOptionsHolder_savefiledlg_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_choosecolordlg_Proxy(IHTMLOptionsHolder *This,VARIANT initColor,long *rgbColor);

  void __RPC_STUB IHTMLOptionsHolder_choosecolordlg_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_showSecurityInfo_Proxy(IHTMLOptionsHolder *This);

  void __RPC_STUB IHTMLOptionsHolder_showSecurityInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_isApartmentModel_Proxy(IHTMLOptionsHolder *This,IHTMLObjectElement *object,VARIANT_BOOL *fApartment);

  void __RPC_STUB IHTMLOptionsHolder_isApartmentModel_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_getCharset_Proxy(IHTMLOptionsHolder *This,BSTR fontName,long *charset);

  void __RPC_STUB IHTMLOptionsHolder_getCharset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLOptionsHolder_get_secureConnectionInfo_Proxy(IHTMLOptionsHolder *This,BSTR *p);

  void __RPC_STUB IHTMLOptionsHolder_get_secureConnectionInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __HTMLStyleElementEvents2_DISPINTERFACE_DEFINED__
#define __HTMLStyleElementEvents2_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLStyleElementEvents2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLStyleElementEvents2 : public IDispatch
  {
  };
#else

  typedef struct HTMLStyleElementEvents2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLStyleElementEvents2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLStyleElementEvents2 *This);

      ULONG (WINAPI *Release)(HTMLStyleElementEvents2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLStyleElementEvents2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLStyleElementEvents2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLStyleElementEvents2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __HTMLStyleElementEvents_DISPINTERFACE_DEFINED__
#define __HTMLStyleElementEvents_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLStyleElementEvents;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLStyleElementEvents : public IDispatch
  {
  };
#else

  typedef struct HTMLStyleElementEventsVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLStyleElementEvents *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLStyleElementEvents *This);

      ULONG (WINAPI *Release)(HTMLStyleElementEvents *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLStyleElementEvents *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLStyleElementEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLStyleElementEventsVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __IHTMLStyleElement_INTERFACE_DEFINED__
#define __IHTMLStyleElement_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLStyleElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLStyleElement : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_type(BSTR v) = 0;

    virtual HRESULT WINAPI get_type(BSTR *p) = 0;

    virtual HRESULT WINAPI get_readyState(BSTR *p) = 0;

    virtual HRESULT WINAPI put_onreadystatechange(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onreadystatechange(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onload(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onload(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onerror(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onerror(VARIANT *p) = 0;

    virtual HRESULT WINAPI get_styleSheet(IHTMLStyleSheet **p) = 0;

    virtual HRESULT WINAPI put_disabled(VARIANT_BOOL v) = 0;

    virtual HRESULT WINAPI get_disabled(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI put_media(BSTR v) = 0;

    virtual HRESULT WINAPI get_media(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLStyleElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLStyleElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLStyleElement *This);

      ULONG (WINAPI *Release)(IHTMLStyleElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLStyleElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLStyleElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_type)(IHTMLStyleElement *This,BSTR v);

      HRESULT (WINAPI *get_type)(IHTMLStyleElement *This,BSTR *p);

      HRESULT (WINAPI *get_readyState)(IHTMLStyleElement *This,BSTR *p);

      HRESULT (WINAPI *put_onreadystatechange)(IHTMLStyleElement *This,VARIANT v);

      HRESULT (WINAPI *get_onreadystatechange)(IHTMLStyleElement *This,VARIANT *p);

      HRESULT (WINAPI *put_onload)(IHTMLStyleElement *This,VARIANT v);

      HRESULT (WINAPI *get_onload)(IHTMLStyleElement *This,VARIANT *p);

      HRESULT (WINAPI *put_onerror)(IHTMLStyleElement *This,VARIANT v);

      HRESULT (WINAPI *get_onerror)(IHTMLStyleElement *This,VARIANT *p);

      HRESULT (WINAPI *get_styleSheet)(IHTMLStyleElement *This,IHTMLStyleSheet **p);

      HRESULT (WINAPI *put_disabled)(IHTMLStyleElement *This,VARIANT_BOOL v);

      HRESULT (WINAPI *get_disabled)(IHTMLStyleElement *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *put_media)(IHTMLStyleElement *This,BSTR v);

      HRESULT (WINAPI *get_media)(IHTMLStyleElement *This,BSTR *p);

    END_INTERFACE
  } IHTMLStyleElementVtbl;

  interface IHTMLStyleElement
  {
    CONST_VTBL struct IHTMLStyleElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLStyleElement_put_type_Proxy(IHTMLStyleElement *This,BSTR v);

  void __RPC_STUB IHTMLStyleElement_put_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLStyleElement_get_type_Proxy(IHTMLStyleElement *This,BSTR *p);

  void __RPC_STUB IHTMLStyleElement_get_type_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLStyleElement_get_readyState_Proxy(IHTMLStyleElement *This,BSTR *p);

  void __RPC_STUB IHTMLStyleElement_get_readyState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLStyleElement_put_onreadystatechange_Proxy(IHTMLStyleElement *This,VARIANT v);

  void __RPC_STUB IHTMLStyleElement_put_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLStyleElement_get_onreadystatechange_Proxy(IHTMLStyleElement *This,VARIANT *p);

  void __RPC_STUB IHTMLStyleElement_get_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLStyleElement_put_onload_Proxy(IHTMLStyleElement *This,VARIANT v);

  void __RPC_STUB IHTMLStyleElement_put_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLStyleElement_get_onload_Proxy(IHTMLStyleElement *This,VARIANT *p);

  void __RPC_STUB IHTMLStyleElement_get_onload_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLStyleElement_put_onerror_Proxy(IHTMLStyleElement *This,VARIANT v);

  void __RPC_STUB IHTMLStyleElement_put_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLStyleElement_get_onerror_Proxy(IHTMLStyleElement *This,VARIANT *p);

  void __RPC_STUB IHTMLStyleElement_get_onerror_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLStyleElement_get_styleSheet_Proxy(IHTMLStyleElement *This,IHTMLStyleSheet **p);

  void __RPC_STUB IHTMLStyleElement_get_styleSheet_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLStyleElement_put_disabled_Proxy(IHTMLStyleElement *This,VARIANT_BOOL v);

  void __RPC_STUB IHTMLStyleElement_put_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLStyleElement_get_disabled_Proxy(IHTMLStyleElement *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLStyleElement_get_disabled_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLStyleElement_put_media_Proxy(IHTMLStyleElement *This,BSTR v);

  void __RPC_STUB IHTMLStyleElement_put_media_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLStyleElement_get_media_Proxy(IHTMLStyleElement *This,BSTR *p);

  void __RPC_STUB IHTMLStyleElement_get_media_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLStyleElement_DISPINTERFACE_DEFINED__
#define __DispHTMLStyleElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLStyleElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLStyleElement : public IDispatch
  {
  };
#else

  typedef struct DispHTMLStyleElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLStyleElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLStyleElement *This);

      ULONG (WINAPI *Release)(DispHTMLStyleElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLStyleElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLStyleElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLStyleElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLStyleElement;

#ifdef __cplusplus

  class HTMLStyleElement;
#endif

#ifndef __IHTMLStyleFontFace_INTERFACE_DEFINED__
#define __IHTMLStyleFontFace_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLStyleFontFace;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLStyleFontFace : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_fontsrc(BSTR v) = 0;

    virtual HRESULT WINAPI get_fontsrc(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLStyleFontFaceVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLStyleFontFace *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLStyleFontFace *This);

      ULONG (WINAPI *Release)(IHTMLStyleFontFace *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLStyleFontFace *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLStyleFontFace *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_fontsrc)(IHTMLStyleFontFace *This,BSTR v);

      HRESULT (WINAPI *get_fontsrc)(IHTMLStyleFontFace *This,BSTR *p);

    END_INTERFACE
  } IHTMLStyleFontFaceVtbl;

  interface IHTMLStyleFontFace
  {
    CONST_VTBL struct IHTMLStyleFontFaceVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLStyleFontFace_put_fontsrc(This,v) (This)->lpVtbl->put_fontsrc(This,v)

#define IHTMLStyleFontFace_get_fontsrc(This,p) (This)->lpVtbl->get_fontsrc(This,p)
#endif
#endif

  HRESULT WINAPI IHTMLStyleFontFace_put_fontsrc_Proxy(IHTMLStyleFontFace *This,BSTR v);

  void __RPC_STUB IHTMLStyleFontFace_put_fontsrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLStyleFontFace_get_fontsrc_Proxy(IHTMLStyleFontFace *This,BSTR *p);

  void __RPC_STUB IHTMLStyleFontFace_get_fontsrc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  EXTERN_C const CLSID CLSID_HTMLStyleFontFace;

#ifdef __cplusplus

  class HTMLStyleFontFace;
#endif

#ifndef __ICSSFilterSite_INTERFACE_DEFINED__
#define __ICSSFilterSite_INTERFACE_DEFINED__

  EXTERN_C const IID IID_ICSSFilterSite;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct ICSSFilterSite : public IUnknown
  {
  public:
    virtual HRESULT WINAPI GetElement(IHTMLElement **Element) = 0;

    virtual HRESULT WINAPI FireOnFilterChangeEvent(void) = 0;

  };
#else

  typedef struct ICSSFilterSiteVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(ICSSFilterSite *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(ICSSFilterSite *This);

      ULONG (WINAPI *Release)(ICSSFilterSite *This);

      HRESULT (WINAPI *GetElement)(ICSSFilterSite *This,IHTMLElement **Element);

      HRESULT (WINAPI *FireOnFilterChangeEvent)(ICSSFilterSite *This);

    END_INTERFACE
  } ICSSFilterSiteVtbl;

  interface ICSSFilterSite
  {
    CONST_VTBL struct ICSSFilterSiteVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define ICSSFilterSite_GetElement(This,Element) (This)->lpVtbl->GetElement(This,Element)

#define ICSSFilterSite_FireOnFilterChangeEvent(This) (This)->lpVtbl->FireOnFilterChangeEvent(This)
#endif
#endif

  HRESULT WINAPI ICSSFilterSite_GetElement_Proxy(ICSSFilterSite *This,IHTMLElement **Element);

  void __RPC_STUB ICSSFilterSite_GetElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ICSSFilterSite_FireOnFilterChangeEvent_Proxy(ICSSFilterSite *This);

  void __RPC_STUB ICSSFilterSite_FireOnFilterChangeEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMarkupPointer_INTERFACE_DEFINED__
#define __IMarkupPointer_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IMarkupPointer;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IMarkupPointer : public IUnknown
  {
  public:
    virtual HRESULT WINAPI OwningDoc(IHTMLDocument2 **ppDoc) = 0;

    virtual HRESULT WINAPI Gravity(POINTER_GRAVITY *pGravity) = 0;

    virtual HRESULT WINAPI SetGravity(POINTER_GRAVITY Gravity) = 0;

    virtual HRESULT WINAPI Cling(WINBOOL *pfCling) = 0;

    virtual HRESULT WINAPI SetCling(WINBOOL fCLing) = 0;

    virtual HRESULT WINAPI Unposition(void) = 0;

    virtual HRESULT WINAPI IsPositioned(WINBOOL *pfPositioned) = 0;

    virtual HRESULT WINAPI GetContainer(IMarkupContainer **ppContainer) = 0;

    virtual HRESULT WINAPI MoveAdjacentToElement(IHTMLElement *pElement,ELEMENT_ADJACENCY eAdj) = 0;

    virtual HRESULT WINAPI MoveToPointer(IMarkupPointer *pPointer) = 0;

    virtual HRESULT WINAPI MoveToContainer(IMarkupContainer *pContainer,WINBOOL fAtStart) = 0;

    virtual HRESULT WINAPI Left(WINBOOL fMove,MARKUP_CONTEXT_TYPE *pContext,IHTMLElement **ppElement,long *pcch,OLECHAR *pchText) = 0;

    virtual HRESULT WINAPI Right(WINBOOL fMove,MARKUP_CONTEXT_TYPE *pContext,IHTMLElement **ppElement,long *pcch,OLECHAR *pchText) = 0;

    virtual HRESULT WINAPI CurrentScope(IHTMLElement **ppElemCurrent) = 0;

    virtual HRESULT WINAPI IsLeftOf(IMarkupPointer *pPointerThat,WINBOOL *pfResult) = 0;

    virtual HRESULT WINAPI IsLeftOfOrEqualTo(IMarkupPointer *pPointerThat,WINBOOL *pfResult) = 0;

    virtual HRESULT WINAPI IsRightOf(IMarkupPointer *pPointerThat,WINBOOL *pfResult) = 0;

    virtual HRESULT WINAPI IsRightOfOrEqualTo(IMarkupPointer *pPointerThat,WINBOOL *pfResult) = 0;

    virtual HRESULT WINAPI IsEqualTo(IMarkupPointer *pPointerThat,WINBOOL *pfAreEqual) = 0;

    virtual HRESULT WINAPI MoveUnit(MOVEUNIT_ACTION muAction) = 0;

    virtual HRESULT WINAPI FindText(OLECHAR *pchFindText,DWORD dwFlags,IMarkupPointer *pIEndMatch,IMarkupPointer *pIEndSearch) = 0;

  };
#else

  typedef struct IMarkupPointerVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IMarkupPointer *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IMarkupPointer *This);

      ULONG (WINAPI *Release)(IMarkupPointer *This);

      HRESULT (WINAPI *OwningDoc)(IMarkupPointer *This,IHTMLDocument2 **ppDoc);

      HRESULT (WINAPI *Gravity)(IMarkupPointer *This,POINTER_GRAVITY *pGravity);

      HRESULT (WINAPI *SetGravity)(IMarkupPointer *This,POINTER_GRAVITY Gravity);

      HRESULT (WINAPI *Cling)(IMarkupPointer *This,WINBOOL *pfCling);

      HRESULT (WINAPI *SetCling)(IMarkupPointer *This,WINBOOL fCLing);

      HRESULT (WINAPI *Unposition)(IMarkupPointer *This);

      HRESULT (WINAPI *IsPositioned)(IMarkupPointer *This,WINBOOL *pfPositioned);

      HRESULT (WINAPI *GetContainer)(IMarkupPointer *This,IMarkupContainer **ppContainer);

      HRESULT (WINAPI *MoveAdjacentToElement)(IMarkupPointer *This,IHTMLElement *pElement,ELEMENT_ADJACENCY eAdj);

      HRESULT (WINAPI *MoveToPointer)(IMarkupPointer *This,IMarkupPointer *pPointer);

      HRESULT (WINAPI *MoveToContainer)(IMarkupPointer *This,IMarkupContainer *pContainer,WINBOOL fAtStart);

      HRESULT (WINAPI *Left)(IMarkupPointer *This,WINBOOL fMove,MARKUP_CONTEXT_TYPE *pContext,IHTMLElement **ppElement,long *pcch,OLECHAR *pchText);

      HRESULT (WINAPI *Right)(IMarkupPointer *This,WINBOOL fMove,MARKUP_CONTEXT_TYPE *pContext,IHTMLElement **ppElement,long *pcch,OLECHAR *pchText);

      HRESULT (WINAPI *CurrentScope)(IMarkupPointer *This,IHTMLElement **ppElemCurrent);

      HRESULT (WINAPI *IsLeftOf)(IMarkupPointer *This,IMarkupPointer *pPointerThat,WINBOOL *pfResult);

      HRESULT (WINAPI *IsLeftOfOrEqualTo)(IMarkupPointer *This,IMarkupPointer *pPointerThat,WINBOOL *pfResult);

      HRESULT (WINAPI *IsRightOf)(IMarkupPointer *This,IMarkupPointer *pPointerThat,WINBOOL *pfResult);

      HRESULT (WINAPI *IsRightOfOrEqualTo)(IMarkupPointer *This,IMarkupPointer *pPointerThat,WINBOOL *pfResult);

      HRESULT (WINAPI *IsEqualTo)(IMarkupPointer *This,IMarkupPointer *pPointerThat,WINBOOL *pfAreEqual);

      HRESULT (WINAPI *MoveUnit)(IMarkupPointer *This,MOVEUNIT_ACTION muAction);

      HRESULT (WINAPI *FindText)(IMarkupPointer *This,OLECHAR *pchFindText,DWORD dwFlags,IMarkupPointer *pIEndMatch,IMarkupPointer *pIEndSearch);

    END_INTERFACE
  } IMarkupPointerVtbl;

  interface IMarkupPointer
  {
    CONST_VTBL struct IMarkupPointerVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IMarkupPointer_OwningDoc_Proxy(IMarkupPointer *This,IHTMLDocument2 **ppDoc);

  void __RPC_STUB IMarkupPointer_OwningDoc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_Gravity_Proxy(IMarkupPointer *This,POINTER_GRAVITY *pGravity);

  void __RPC_STUB IMarkupPointer_Gravity_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_SetGravity_Proxy(IMarkupPointer *This,POINTER_GRAVITY Gravity);

  void __RPC_STUB IMarkupPointer_SetGravity_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_Cling_Proxy(IMarkupPointer *This,WINBOOL *pfCling);

  void __RPC_STUB IMarkupPointer_Cling_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_SetCling_Proxy(IMarkupPointer *This,WINBOOL fCLing);

  void __RPC_STUB IMarkupPointer_SetCling_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_Unposition_Proxy(IMarkupPointer *This);

  void __RPC_STUB IMarkupPointer_Unposition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_IsPositioned_Proxy(IMarkupPointer *This,WINBOOL *pfPositioned);

  void __RPC_STUB IMarkupPointer_IsPositioned_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_GetContainer_Proxy(IMarkupPointer *This,IMarkupContainer **ppContainer);

  void __RPC_STUB IMarkupPointer_GetContainer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_MoveAdjacentToElement_Proxy(IMarkupPointer *This,IHTMLElement *pElement,ELEMENT_ADJACENCY eAdj);

  void __RPC_STUB IMarkupPointer_MoveAdjacentToElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_MoveToPointer_Proxy(IMarkupPointer *This,IMarkupPointer *pPointer);

  void __RPC_STUB IMarkupPointer_MoveToPointer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_MoveToContainer_Proxy(IMarkupPointer *This,IMarkupContainer *pContainer,WINBOOL fAtStart);

  void __RPC_STUB IMarkupPointer_MoveToContainer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_Left_Proxy(IMarkupPointer *This,WINBOOL fMove,MARKUP_CONTEXT_TYPE *pContext,IHTMLElement **ppElement,long *pcch,OLECHAR *pchText);

  void __RPC_STUB IMarkupPointer_Left_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_Right_Proxy(IMarkupPointer *This,WINBOOL fMove,MARKUP_CONTEXT_TYPE *pContext,IHTMLElement **ppElement,long *pcch,OLECHAR *pchText);

  void __RPC_STUB IMarkupPointer_Right_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_CurrentScope_Proxy(IMarkupPointer *This,IHTMLElement **ppElemCurrent);

  void __RPC_STUB IMarkupPointer_CurrentScope_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_IsLeftOf_Proxy(IMarkupPointer *This,IMarkupPointer *pPointerThat,WINBOOL *pfResult);

  void __RPC_STUB IMarkupPointer_IsLeftOf_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_IsLeftOfOrEqualTo_Proxy(IMarkupPointer *This,IMarkupPointer *pPointerThat,WINBOOL *pfResult);

  void __RPC_STUB IMarkupPointer_IsLeftOfOrEqualTo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_IsRightOf_Proxy(IMarkupPointer *This,IMarkupPointer *pPointerThat,WINBOOL *pfResult);

  void __RPC_STUB IMarkupPointer_IsRightOf_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_IsRightOfOrEqualTo_Proxy(IMarkupPointer *This,IMarkupPointer *pPointerThat,WINBOOL *pfResult);

  void __RPC_STUB IMarkupPointer_IsRightOfOrEqualTo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_IsEqualTo_Proxy(IMarkupPointer *This,IMarkupPointer *pPointerThat,WINBOOL *pfAreEqual);

  void __RPC_STUB IMarkupPointer_IsEqualTo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_MoveUnit_Proxy(IMarkupPointer *This,MOVEUNIT_ACTION muAction);

  void __RPC_STUB IMarkupPointer_MoveUnit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer_FindText_Proxy(IMarkupPointer *This,OLECHAR *pchFindText,DWORD dwFlags,IMarkupPointer *pIEndMatch,IMarkupPointer *pIEndSearch);

  void __RPC_STUB IMarkupPointer_FindText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMarkupContainer_INTERFACE_DEFINED__
#define __IMarkupContainer_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IMarkupContainer;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IMarkupContainer : public IUnknown
  {
  public:
    virtual HRESULT WINAPI OwningDoc(IHTMLDocument2 **ppDoc) = 0;

  };
#else

  typedef struct IMarkupContainerVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IMarkupContainer *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IMarkupContainer *This);

      ULONG (WINAPI *Release)(IMarkupContainer *This);

      HRESULT (WINAPI *OwningDoc)(IMarkupContainer *This,IHTMLDocument2 **ppDoc);

    END_INTERFACE
  } IMarkupContainerVtbl;

  interface IMarkupContainer
  {
    CONST_VTBL struct IMarkupContainerVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IMarkupContainer_OwningDoc(This,ppDoc) (This)->lpVtbl->OwningDoc(This,ppDoc)
#endif
#endif

  HRESULT WINAPI IMarkupContainer_OwningDoc_Proxy(IMarkupContainer *This,IHTMLDocument2 **ppDoc);

  void __RPC_STUB IMarkupContainer_OwningDoc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMarkupContainer2_INTERFACE_DEFINED__
#define __IMarkupContainer2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IMarkupContainer2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IMarkupContainer2 : public IMarkupContainer
  {
  public:
    virtual HRESULT WINAPI CreateChangeLog(IHTMLChangeSink *pChangeSink,IHTMLChangeLog **ppChangeLog,WINBOOL fForward,WINBOOL fBackward) = 0;

    virtual HRESULT WINAPI RegisterForDirtyRange(IHTMLChangeSink *pChangeSink,DWORD *pdwCookie) = 0;

    virtual HRESULT WINAPI UnRegisterForDirtyRange(DWORD dwCookie) = 0;

    virtual HRESULT WINAPI GetAndClearDirtyRange(DWORD dwCookie,IMarkupPointer *pIPointerBegin,IMarkupPointer *pIPointerEnd) = 0;

    virtual long WINAPI GetVersionNumber(void) = 0;

    virtual HRESULT WINAPI GetMasterElement(IHTMLElement **ppElementMaster) = 0;

  };
#else

  typedef struct IMarkupContainer2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IMarkupContainer2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IMarkupContainer2 *This);

      ULONG (WINAPI *Release)(IMarkupContainer2 *This);

      HRESULT (WINAPI *OwningDoc)(IMarkupContainer2 *This,IHTMLDocument2 **ppDoc);

      HRESULT (WINAPI *CreateChangeLog)(IMarkupContainer2 *This,IHTMLChangeSink *pChangeSink,IHTMLChangeLog **ppChangeLog,WINBOOL fForward,WINBOOL fBackward);

      HRESULT (WINAPI *RegisterForDirtyRange)(IMarkupContainer2 *This,IHTMLChangeSink *pChangeSink,DWORD *pdwCookie);

      HRESULT (WINAPI *UnRegisterForDirtyRange)(IMarkupContainer2 *This,DWORD dwCookie);

      HRESULT (WINAPI *GetAndClearDirtyRange)(IMarkupContainer2 *This,DWORD dwCookie,IMarkupPointer *pIPointerBegin,IMarkupPointer *pIPointerEnd);

      long (WINAPI *GetVersionNumber)(IMarkupContainer2 *This);

      HRESULT (WINAPI *GetMasterElement)(IMarkupContainer2 *This,IHTMLElement **ppElementMaster);

    END_INTERFACE
  } IMarkupContainer2Vtbl;

  interface IMarkupContainer2
  {
    CONST_VTBL struct IMarkupContainer2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IMarkupContainer2_OwningDoc(This,ppDoc) (This)->lpVtbl->OwningDoc(This,ppDoc)

#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)
#endif
#endif

  HRESULT WINAPI IMarkupContainer2_CreateChangeLog_Proxy(IMarkupContainer2 *This,IHTMLChangeSink *pChangeSink,IHTMLChangeLog **ppChangeLog,WINBOOL fForward,WINBOOL fBackward);

  void __RPC_STUB IMarkupContainer2_CreateChangeLog_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupContainer2_RegisterForDirtyRange_Proxy(IMarkupContainer2 *This,IHTMLChangeSink *pChangeSink,DWORD *pdwCookie);

  void __RPC_STUB IMarkupContainer2_RegisterForDirtyRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupContainer2_UnRegisterForDirtyRange_Proxy(IMarkupContainer2 *This,DWORD dwCookie);

  void __RPC_STUB IMarkupContainer2_UnRegisterForDirtyRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupContainer2_GetAndClearDirtyRange_Proxy(IMarkupContainer2 *This,DWORD dwCookie,IMarkupPointer *pIPointerBegin,IMarkupPointer *pIPointerEnd);

  void __RPC_STUB IMarkupContainer2_GetAndClearDirtyRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  long WINAPI IMarkupContainer2_GetVersionNumber_Proxy(IMarkupContainer2 *This);

  void __RPC_STUB IMarkupContainer2_GetVersionNumber_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupContainer2_GetMasterElement_Proxy(IMarkupContainer2 *This,IHTMLElement **ppElementMaster);

  void __RPC_STUB IMarkupContainer2_GetMasterElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLChangeLog_INTERFACE_DEFINED__
#define __IHTMLChangeLog_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLChangeLog;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLChangeLog : public IUnknown
  {
  public:
    virtual HRESULT WINAPI GetNextChange(BYTE *pbBuffer,long nBufferSize,long *pnRecordLength) = 0;

  };
#else

  typedef struct IHTMLChangeLogVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLChangeLog *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLChangeLog *This);

      ULONG (WINAPI *Release)(IHTMLChangeLog *This);

      HRESULT (WINAPI *GetNextChange)(IHTMLChangeLog *This,BYTE *pbBuffer,long nBufferSize,long *pnRecordLength);

    END_INTERFACE
  } IHTMLChangeLogVtbl;

  interface IHTMLChangeLog
  {
    CONST_VTBL struct IHTMLChangeLogVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IHTMLChangeLog_GetNextChange(This,pbBuffer,nBufferSize,pnRecordLength) (This)->lpVtbl->GetNextChange(This,pbBuffer,nBufferSize,pnRecordLength)
#endif
#endif

  HRESULT WINAPI IHTMLChangeLog_GetNextChange_Proxy(IHTMLChangeLog *This,BYTE *pbBuffer,long nBufferSize,long *pnRecordLength);

  void __RPC_STUB IHTMLChangeLog_GetNextChange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLChangeSink_INTERFACE_DEFINED__
#define __IHTMLChangeSink_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLChangeSink;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLChangeSink : public IUnknown
  {
  public:
    virtual HRESULT WINAPI Notify(void) = 0;

  };
#else

  typedef struct IHTMLChangeSinkVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLChangeSink *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLChangeSink *This);

      ULONG (WINAPI *Release)(IHTMLChangeSink *This);

      HRESULT (WINAPI *Notify)(IHTMLChangeSink *This);

    END_INTERFACE
  } IHTMLChangeSinkVtbl;

  interface IHTMLChangeSink
  {
    CONST_VTBL struct IHTMLChangeSinkVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IHTMLChangeSink_Notify(This) (This)->lpVtbl->Notify(This)
#endif
#endif

  HRESULT WINAPI IHTMLChangeSink_Notify_Proxy(IHTMLChangeSink *This);

  void __RPC_STUB IHTMLChangeSink_Notify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IActiveIMMApp_INTERFACE_DEFINED__
#define __IActiveIMMApp_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IActiveIMMApp;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IActiveIMMApp : public IUnknown
  {
  public:
    virtual HRESULT WINAPI AssociateContext(HWND hWnd,HIMC hIME,HIMC *phPrev) = 0;

    virtual HRESULT WINAPI ConfigureIMEA(HKL hKL,HWND hWnd,DWORD dwMode,REGISTERWORDA *pData) = 0;

    virtual HRESULT WINAPI ConfigureIMEW(HKL hKL,HWND hWnd,DWORD dwMode,REGISTERWORDW *pData) = 0;

    virtual HRESULT WINAPI CreateContext(HIMC *phIMC) = 0;

    virtual HRESULT WINAPI DestroyContext(HIMC hIME) = 0;

    virtual HRESULT WINAPI EnumRegisterWordA(HKL hKL,LPSTR szReading,DWORD dwStyle,LPSTR szRegister,LPVOID pData,IEnumRegisterWordA **pEnum) = 0;

    virtual HRESULT WINAPI EnumRegisterWordW(HKL hKL,LPWSTR szReading,DWORD dwStyle,LPWSTR szRegister,LPVOID pData,IEnumRegisterWordW **pEnum) = 0;

    virtual HRESULT WINAPI EscapeA(HKL hKL,HIMC hIMC,UINT uEscape,LPVOID pData,LRESULT *plResult) = 0;

    virtual HRESULT WINAPI EscapeW(HKL hKL,HIMC hIMC,UINT uEscape,LPVOID pData,LRESULT *plResult) = 0;

    virtual HRESULT WINAPI GetCandidateListA(HIMC hIMC,DWORD dwIndex,UINT uBufLen,CANDIDATELIST *pCandList,UINT *puCopied) = 0;

    virtual HRESULT WINAPI GetCandidateListW(HIMC hIMC,DWORD dwIndex,UINT uBufLen,CANDIDATELIST *pCandList,UINT *puCopied) = 0;

    virtual HRESULT WINAPI GetCandidateListCountA(HIMC hIMC,DWORD *pdwListSize,DWORD *pdwBufLen) = 0;

    virtual HRESULT WINAPI GetCandidateListCountW(HIMC hIMC,DWORD *pdwListSize,DWORD *pdwBufLen) = 0;

    virtual HRESULT WINAPI GetCandidateWindow(HIMC hIMC,DWORD dwIndex,CANDIDATEFORM *pCandidate) = 0;

    virtual HRESULT WINAPI GetCompositionFontA(HIMC hIMC,LOGFONTA *plf) = 0;

    virtual HRESULT WINAPI GetCompositionFontW(HIMC hIMC,LOGFONTW *plf) = 0;

    virtual HRESULT WINAPI GetCompositionStringA(HIMC hIMC,DWORD dwIndex,DWORD dwBufLen,LONG *plCopied,LPVOID pBuf) = 0;

    virtual HRESULT WINAPI GetCompositionStringW(HIMC hIMC,DWORD dwIndex,DWORD dwBufLen,LONG *plCopied,LPVOID pBuf) = 0;

    virtual HRESULT WINAPI GetCompositionWindow(HIMC hIMC,COMPOSITIONFORM *pCompForm) = 0;

    virtual HRESULT WINAPI GetContext(HWND hWnd,HIMC *phIMC) = 0;

    virtual HRESULT WINAPI GetConversionListA(HKL hKL,HIMC hIMC,LPSTR pSrc,UINT uBufLen,UINT uFlag,CANDIDATELIST *pDst,UINT *puCopied) = 0;

    virtual HRESULT WINAPI GetConversionListW(HKL hKL,HIMC hIMC,LPWSTR pSrc,UINT uBufLen,UINT uFlag,CANDIDATELIST *pDst,UINT *puCopied) = 0;

    virtual HRESULT WINAPI GetConversionStatus(HIMC hIMC,DWORD *pfdwConversion,DWORD *pfdwSentence) = 0;

    virtual HRESULT WINAPI GetDefaultIMEWnd(HWND hWnd,HWND *phDefWnd) = 0;

    virtual HRESULT WINAPI GetDescriptionA(HKL hKL,UINT uBufLen,LPSTR szDescription,UINT *puCopied) = 0;

    virtual HRESULT WINAPI GetDescriptionW(HKL hKL,UINT uBufLen,LPWSTR szDescription,UINT *puCopied) = 0;

    virtual HRESULT WINAPI GetGuideLineA(HIMC hIMC,DWORD dwIndex,DWORD dwBufLen,LPSTR pBuf,DWORD *pdwResult) = 0;

    virtual HRESULT WINAPI GetGuideLineW(HIMC hIMC,DWORD dwIndex,DWORD dwBufLen,LPWSTR pBuf,DWORD *pdwResult) = 0;

    virtual HRESULT WINAPI GetIMEFileNameA(HKL hKL,UINT uBufLen,LPSTR szFileName,UINT *puCopied) = 0;

    virtual HRESULT WINAPI GetIMEFileNameW(HKL hKL,UINT uBufLen,LPWSTR szFileName,UINT *puCopied) = 0;

    virtual HRESULT WINAPI GetOpenStatus(HIMC hIMC) = 0;

    virtual HRESULT WINAPI GetProperty(HKL hKL,DWORD fdwIndex,DWORD *pdwProperty) = 0;

    virtual HRESULT WINAPI GetRegisterWordStyleA(HKL hKL,UINT nItem,STYLEBUFA *pStyleBuf,UINT *puCopied) = 0;

    virtual HRESULT WINAPI GetRegisterWordStyleW(HKL hKL,UINT nItem,STYLEBUFW *pStyleBuf,UINT *puCopied) = 0;

    virtual HRESULT WINAPI GetStatusWindowPos(HIMC hIMC,POINT *pptPos) = 0;

    virtual HRESULT WINAPI GetVirtualKey(HWND hWnd,UINT *puVirtualKey) = 0;

    virtual HRESULT WINAPI InstallIMEA(LPSTR szIMEFileName,LPSTR szLayoutText,HKL *phKL) = 0;

    virtual HRESULT WINAPI InstallIMEW(LPWSTR szIMEFileName,LPWSTR szLayoutText,HKL *phKL) = 0;

    virtual HRESULT WINAPI IsIME(HKL hKL) = 0;

    virtual HRESULT WINAPI IsUIMessageA(HWND hWndIME,UINT msg,WPARAM wParam,LPARAM lParam) = 0;

    virtual HRESULT WINAPI IsUIMessageW(HWND hWndIME,UINT msg,WPARAM wParam,LPARAM lParam) = 0;

    virtual HRESULT WINAPI NotifyIME(HIMC hIMC,DWORD dwAction,DWORD dwIndex,DWORD dwValue) = 0;

    virtual HRESULT WINAPI RegisterWordA(HKL hKL,LPSTR szReading,DWORD dwStyle,LPSTR szRegister) = 0;

    virtual HRESULT WINAPI RegisterWordW(HKL hKL,LPWSTR szReading,DWORD dwStyle,LPWSTR szRegister) = 0;

    virtual HRESULT WINAPI ReleaseContext(HWND hWnd,HIMC hIMC) = 0;

    virtual HRESULT WINAPI SetCandidateWindow(HIMC hIMC,CANDIDATEFORM *pCandidate) = 0;

    virtual HRESULT WINAPI SetCompositionFontA(HIMC hIMC,LOGFONTA *plf) = 0;

    virtual HRESULT WINAPI SetCompositionFontW(HIMC hIMC,LOGFONTW *plf) = 0;

    virtual HRESULT WINAPI SetCompositionStringA(HIMC hIMC,DWORD dwIndex,LPVOID pComp,DWORD dwCompLen,LPVOID pRead,DWORD dwReadLen) = 0;

    virtual HRESULT WINAPI SetCompositionStringW(HIMC hIMC,DWORD dwIndex,LPVOID pComp,DWORD dwCompLen,LPVOID pRead,DWORD dwReadLen) = 0;

    virtual HRESULT WINAPI SetCompositionWindow(HIMC hIMC,COMPOSITIONFORM *pCompForm) = 0;

    virtual HRESULT WINAPI SetConversionStatus(HIMC hIMC,DWORD fdwConversion,DWORD fdwSentence) = 0;

    virtual HRESULT WINAPI SetOpenStatus(HIMC hIMC,WINBOOL fOpen) = 0;

    virtual HRESULT WINAPI SetStatusWindowPos(HIMC hIMC,POINT *pptPos) = 0;

    virtual HRESULT WINAPI SimulateHotKey(HWND hWnd,DWORD dwHotKeyID) = 0;

    virtual HRESULT WINAPI UnregisterWordA(HKL hKL,LPSTR szReading,DWORD dwStyle,LPSTR szUnregister) = 0;

    virtual HRESULT WINAPI UnregisterWordW(HKL hKL,LPWSTR szReading,DWORD dwStyle,LPWSTR szUnregister) = 0;

    virtual HRESULT WINAPI Activate(WINBOOL fRestoreLayout) = 0;

    virtual HRESULT WINAPI Deactivate(void) = 0;

    virtual HRESULT WINAPI OnDefWindowProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,LRESULT *plResult) = 0;

    virtual HRESULT WINAPI FilterClientWindows(ATOM *aaClassList,UINT uSize) = 0;

    virtual HRESULT WINAPI GetCodePageA(HKL hKL,UINT *uCodePage) = 0;

    virtual HRESULT WINAPI GetLangId(HKL hKL,LANGID *plid) = 0;

    virtual HRESULT WINAPI AssociateContextEx(HWND hWnd,HIMC hIMC,DWORD dwFlags) = 0;

    virtual HRESULT WINAPI DisableIME(DWORD idThread) = 0;

    virtual HRESULT WINAPI GetImeMenuItemsA(HIMC hIMC,DWORD dwFlags,DWORD dwType,IMEMENUITEMINFOA *pImeParentMenu,IMEMENUITEMINFOA *pImeMenu,DWORD dwSize,DWORD *pdwResult) = 0;

    virtual HRESULT WINAPI GetImeMenuItemsW(HIMC hIMC,DWORD dwFlags,DWORD dwType,IMEMENUITEMINFOW *pImeParentMenu,IMEMENUITEMINFOW *pImeMenu,DWORD dwSize,DWORD *pdwResult) = 0;

    virtual HRESULT WINAPI EnumInputContext(DWORD idThread,IEnumInputContext **ppEnum) = 0;

  };
#else

  typedef struct IActiveIMMAppVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IActiveIMMApp *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IActiveIMMApp *This);

      ULONG (WINAPI *Release)(IActiveIMMApp *This);

      HRESULT (WINAPI *AssociateContext)(IActiveIMMApp *This,HWND hWnd,HIMC hIME,HIMC *phPrev);

      HRESULT (WINAPI *ConfigureIMEA)(IActiveIMMApp *This,HKL hKL,HWND hWnd,DWORD dwMode,REGISTERWORDA *pData);

      HRESULT (WINAPI *ConfigureIMEW)(IActiveIMMApp *This,HKL hKL,HWND hWnd,DWORD dwMode,REGISTERWORDW *pData);

      HRESULT (WINAPI *CreateContext)(IActiveIMMApp *This,HIMC *phIMC);

      HRESULT (WINAPI *DestroyContext)(IActiveIMMApp *This,HIMC hIME);

      HRESULT (WINAPI *EnumRegisterWordA)(IActiveIMMApp *This,HKL hKL,LPSTR szReading,DWORD dwStyle,LPSTR szRegister,LPVOID pData,IEnumRegisterWordA **pEnum);

      HRESULT (WINAPI *EnumRegisterWordW)(IActiveIMMApp *This,HKL hKL,LPWSTR szReading,DWORD dwStyle,LPWSTR szRegister,LPVOID pData,IEnumRegisterWordW **pEnum);

      HRESULT (WINAPI *EscapeA)(IActiveIMMApp *This,HKL hKL,HIMC hIMC,UINT uEscape,LPVOID pData,LRESULT *plResult);

      HRESULT (WINAPI *EscapeW)(IActiveIMMApp *This,HKL hKL,HIMC hIMC,UINT uEscape,LPVOID pData,LRESULT *plResult);

      HRESULT (WINAPI *GetCandidateListA)(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,UINT uBufLen,CANDIDATELIST *pCandList,UINT *puCopied);

      HRESULT (WINAPI *GetCandidateListW)(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,UINT uBufLen,CANDIDATELIST *pCandList,UINT *puCopied);

      HRESULT (WINAPI *GetCandidateListCountA)(IActiveIMMApp *This,HIMC hIMC,DWORD *pdwListSize,DWORD *pdwBufLen);

      HRESULT (WINAPI *GetCandidateListCountW)(IActiveIMMApp *This,HIMC hIMC,DWORD *pdwListSize,DWORD *pdwBufLen);

      HRESULT (WINAPI *GetCandidateWindow)(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,CANDIDATEFORM *pCandidate);

      HRESULT (WINAPI *GetCompositionFontA)(IActiveIMMApp *This,HIMC hIMC,LOGFONTA *plf);

      HRESULT (WINAPI *GetCompositionFontW)(IActiveIMMApp *This,HIMC hIMC,LOGFONTW *plf);

      HRESULT (WINAPI *GetCompositionStringA)(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,DWORD dwBufLen,LONG *plCopied,LPVOID pBuf);

      HRESULT (WINAPI *GetCompositionStringW)(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,DWORD dwBufLen,LONG *plCopied,LPVOID pBuf);

      HRESULT (WINAPI *GetCompositionWindow)(IActiveIMMApp *This,HIMC hIMC,COMPOSITIONFORM *pCompForm);

      HRESULT (WINAPI *GetContext)(IActiveIMMApp *This,HWND hWnd,HIMC *phIMC);

      HRESULT (WINAPI *GetConversionListA)(IActiveIMMApp *This,HKL hKL,HIMC hIMC,LPSTR pSrc,UINT uBufLen,UINT uFlag,CANDIDATELIST *pDst,UINT *puCopied);

      HRESULT (WINAPI *GetConversionListW)(IActiveIMMApp *This,HKL hKL,HIMC hIMC,LPWSTR pSrc,UINT uBufLen,UINT uFlag,CANDIDATELIST *pDst,UINT *puCopied);

      HRESULT (WINAPI *GetConversionStatus)(IActiveIMMApp *This,HIMC hIMC,DWORD *pfdwConversion,DWORD *pfdwSentence);

      HRESULT (WINAPI *GetDefaultIMEWnd)(IActiveIMMApp *This,HWND hWnd,HWND *phDefWnd);

      HRESULT (WINAPI *GetDescriptionA)(IActiveIMMApp *This,HKL hKL,UINT uBufLen,LPSTR szDescription,UINT *puCopied);

      HRESULT (WINAPI *GetDescriptionW)(IActiveIMMApp *This,HKL hKL,UINT uBufLen,LPWSTR szDescription,UINT *puCopied);

      HRESULT (WINAPI *GetGuideLineA)(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,DWORD dwBufLen,LPSTR pBuf,DWORD *pdwResult);

      HRESULT (WINAPI *GetGuideLineW)(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,DWORD dwBufLen,LPWSTR pBuf,DWORD *pdwResult);

      HRESULT (WINAPI *GetIMEFileNameA)(IActiveIMMApp *This,HKL hKL,UINT uBufLen,LPSTR szFileName,UINT *puCopied);

      HRESULT (WINAPI *GetIMEFileNameW)(IActiveIMMApp *This,HKL hKL,UINT uBufLen,LPWSTR szFileName,UINT *puCopied);

      HRESULT (WINAPI *GetOpenStatus)(IActiveIMMApp *This,HIMC hIMC);

      HRESULT (WINAPI *GetProperty)(IActiveIMMApp *This,HKL hKL,DWORD fdwIndex,DWORD *pdwProperty);

      HRESULT (WINAPI *GetRegisterWordStyleA)(IActiveIMMApp *This,HKL hKL,UINT nItem,STYLEBUFA *pStyleBuf,UINT *puCopied);

      HRESULT (WINAPI *GetRegisterWordStyleW)(IActiveIMMApp *This,HKL hKL,UINT nItem,STYLEBUFW *pStyleBuf,UINT *puCopied);

      HRESULT (WINAPI *GetStatusWindowPos)(IActiveIMMApp *This,HIMC hIMC,POINT *pptPos);

      HRESULT (WINAPI *GetVirtualKey)(IActiveIMMApp *This,HWND hWnd,UINT *puVirtualKey);

      HRESULT (WINAPI *InstallIMEA)(IActiveIMMApp *This,LPSTR szIMEFileName,LPSTR szLayoutText,HKL *phKL);

      HRESULT (WINAPI *InstallIMEW)(IActiveIMMApp *This,LPWSTR szIMEFileName,LPWSTR szLayoutText,HKL *phKL);

      HRESULT (WINAPI *IsIME)(IActiveIMMApp *This,HKL hKL);

      HRESULT (WINAPI *IsUIMessageA)(IActiveIMMApp *This,HWND hWndIME,UINT msg,WPARAM wParam,LPARAM lParam);

      HRESULT (WINAPI *IsUIMessageW)(IActiveIMMApp *This,HWND hWndIME,UINT msg,WPARAM wParam,LPARAM lParam);

      HRESULT (WINAPI *NotifyIME)(IActiveIMMApp *This,HIMC hIMC,DWORD dwAction,DWORD dwIndex,DWORD dwValue);

      HRESULT (WINAPI *RegisterWordA)(IActiveIMMApp *This,HKL hKL,LPSTR szReading,DWORD dwStyle,LPSTR szRegister);

      HRESULT (WINAPI *RegisterWordW)(IActiveIMMApp *This,HKL hKL,LPWSTR szReading,DWORD dwStyle,LPWSTR szRegister);

      HRESULT (WINAPI *ReleaseContext)(IActiveIMMApp *This,HWND hWnd,HIMC hIMC);

      HRESULT (WINAPI *SetCandidateWindow)(IActiveIMMApp *This,HIMC hIMC,CANDIDATEFORM *pCandidate);

      HRESULT (WINAPI *SetCompositionFontA)(IActiveIMMApp *This,HIMC hIMC,LOGFONTA *plf);

      HRESULT (WINAPI *SetCompositionFontW)(IActiveIMMApp *This,HIMC hIMC,LOGFONTW *plf);

      HRESULT (WINAPI *SetCompositionStringA)(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,LPVOID pComp,DWORD dwCompLen,LPVOID pRead,DWORD dwReadLen);

      HRESULT (WINAPI *SetCompositionStringW)(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,LPVOID pComp,DWORD dwCompLen,LPVOID pRead,DWORD dwReadLen);

      HRESULT (WINAPI *SetCompositionWindow)(IActiveIMMApp *This,HIMC hIMC,COMPOSITIONFORM *pCompForm);

      HRESULT (WINAPI *SetConversionStatus)(IActiveIMMApp *This,HIMC hIMC,DWORD fdwConversion,DWORD fdwSentence);

      HRESULT (WINAPI *SetOpenStatus)(IActiveIMMApp *This,HIMC hIMC,WINBOOL fOpen);

      HRESULT (WINAPI *SetStatusWindowPos)(IActiveIMMApp *This,HIMC hIMC,POINT *pptPos);

      HRESULT (WINAPI *SimulateHotKey)(IActiveIMMApp *This,HWND hWnd,DWORD dwHotKeyID);

      HRESULT (WINAPI *UnregisterWordA)(IActiveIMMApp *This,HKL hKL,LPSTR szReading,DWORD dwStyle,LPSTR szUnregister);

      HRESULT (WINAPI *UnregisterWordW)(IActiveIMMApp *This,HKL hKL,LPWSTR szReading,DWORD dwStyle,LPWSTR szUnregister);

      HRESULT (WINAPI *Activate)(IActiveIMMApp *This,WINBOOL fRestoreLayout);

      HRESULT (WINAPI *Deactivate)(IActiveIMMApp *This);

      HRESULT (WINAPI *OnDefWindowProc)(IActiveIMMApp *This,HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,LRESULT *plResult);

      HRESULT (WINAPI *FilterClientWindows)(IActiveIMMApp *This,ATOM *aaClassList,UINT uSize);

      HRESULT (WINAPI *GetCodePageA)(IActiveIMMApp *This,HKL hKL,UINT *uCodePage);

      HRESULT (WINAPI *GetLangId)(IActiveIMMApp *This,HKL hKL,LANGID *plid);

      HRESULT (WINAPI *AssociateContextEx)(IActiveIMMApp *This,HWND hWnd,HIMC hIMC,DWORD dwFlags);

      HRESULT (WINAPI *DisableIME)(IActiveIMMApp *This,DWORD idThread);

      HRESULT (WINAPI *GetImeMenuItemsA)(IActiveIMMApp *This,HIMC hIMC,DWORD dwFlags,DWORD dwType,IMEMENUITEMINFOA *pImeParentMenu,IMEMENUITEMINFOA *pImeMenu,DWORD dwSize,DWORD *pdwResult);

      HRESULT (WINAPI *GetImeMenuItemsW)(IActiveIMMApp *This,HIMC hIMC,DWORD dwFlags,DWORD dwType,IMEMENUITEMINFOW *pImeParentMenu,IMEMENUITEMINFOW *pImeMenu,DWORD dwSize,DWORD *pdwResult);

      HRESULT (WINAPI *EnumInputContext)(IActiveIMMApp *This,DWORD idThread,IEnumInputContext **ppEnum);

    END_INTERFACE
  } IActiveIMMAppVtbl;

  interface IActiveIMMApp
  {
    CONST_VTBL struct IActiveIMMAppVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#define IActiveIMMApp_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)

#define IActiveIMMApp_AddRef(This) (This)->lpVtbl->AddRef(This)

#define IActiveIMMApp_Release(This) (This)->lpVtbl->Release(This)

#define IActiveIMMApp_AssociateContext(This,hWnd,hIME,phPrev) (This)->lpVtbl->AssociateContext(This,hWnd,hIME,phPrev)

#define IActiveIMMApp_ConfigureIMEA(This,hKL,hWnd,dwMode,pData) (This)->lpVtbl->ConfigureIMEA(This,hKL,hWnd,dwMode,pData)

#define IActiveIMMApp_ConfigureIMEW(This,hKL,hWnd,dwMode,pData) (This)->lpVtbl->ConfigureIMEW(This,hKL,hWnd,dwMode,pData)

#define IActiveIMMApp_CreateContext(This,phIMC) (This)->lpVtbl->CreateContext(This,phIMC)

#define IActiveIMMApp_DestroyContext(This,hIME) (This)->lpVtbl->DestroyContext(This,hIME)

#define IActiveIMMApp_EnumRegisterWordA(This,hKL,szReading,dwStyle,szRegister,pData,pEnum) (This)->lpVtbl->EnumRegisterWordA(This,hKL,szReading,dwStyle,szRegister,pData,pEnum)

#define IActiveIMMApp_EnumRegisterWordW(This,hKL,szReading,dwStyle,szRegister,pData,pEnum) (This)->lpVtbl->EnumRegisterWordW(This,hKL,szReading,dwStyle,szRegister,pData,pEnum)

#define IActiveIMMApp_EscapeA(This,hKL,hIMC,uEscape,pData,plResult) (This)->lpVtbl->EscapeA(This,hKL,hIMC,uEscape,pData,plResult)

#define IActiveIMMApp_EscapeW(This,hKL,hIMC,uEscape,pData,plResult) (This)->lpVtbl->EscapeW(This,hKL,hIMC,uEscape,pData,plResult)

#define IActiveIMMApp_GetCandidateListA(This,hIMC,dwIndex,uBufLen,pCandList,puCopied) (This)->lpVtbl->GetCandidateListA(This,hIMC,dwIndex,uBufLen,pCandList,puCopied)

#define IActiveIMMApp_GetCandidateListW(This,hIMC,dwIndex,uBufLen,pCandList,puCopied) (This)->lpVtbl->GetCandidateListW(This,hIMC,dwIndex,uBufLen,pCandList,puCopied)

#define IActiveIMMApp_GetCandidateListCountA(This,hIMC,pdwListSize,pdwBufLen) (This)->lpVtbl->GetCandidateListCountA(This,hIMC,pdwListSize,pdwBufLen)

#define IActiveIMMApp_GetCandidateListCountW(This,hIMC,pdwListSize,pdwBufLen) (This)->lpVtbl->GetCandidateListCountW(This,hIMC,pdwListSize,pdwBufLen)

#define IActiveIMMApp_GetCandidateWindow(This,hIMC,dwIndex,pCandidate) (This)->lpVtbl->GetCandidateWindow(This,hIMC,dwIndex,pCandidate)

#define IActiveIMMApp_GetCompositionFontA(This,hIMC,plf) (This)->lpVtbl->GetCompositionFontA(This,hIMC,plf)

#define IActiveIMMApp_GetCompositionFontW(This,hIMC,plf) (This)->lpVtbl->GetCompositionFontW(This,hIMC,plf)

#define IActiveIMMApp_GetCompositionStringA(This,hIMC,dwIndex,dwBufLen,plCopied,pBuf) (This)->lpVtbl->GetCompositionStringA(This,hIMC,dwIndex,dwBufLen,plCopied,pBuf)

#define IActiveIMMApp_GetCompositionStringW(This,hIMC,dwIndex,dwBufLen,plCopied,pBuf) (This)->lpVtbl->GetCompositionStringW(This,hIMC,dwIndex,dwBufLen,plCopied,pBuf)

#define IActiveIMMApp_GetCompositionWindow(This,hIMC,pCompForm) (This)->lpVtbl->GetCompositionWindow(This,hIMC,pCompForm)

#define IActiveIMMApp_GetContext(This,hWnd,phIMC) (This)->lpVtbl->GetContext(This,hWnd,phIMC)

#define IActiveIMMApp_GetConversionListA(This,hKL,hIMC,pSrc,uBufLen,uFlag,pDst,puCopied) (This)->lpVtbl->GetConversionListA(This,hKL,hIMC,pSrc,uBufLen,uFlag,pDst,puCopied)

#define IActiveIMMApp_GetConversionListW(This,hKL,hIMC,pSrc,uBufLen,uFlag,pDst,puCopied) (This)->lpVtbl->GetConversionListW(This,hKL,hIMC,pSrc,uBufLen,uFlag,pDst,puCopied)

#define IActiveIMMApp_GetConversionStatus(This,hIMC,pfdwConversion,pfdwSentence) (This)->lpVtbl->GetConversionStatus(This,hIMC,pfdwConversion,pfdwSentence)

#define IActiveIMMApp_GetDefaultIMEWnd(This,hWnd,phDefWnd) (This)->lpVtbl->GetDefaultIMEWnd(This,hWnd,phDefWnd)

#define IActiveIMMApp_GetDescriptionA(This,hKL,uBufLen,szDescription,puCopied) (This)->lpVtbl->GetDescriptionA(This,hKL,uBufLen,szDescription,puCopied)

#define IActiveIMMApp_GetDescriptionW(This,hKL,uBufLen,szDescription,puCopied) (This)->lpVtbl->GetDescriptionW(This,hKL,uBufLen,szDescription,puCopied)

#define IActiveIMMApp_GetGuideLineA(This,hIMC,dwIndex,dwBufLen,pBuf,pdwResult) (This)->lpVtbl->GetGuideLineA(This,hIMC,dwIndex,dwBufLen,pBuf,pdwResult)

#define IActiveIMMApp_GetGuideLineW(This,hIMC,dwIndex,dwBufLen,pBuf,pdwResult) (This)->lpVtbl->GetGuideLineW(This,hIMC,dwIndex,dwBufLen,pBuf,pdwResult)

#define IActiveIMMApp_GetIMEFileNameA(This,hKL,uBufLen,szFileName,puCopied) (This)->lpVtbl->GetIMEFileNameA(This,hKL,uBufLen,szFileName,puCopied)

#define IActiveIMMApp_GetIMEFileNameW(This,hKL,uBufLen,szFileName,puCopied) (This)->lpVtbl->GetIMEFileNameW(This,hKL,uBufLen,szFileName,puCopied)

#define IActiveIMMApp_GetOpenStatus(This,hIMC) (This)->lpVtbl->GetOpenStatus(This,hIMC)

#define IActiveIMMApp_GetProperty(This,hKL,fdwIndex,pdwProperty) (This)->lpVtbl->GetProperty(This,hKL,fdwIndex,pdwProperty)

#define IActiveIMMApp_GetRegisterWordStyleA(This,hKL,nItem,pStyleBuf,puCopied) (This)->lpVtbl->GetRegisterWordStyleA(This,hKL,nItem,pStyleBuf,puCopied)

#define IActiveIMMApp_GetRegisterWordStyleW(This,hKL,nItem,pStyleBuf,puCopied) (This)->lpVtbl->GetRegisterWordStyleW(This,hKL,nItem,pStyleBuf,puCopied)

#define IActiveIMMApp_GetStatusWindowPos(This,hIMC,pptPos) (This)->lpVtbl->GetStatusWindowPos(This,hIMC,pptPos)

#define IActiveIMMApp_GetVirtualKey(This,hWnd,puVirtualKey) (This)->lpVtbl->GetVirtualKey(This,hWnd,puVirtualKey)

#define IActiveIMMApp_InstallIMEA(This,szIMEFileName,szLayoutText,phKL) (This)->lpVtbl->InstallIMEA(This,szIMEFileName,szLayoutText,phKL)

#define IActiveIMMApp_InstallIMEW(This,szIMEFileName,szLayoutText,phKL) (This)->lpVtbl->InstallIMEW(This,szIMEFileName,szLayoutText,phKL)

#define IActiveIMMApp_IsIME(This,hKL) (This)->lpVtbl->IsIME(This,hKL)

#define IActiveIMMApp_IsUIMessageA(This,hWndIME,msg,wParam,lParam) (This)->lpVtbl->IsUIMessageA(This,hWndIME,msg,wParam,lParam)

#define IActiveIMMApp_IsUIMessageW(This,hWndIME,msg,wParam,lParam) (This)->lpVtbl->IsUIMessageW(This,hWndIME,msg,wParam,lParam)

#define IActiveIMMApp_NotifyIME(This,hIMC,dwAction,dwIndex,dwValue) (This)->lpVtbl->NotifyIME(This,hIMC,dwAction,dwIndex,dwValue)

#define IActiveIMMApp_RegisterWordA(This,hKL,szReading,dwStyle,szRegister) (This)->lpVtbl->RegisterWordA(This,hKL,szReading,dwStyle,szRegister)

#define IActiveIMMApp_RegisterWordW(This,hKL,szReading,dwStyle,szRegister) (This)->lpVtbl->RegisterWordW(This,hKL,szReading,dwStyle,szRegister)

#define IActiveIMMApp_ReleaseContext(This,hWnd,hIMC) (This)->lpVtbl->ReleaseContext(This,hWnd,hIMC)

#define IActiveIMMApp_SetCandidateWindow(This,hIMC,pCandidate) (This)->lpVtbl->SetCandidateWindow(This,hIMC,pCandidate)

#define IActiveIMMApp_SetCompositionFontA(This,hIMC,plf) (This)->lpVtbl->SetCompositionFontA(This,hIMC,plf)

#define IActiveIMMApp_SetCompositionFontW(This,hIMC,plf) (This)->lpVtbl->SetCompositionFontW(This,hIMC,plf)

#define IActiveIMMApp_SetCompositionStringA(This,hIMC,dwIndex,pComp,dwCompLen,pRead,dwReadLen) (This)->lpVtbl->SetCompositionStringA(This,hIMC,dwIndex,pComp,dwCompLen,pRead,dwReadLen)

#define IActiveIMMApp_SetCompositionStringW(This,hIMC,dwIndex,pComp,dwCompLen,pRead,dwReadLen) (This)->lpVtbl->SetCompositionStringW(This,hIMC,dwIndex,pComp,dwCompLen,pRead,dwReadLen)

#define IActiveIMMApp_SetCompositionWindow(This,hIMC,pCompForm) (This)->lpVtbl->SetCompositionWindow(This,hIMC,pCompForm)

#define IActiveIMMApp_SetConversionStatus(This,hIMC,fdwConversion,fdwSentence) (This)->lpVtbl->SetConversionStatus(This,hIMC,fdwConversion,fdwSentence)

#define IActiveIMMApp_SetOpenStatus(This,hIMC,fOpen) (This)->lpVtbl->SetOpenStatus(This,hIMC,fOpen)

#define IActiveIMMApp_SetStatusWindowPos(This,hIMC,pptPos) (This)->lpVtbl->SetStatusWindowPos(This,hIMC,pptPos)

#define IActiveIMMApp_SimulateHotKey(This,hWnd,dwHotKeyID) (This)->lpVtbl->SimulateHotKey(This,hWnd,dwHotKeyID)

#define IActiveIMMApp_UnregisterWordA(This,hKL,szReading,dwStyle,szUnregister) (This)->lpVtbl->UnregisterWordA(This,hKL,szReading,dwStyle,szUnregister)

#define IActiveIMMApp_UnregisterWordW(This,hKL,szReading,dwStyle,szUnregister) (This)->lpVtbl->UnregisterWordW(This,hKL,szReading,dwStyle,szUnregister)

#define IActiveIMMApp_Activate(This,fRestoreLayout) (This)->lpVtbl->Activate(This,fRestoreLayout)

#define IActiveIMMApp_Deactivate(This) (This)->lpVtbl->Deactivate(This)

#define IActiveIMMApp_OnDefWindowProc(This,hWnd,Msg,wParam,lParam,plResult) (This)->lpVtbl->OnDefWindowProc(This,hWnd,Msg,wParam,lParam,plResult)

#define IActiveIMMApp_FilterClientWindows(This,aaClassList,uSize) (This)->lpVtbl->FilterClientWindows(This,aaClassList,uSize)

#define IActiveIMMApp_GetCodePageA(This,hKL,uCodePage) (This)->lpVtbl->GetCodePageA(This,hKL,uCodePage)

#define IActiveIMMApp_GetLangId(This,hKL,plid) (This)->lpVtbl->GetLangId(This,hKL,plid)

#define IActiveIMMApp_AssociateContextEx(This,hWnd,hIMC,dwFlags) (This)->lpVtbl->AssociateContextEx(This,hWnd,hIMC,dwFlags)

#define IActiveIMMApp_DisableIME(This,idThread) (This)->lpVtbl->DisableIME(This,idThread)

#define IActiveIMMApp_GetImeMenuItemsA(This,hIMC,dwFlags,dwType,pImeParentMenu,pImeMenu,dwSize,pdwResult) (This)->lpVtbl->GetImeMenuItemsA(This,hIMC,dwFlags,dwType,pImeParentMenu,pImeMenu,dwSize,pdwResult)

#define IActiveIMMApp_GetImeMenuItemsW(This,hIMC,dwFlags,dwType,pImeParentMenu,pImeMenu,dwSize,pdwResult) (This)->lpVtbl->GetImeMenuItemsW(This,hIMC,dwFlags,dwType,pImeParentMenu,pImeMenu,dwSize,pdwResult)

#define IActiveIMMApp_EnumInputContext(This,idThread,ppEnum) (This)->lpVtbl->EnumInputContext(This,idThread,ppEnum)
#endif
#endif

  HRESULT WINAPI IActiveIMMApp_AssociateContext_Proxy(IActiveIMMApp *This,HWND hWnd,HIMC hIME,HIMC *phPrev);

  void __RPC_STUB IActiveIMMApp_AssociateContext_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_ConfigureIMEA_Proxy(IActiveIMMApp *This,HKL hKL,HWND hWnd,DWORD dwMode,REGISTERWORDA *pData);

  void __RPC_STUB IActiveIMMApp_ConfigureIMEA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_ConfigureIMEW_Proxy(IActiveIMMApp *This,HKL hKL,HWND hWnd,DWORD dwMode,REGISTERWORDW *pData);

  void __RPC_STUB IActiveIMMApp_ConfigureIMEW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_CreateContext_Proxy(IActiveIMMApp *This,HIMC *phIMC);

  void __RPC_STUB IActiveIMMApp_CreateContext_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_DestroyContext_Proxy(IActiveIMMApp *This,HIMC hIME);

  void __RPC_STUB IActiveIMMApp_DestroyContext_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_EnumRegisterWordA_Proxy(IActiveIMMApp *This,HKL hKL,LPSTR szReading,DWORD dwStyle,LPSTR szRegister,LPVOID pData,IEnumRegisterWordA **pEnum);

  void __RPC_STUB IActiveIMMApp_EnumRegisterWordA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_EnumRegisterWordW_Proxy(IActiveIMMApp *This,HKL hKL,LPWSTR szReading,DWORD dwStyle,LPWSTR szRegister,LPVOID pData,IEnumRegisterWordW **pEnum);

  void __RPC_STUB IActiveIMMApp_EnumRegisterWordW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_EscapeA_Proxy(IActiveIMMApp *This,HKL hKL,HIMC hIMC,UINT uEscape,LPVOID pData,LRESULT *plResult);

  void __RPC_STUB IActiveIMMApp_EscapeA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_EscapeW_Proxy(IActiveIMMApp *This,HKL hKL,HIMC hIMC,UINT uEscape,LPVOID pData,LRESULT *plResult);

  void __RPC_STUB IActiveIMMApp_EscapeW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetCandidateListA_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,UINT uBufLen,CANDIDATELIST *pCandList,UINT *puCopied);

  void __RPC_STUB IActiveIMMApp_GetCandidateListA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetCandidateListW_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,UINT uBufLen,CANDIDATELIST *pCandList,UINT *puCopied);

  void __RPC_STUB IActiveIMMApp_GetCandidateListW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetCandidateListCountA_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD *pdwListSize,DWORD *pdwBufLen);

  void __RPC_STUB IActiveIMMApp_GetCandidateListCountA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetCandidateListCountW_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD *pdwListSize,DWORD *pdwBufLen);

  void __RPC_STUB IActiveIMMApp_GetCandidateListCountW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetCandidateWindow_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,CANDIDATEFORM *pCandidate);

  void __RPC_STUB IActiveIMMApp_GetCandidateWindow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetCompositionFontA_Proxy(IActiveIMMApp *This,HIMC hIMC,LOGFONTA *plf);

  void __RPC_STUB IActiveIMMApp_GetCompositionFontA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetCompositionFontW_Proxy(IActiveIMMApp *This,HIMC hIMC,LOGFONTW *plf);

  void __RPC_STUB IActiveIMMApp_GetCompositionFontW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetCompositionStringA_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,DWORD dwBufLen,LONG *plCopied,LPVOID pBuf);

  void __RPC_STUB IActiveIMMApp_GetCompositionStringA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetCompositionStringW_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,DWORD dwBufLen,LONG *plCopied,LPVOID pBuf);

  void __RPC_STUB IActiveIMMApp_GetCompositionStringW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetCompositionWindow_Proxy(IActiveIMMApp *This,HIMC hIMC,COMPOSITIONFORM *pCompForm);

  void __RPC_STUB IActiveIMMApp_GetCompositionWindow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetContext_Proxy(IActiveIMMApp *This,HWND hWnd,HIMC *phIMC);

  void __RPC_STUB IActiveIMMApp_GetContext_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetConversionListA_Proxy(IActiveIMMApp *This,HKL hKL,HIMC hIMC,LPSTR pSrc,UINT uBufLen,UINT uFlag,CANDIDATELIST *pDst,UINT *puCopied);

  void __RPC_STUB IActiveIMMApp_GetConversionListA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetConversionListW_Proxy(IActiveIMMApp *This,HKL hKL,HIMC hIMC,LPWSTR pSrc,UINT uBufLen,UINT uFlag,CANDIDATELIST *pDst,UINT *puCopied);

  void __RPC_STUB IActiveIMMApp_GetConversionListW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetConversionStatus_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD *pfdwConversion,DWORD *pfdwSentence);

  void __RPC_STUB IActiveIMMApp_GetConversionStatus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetDefaultIMEWnd_Proxy(IActiveIMMApp *This,HWND hWnd,HWND *phDefWnd);

  void __RPC_STUB IActiveIMMApp_GetDefaultIMEWnd_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetDescriptionA_Proxy(IActiveIMMApp *This,HKL hKL,UINT uBufLen,LPSTR szDescription,UINT *puCopied);

  void __RPC_STUB IActiveIMMApp_GetDescriptionA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetDescriptionW_Proxy(IActiveIMMApp *This,HKL hKL,UINT uBufLen,LPWSTR szDescription,UINT *puCopied);

  void __RPC_STUB IActiveIMMApp_GetDescriptionW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetGuideLineA_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,DWORD dwBufLen,LPSTR pBuf,DWORD *pdwResult);

  void __RPC_STUB IActiveIMMApp_GetGuideLineA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetGuideLineW_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,DWORD dwBufLen,LPWSTR pBuf,DWORD *pdwResult);

  void __RPC_STUB IActiveIMMApp_GetGuideLineW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetIMEFileNameA_Proxy(IActiveIMMApp *This,HKL hKL,UINT uBufLen,LPSTR szFileName,UINT *puCopied);

  void __RPC_STUB IActiveIMMApp_GetIMEFileNameA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetIMEFileNameW_Proxy(IActiveIMMApp *This,HKL hKL,UINT uBufLen,LPWSTR szFileName,UINT *puCopied);

  void __RPC_STUB IActiveIMMApp_GetIMEFileNameW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetOpenStatus_Proxy(IActiveIMMApp *This,HIMC hIMC);

  void __RPC_STUB IActiveIMMApp_GetOpenStatus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetProperty_Proxy(IActiveIMMApp *This,HKL hKL,DWORD fdwIndex,DWORD *pdwProperty);

  void __RPC_STUB IActiveIMMApp_GetProperty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetRegisterWordStyleA_Proxy(IActiveIMMApp *This,HKL hKL,UINT nItem,STYLEBUFA *pStyleBuf,UINT *puCopied);

  void __RPC_STUB IActiveIMMApp_GetRegisterWordStyleA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetRegisterWordStyleW_Proxy(IActiveIMMApp *This,HKL hKL,UINT nItem,STYLEBUFW *pStyleBuf,UINT *puCopied);

  void __RPC_STUB IActiveIMMApp_GetRegisterWordStyleW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetStatusWindowPos_Proxy(IActiveIMMApp *This,HIMC hIMC,POINT *pptPos);

  void __RPC_STUB IActiveIMMApp_GetStatusWindowPos_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetVirtualKey_Proxy(IActiveIMMApp *This,HWND hWnd,UINT *puVirtualKey);

  void __RPC_STUB IActiveIMMApp_GetVirtualKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_InstallIMEA_Proxy(IActiveIMMApp *This,LPSTR szIMEFileName,LPSTR szLayoutText,HKL *phKL);

  void __RPC_STUB IActiveIMMApp_InstallIMEA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_InstallIMEW_Proxy(IActiveIMMApp *This,LPWSTR szIMEFileName,LPWSTR szLayoutText,HKL *phKL);

  void __RPC_STUB IActiveIMMApp_InstallIMEW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_IsIME_Proxy(IActiveIMMApp *This,HKL hKL);

  void __RPC_STUB IActiveIMMApp_IsIME_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_IsUIMessageA_Proxy(IActiveIMMApp *This,HWND hWndIME,UINT msg,WPARAM wParam,LPARAM lParam);

  void __RPC_STUB IActiveIMMApp_IsUIMessageA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_IsUIMessageW_Proxy(IActiveIMMApp *This,HWND hWndIME,UINT msg,WPARAM wParam,LPARAM lParam);

  void __RPC_STUB IActiveIMMApp_IsUIMessageW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_NotifyIME_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD dwAction,DWORD dwIndex,DWORD dwValue);

  void __RPC_STUB IActiveIMMApp_NotifyIME_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_RegisterWordA_Proxy(IActiveIMMApp *This,HKL hKL,LPSTR szReading,DWORD dwStyle,LPSTR szRegister);

  void __RPC_STUB IActiveIMMApp_RegisterWordA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_RegisterWordW_Proxy(IActiveIMMApp *This,HKL hKL,LPWSTR szReading,DWORD dwStyle,LPWSTR szRegister);

  void __RPC_STUB IActiveIMMApp_RegisterWordW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_ReleaseContext_Proxy(IActiveIMMApp *This,HWND hWnd,HIMC hIMC);

  void __RPC_STUB IActiveIMMApp_ReleaseContext_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_SetCandidateWindow_Proxy(IActiveIMMApp *This,HIMC hIMC,CANDIDATEFORM *pCandidate);

  void __RPC_STUB IActiveIMMApp_SetCandidateWindow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_SetCompositionFontA_Proxy(IActiveIMMApp *This,HIMC hIMC,LOGFONTA *plf);

  void __RPC_STUB IActiveIMMApp_SetCompositionFontA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_SetCompositionFontW_Proxy(IActiveIMMApp *This,HIMC hIMC,LOGFONTW *plf);

  void __RPC_STUB IActiveIMMApp_SetCompositionFontW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_SetCompositionStringA_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,LPVOID pComp,DWORD dwCompLen,LPVOID pRead,DWORD dwReadLen);

  void __RPC_STUB IActiveIMMApp_SetCompositionStringA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_SetCompositionStringW_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD dwIndex,LPVOID pComp,DWORD dwCompLen,LPVOID pRead,DWORD dwReadLen);

  void __RPC_STUB IActiveIMMApp_SetCompositionStringW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_SetCompositionWindow_Proxy(IActiveIMMApp *This,HIMC hIMC,COMPOSITIONFORM *pCompForm);

  void __RPC_STUB IActiveIMMApp_SetCompositionWindow_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_SetConversionStatus_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD fdwConversion,DWORD fdwSentence);

  void __RPC_STUB IActiveIMMApp_SetConversionStatus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_SetOpenStatus_Proxy(IActiveIMMApp *This,HIMC hIMC,WINBOOL fOpen);

  void __RPC_STUB IActiveIMMApp_SetOpenStatus_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_SetStatusWindowPos_Proxy(IActiveIMMApp *This,HIMC hIMC,POINT *pptPos);

  void __RPC_STUB IActiveIMMApp_SetStatusWindowPos_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_SimulateHotKey_Proxy(IActiveIMMApp *This,HWND hWnd,DWORD dwHotKeyID);

  void __RPC_STUB IActiveIMMApp_SimulateHotKey_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_UnregisterWordA_Proxy(IActiveIMMApp *This,HKL hKL,LPSTR szReading,DWORD dwStyle,LPSTR szUnregister);

  void __RPC_STUB IActiveIMMApp_UnregisterWordA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_UnregisterWordW_Proxy(IActiveIMMApp *This,HKL hKL,LPWSTR szReading,DWORD dwStyle,LPWSTR szUnregister);

  void __RPC_STUB IActiveIMMApp_UnregisterWordW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_Activate_Proxy(IActiveIMMApp *This,WINBOOL fRestoreLayout);

  void __RPC_STUB IActiveIMMApp_Activate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_Deactivate_Proxy(IActiveIMMApp *This);

  void __RPC_STUB IActiveIMMApp_Deactivate_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_OnDefWindowProc_Proxy(IActiveIMMApp *This,HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,LRESULT *plResult);

  void __RPC_STUB IActiveIMMApp_OnDefWindowProc_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_FilterClientWindows_Proxy(IActiveIMMApp *This,ATOM *aaClassList,UINT uSize);

  void __RPC_STUB IActiveIMMApp_FilterClientWindows_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetCodePageA_Proxy(IActiveIMMApp *This,HKL hKL,UINT *uCodePage);

  void __RPC_STUB IActiveIMMApp_GetCodePageA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetLangId_Proxy(IActiveIMMApp *This,HKL hKL,LANGID *plid);

  void __RPC_STUB IActiveIMMApp_GetLangId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_AssociateContextEx_Proxy(IActiveIMMApp *This,HWND hWnd,HIMC hIMC,DWORD dwFlags);

  void __RPC_STUB IActiveIMMApp_AssociateContextEx_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_DisableIME_Proxy(IActiveIMMApp *This,DWORD idThread);

  void __RPC_STUB IActiveIMMApp_DisableIME_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetImeMenuItemsA_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD dwFlags,DWORD dwType,IMEMENUITEMINFOA *pImeParentMenu,IMEMENUITEMINFOA *pImeMenu,DWORD dwSize,DWORD *pdwResult);

  void __RPC_STUB IActiveIMMApp_GetImeMenuItemsA_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_GetImeMenuItemsW_Proxy(IActiveIMMApp *This,HIMC hIMC,DWORD dwFlags,DWORD dwType,IMEMENUITEMINFOW *pImeParentMenu,IMEMENUITEMINFOW *pImeMenu,DWORD dwSize,DWORD *pdwResult);

  void __RPC_STUB IActiveIMMApp_GetImeMenuItemsW_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IActiveIMMApp_EnumInputContext_Proxy(IActiveIMMApp *This,DWORD idThread,IEnumInputContext **ppEnum);

  void __RPC_STUB IActiveIMMApp_EnumInputContext_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISegmentList_INTERFACE_DEFINED__
#define __ISegmentList_INTERFACE_DEFINED__

  EXTERN_C const IID IID_ISegmentList;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct ISegmentList : public IUnknown
  {
  public:
    virtual HRESULT WINAPI CreateIterator(ISegmentListIterator **ppIIter) = 0;

    virtual HRESULT WINAPI GetType(SELECTION_TYPE *peType) = 0;

    virtual HRESULT WINAPI IsEmpty(WINBOOL *pfEmpty) = 0;

  };
#else

  typedef struct ISegmentListVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(ISegmentList *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(ISegmentList *This);

      ULONG (WINAPI *Release)(ISegmentList *This);

      HRESULT (WINAPI *CreateIterator)(ISegmentList *This,ISegmentListIterator **ppIIter);

      HRESULT (WINAPI *GetType)(ISegmentList *This,SELECTION_TYPE *peType);

      HRESULT (WINAPI *IsEmpty)(ISegmentList *This,WINBOOL *pfEmpty);

    END_INTERFACE
  } ISegmentListVtbl;

  interface ISegmentList
  {
    CONST_VTBL struct ISegmentListVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI ISegmentList_CreateIterator_Proxy(ISegmentList *This,ISegmentListIterator **ppIIter);

  void __RPC_STUB ISegmentList_CreateIterator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ISegmentList_GetType_Proxy(ISegmentList *This,SELECTION_TYPE *peType);

  void __RPC_STUB ISegmentList_GetType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ISegmentList_IsEmpty_Proxy(ISegmentList *This,WINBOOL *pfEmpty);

  void __RPC_STUB ISegmentList_IsEmpty_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISegmentListIterator_INTERFACE_DEFINED__
#define __ISegmentListIterator_INTERFACE_DEFINED__

  EXTERN_C const IID IID_ISegmentListIterator;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct ISegmentListIterator : public IUnknown
  {
  public:
    virtual HRESULT WINAPI Current(ISegment **ppISegment) = 0;

    virtual HRESULT WINAPI First(void) = 0;

    virtual HRESULT WINAPI IsDone(void) = 0;

    virtual HRESULT WINAPI Advance(void) = 0;

  };
#else

  typedef struct ISegmentListIteratorVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(ISegmentListIterator *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(ISegmentListIterator *This);

      ULONG (WINAPI *Release)(ISegmentListIterator *This);

      HRESULT (WINAPI *Current)(ISegmentListIterator *This,ISegment **ppISegment);

      HRESULT (WINAPI *First)(ISegmentListIterator *This);

      HRESULT (WINAPI *IsDone)(ISegmentListIterator *This);

      HRESULT (WINAPI *Advance)(ISegmentListIterator *This);

    END_INTERFACE
  } ISegmentListIteratorVtbl;

  interface ISegmentListIterator
  {
    CONST_VTBL struct ISegmentListIteratorVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI ISegmentListIterator_Current_Proxy(ISegmentListIterator *This,ISegment **ppISegment);

  void __RPC_STUB ISegmentListIterator_Current_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ISegmentListIterator_First_Proxy(ISegmentListIterator *This);

  void __RPC_STUB ISegmentListIterator_First_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ISegmentListIterator_IsDone_Proxy(ISegmentListIterator *This);

  void __RPC_STUB ISegmentListIterator_IsDone_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ISegmentListIterator_Advance_Proxy(ISegmentListIterator *This);

  void __RPC_STUB ISegmentListIterator_Advance_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLCaret_INTERFACE_DEFINED__
#define __IHTMLCaret_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLCaret;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLCaret : public IUnknown
  {
  public:
    virtual HRESULT WINAPI MoveCaretToPointer(IDisplayPointer *pDispPointer,WINBOOL fScrollIntoView,CARET_DIRECTION eDir) = 0;

    virtual HRESULT WINAPI MoveCaretToPointerEx(IDisplayPointer *pDispPointer,WINBOOL fVisible,WINBOOL fScrollIntoView,CARET_DIRECTION eDir) = 0;

    virtual HRESULT WINAPI MoveMarkupPointerToCaret(IMarkupPointer *pIMarkupPointer) = 0;

    virtual HRESULT WINAPI MoveDisplayPointerToCaret(IDisplayPointer *pDispPointer) = 0;

    virtual HRESULT WINAPI IsVisible(WINBOOL *pIsVisible) = 0;

    virtual HRESULT WINAPI Show(WINBOOL fScrollIntoView) = 0;

    virtual HRESULT WINAPI Hide(void) = 0;

    virtual HRESULT WINAPI InsertText(OLECHAR *pText,LONG lLen) = 0;

    virtual HRESULT WINAPI ScrollIntoView(void) = 0;

    virtual HRESULT WINAPI GetLocation(POINT *pPoint,WINBOOL fTranslate) = 0;

    virtual HRESULT WINAPI GetCaretDirection(CARET_DIRECTION *peDir) = 0;

    virtual HRESULT WINAPI SetCaretDirection(CARET_DIRECTION eDir) = 0;

  };
#else

  typedef struct IHTMLCaretVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLCaret *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLCaret *This);

      ULONG (WINAPI *Release)(IHTMLCaret *This);

      HRESULT (WINAPI *MoveCaretToPointer)(IHTMLCaret *This,IDisplayPointer *pDispPointer,WINBOOL fScrollIntoView,CARET_DIRECTION eDir);

      HRESULT (WINAPI *MoveCaretToPointerEx)(IHTMLCaret *This,IDisplayPointer *pDispPointer,WINBOOL fVisible,WINBOOL fScrollIntoView,CARET_DIRECTION eDir);

      HRESULT (WINAPI *MoveMarkupPointerToCaret)(IHTMLCaret *This,IMarkupPointer *pIMarkupPointer);

      HRESULT (WINAPI *MoveDisplayPointerToCaret)(IHTMLCaret *This,IDisplayPointer *pDispPointer);

      HRESULT (WINAPI *IsVisible)(IHTMLCaret *This,WINBOOL *pIsVisible);

      HRESULT (WINAPI *Show)(IHTMLCaret *This,WINBOOL fScrollIntoView);

      HRESULT (WINAPI *Hide)(IHTMLCaret *This);

      HRESULT (WINAPI *InsertText)(IHTMLCaret *This,OLECHAR *pText,LONG lLen);

      HRESULT (WINAPI *ScrollIntoView)(IHTMLCaret *This);

      HRESULT (WINAPI *GetLocation)(IHTMLCaret *This,POINT *pPoint,WINBOOL fTranslate);

      HRESULT (WINAPI *GetCaretDirection)(IHTMLCaret *This,CARET_DIRECTION *peDir);

      HRESULT (WINAPI *SetCaretDirection)(IHTMLCaret *This,CARET_DIRECTION eDir);

    END_INTERFACE
  } IHTMLCaretVtbl;

  interface IHTMLCaret
  {
    CONST_VTBL struct IHTMLCaretVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLCaret_MoveCaretToPointer_Proxy(IHTMLCaret *This,IDisplayPointer *pDispPointer,WINBOOL fScrollIntoView,CARET_DIRECTION eDir);

  void __RPC_STUB IHTMLCaret_MoveCaretToPointer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCaret_MoveCaretToPointerEx_Proxy(IHTMLCaret *This,IDisplayPointer *pDispPointer,WINBOOL fVisible,WINBOOL fScrollIntoView,CARET_DIRECTION eDir);

  void __RPC_STUB IHTMLCaret_MoveCaretToPointerEx_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCaret_MoveMarkupPointerToCaret_Proxy(IHTMLCaret *This,IMarkupPointer *pIMarkupPointer);

  void __RPC_STUB IHTMLCaret_MoveMarkupPointerToCaret_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCaret_MoveDisplayPointerToCaret_Proxy(IHTMLCaret *This,IDisplayPointer *pDispPointer);

  void __RPC_STUB IHTMLCaret_MoveDisplayPointerToCaret_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCaret_IsVisible_Proxy(IHTMLCaret *This,WINBOOL *pIsVisible);

  void __RPC_STUB IHTMLCaret_IsVisible_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCaret_Show_Proxy(IHTMLCaret *This,WINBOOL fScrollIntoView);

  void __RPC_STUB IHTMLCaret_Show_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCaret_Hide_Proxy(IHTMLCaret *This);

  void __RPC_STUB IHTMLCaret_Hide_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCaret_InsertText_Proxy(IHTMLCaret *This,OLECHAR *pText,LONG lLen);

  void __RPC_STUB IHTMLCaret_InsertText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCaret_ScrollIntoView_Proxy(IHTMLCaret *This);

  void __RPC_STUB IHTMLCaret_ScrollIntoView_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCaret_GetLocation_Proxy(IHTMLCaret *This,POINT *pPoint,WINBOOL fTranslate);

  void __RPC_STUB IHTMLCaret_GetLocation_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCaret_GetCaretDirection_Proxy(IHTMLCaret *This,CARET_DIRECTION *peDir);

  void __RPC_STUB IHTMLCaret_GetCaretDirection_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLCaret_SetCaretDirection_Proxy(IHTMLCaret *This,CARET_DIRECTION eDir);

  void __RPC_STUB IHTMLCaret_SetCaretDirection_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISegment_INTERFACE_DEFINED__
#define __ISegment_INTERFACE_DEFINED__

  EXTERN_C const IID IID_ISegment;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct ISegment : public IUnknown
  {
  public:
    virtual HRESULT WINAPI GetPointers(IMarkupPointer *pIStart,IMarkupPointer *pIEnd) = 0;

  };
#else

  typedef struct ISegmentVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(ISegment *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(ISegment *This);

      ULONG (WINAPI *Release)(ISegment *This);

      HRESULT (WINAPI *GetPointers)(ISegment *This,IMarkupPointer *pIStart,IMarkupPointer *pIEnd);

    END_INTERFACE
  } ISegmentVtbl;

  interface ISegment
  {
    CONST_VTBL struct ISegmentVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define ISegment_GetPointers(This,pIStart,pIEnd) (This)->lpVtbl->GetPointers(This,pIStart,pIEnd)
#endif
#endif

  HRESULT WINAPI ISegment_GetPointers_Proxy(ISegment *This,IMarkupPointer *pIStart,IMarkupPointer *pIEnd);

  void __RPC_STUB ISegment_GetPointers_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementSegment_INTERFACE_DEFINED__
#define __IElementSegment_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementSegment;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementSegment : public ISegment
  {
  public:
    virtual HRESULT WINAPI GetElement(IHTMLElement **ppIElement) = 0;

    virtual HRESULT WINAPI SetPrimary(WINBOOL fPrimary) = 0;

    virtual HRESULT WINAPI IsPrimary(WINBOOL *pfPrimary) = 0;

  };
#else

  typedef struct IElementSegmentVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementSegment *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementSegment *This);

      ULONG (WINAPI *Release)(IElementSegment *This);

      HRESULT (WINAPI *GetPointers)(IElementSegment *This,IMarkupPointer *pIStart,IMarkupPointer *pIEnd);

      HRESULT (WINAPI *GetElement)(IElementSegment *This,IHTMLElement **ppIElement);

      HRESULT (WINAPI *SetPrimary)(IElementSegment *This,WINBOOL fPrimary);

      HRESULT (WINAPI *IsPrimary)(IElementSegment *This,WINBOOL *pfPrimary);

    END_INTERFACE
  } IElementSegmentVtbl;

  interface IElementSegment
  {
    CONST_VTBL struct IElementSegmentVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IElementSegment_GetPointers(This,pIStart,pIEnd) (This)->lpVtbl->GetPointers(This,pIStart,pIEnd)

#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)
#endif
#endif

  HRESULT WINAPI IElementSegment_GetElement_Proxy(IElementSegment *This,IHTMLElement **ppIElement);

  void __RPC_STUB IElementSegment_GetElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IElementSegment_SetPrimary_Proxy(IElementSegment *This,WINBOOL fPrimary);

  void __RPC_STUB IElementSegment_SetPrimary_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IElementSegment_IsPrimary_Proxy(IElementSegment *This,WINBOOL *pfPrimary);

  void __RPC_STUB IElementSegment_IsPrimary_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHighlightSegment_INTERFACE_DEFINED__
#define __IHighlightSegment_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHighlightSegment;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHighlightSegment : public ISegment
  {
  public:
  };
#else

  typedef struct IHighlightSegmentVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHighlightSegment *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHighlightSegment *This);

      ULONG (WINAPI *Release)(IHighlightSegment *This);

      HRESULT (WINAPI *GetPointers)(IHighlightSegment *This,IMarkupPointer *pIStart,IMarkupPointer *pIEnd);

    END_INTERFACE
  } IHighlightSegmentVtbl;

  interface IHighlightSegment
  {
    CONST_VTBL struct IHighlightSegmentVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IHighlightSegment_GetPointers(This,pIStart,pIEnd) (This)->lpVtbl->GetPointers(This,pIStart,pIEnd)
#endif
#endif
#endif

#ifndef __IHighlightRenderingServices_INTERFACE_DEFINED__
#define __IHighlightRenderingServices_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHighlightRenderingServices;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHighlightRenderingServices : public IUnknown
  {
  public:
    virtual HRESULT WINAPI AddSegment(IDisplayPointer *pDispPointerStart,IDisplayPointer *pDispPointerEnd,IHTMLRenderStyle *pIRenderStyle,IHighlightSegment **ppISegment) = 0;

    virtual HRESULT WINAPI MoveSegmentToPointers(IHighlightSegment *pISegment,IDisplayPointer *pDispPointerStart,IDisplayPointer *pDispPointerEnd) = 0;

    virtual HRESULT WINAPI RemoveSegment(IHighlightSegment *pISegment) = 0;

  };
#else

  typedef struct IHighlightRenderingServicesVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHighlightRenderingServices *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHighlightRenderingServices *This);

      ULONG (WINAPI *Release)(IHighlightRenderingServices *This);

      HRESULT (WINAPI *AddSegment)(IHighlightRenderingServices *This,IDisplayPointer *pDispPointerStart,IDisplayPointer *pDispPointerEnd,IHTMLRenderStyle *pIRenderStyle,IHighlightSegment **ppISegment);

      HRESULT (WINAPI *MoveSegmentToPointers)(IHighlightRenderingServices *This,IHighlightSegment *pISegment,IDisplayPointer *pDispPointerStart,IDisplayPointer *pDispPointerEnd);

      HRESULT (WINAPI *RemoveSegment)(IHighlightRenderingServices *This,IHighlightSegment *pISegment);

    END_INTERFACE
  } IHighlightRenderingServicesVtbl;

  interface IHighlightRenderingServices
  {
    CONST_VTBL struct IHighlightRenderingServicesVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHighlightRenderingServices_AddSegment_Proxy(IHighlightRenderingServices *This,IDisplayPointer *pDispPointerStart,IDisplayPointer *pDispPointerEnd,IHTMLRenderStyle *pIRenderStyle,IHighlightSegment **ppISegment);

  void __RPC_STUB IHighlightRenderingServices_AddSegment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHighlightRenderingServices_MoveSegmentToPointers_Proxy(IHighlightRenderingServices *This,IHighlightSegment *pISegment,IDisplayPointer *pDispPointerStart,IDisplayPointer *pDispPointerEnd);

  void __RPC_STUB IHighlightRenderingServices_MoveSegmentToPointers_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHighlightRenderingServices_RemoveSegment_Proxy(IHighlightRenderingServices *This,IHighlightSegment *pISegment);

  void __RPC_STUB IHighlightRenderingServices_RemoveSegment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ILineInfo_INTERFACE_DEFINED__
#define __ILineInfo_INTERFACE_DEFINED__

  EXTERN_C const IID IID_ILineInfo;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct ILineInfo : public IUnknown
  {
  public:
    virtual HRESULT WINAPI get_x(long *p) = 0;

    virtual HRESULT WINAPI get_baseLine(long *p) = 0;

    virtual HRESULT WINAPI get_textDescent(long *p) = 0;

    virtual HRESULT WINAPI get_textHeight(long *p) = 0;

    virtual HRESULT WINAPI get_lineDirection(LONG *p) = 0;

  };
#else

  typedef struct ILineInfoVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(ILineInfo *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(ILineInfo *This);

      ULONG (WINAPI *Release)(ILineInfo *This);

      HRESULT (WINAPI *get_x)(ILineInfo *This,long *p);

      HRESULT (WINAPI *get_baseLine)(ILineInfo *This,long *p);

      HRESULT (WINAPI *get_textDescent)(ILineInfo *This,long *p);

      HRESULT (WINAPI *get_textHeight)(ILineInfo *This,long *p);

      HRESULT (WINAPI *get_lineDirection)(ILineInfo *This,LONG *p);

    END_INTERFACE
  } ILineInfoVtbl;

  interface ILineInfo
  {
    CONST_VTBL struct ILineInfoVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI ILineInfo_get_x_Proxy(ILineInfo *This,long *p);

  void __RPC_STUB ILineInfo_get_x_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ILineInfo_get_baseLine_Proxy(ILineInfo *This,long *p);

  void __RPC_STUB ILineInfo_get_baseLine_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ILineInfo_get_textDescent_Proxy(ILineInfo *This,long *p);

  void __RPC_STUB ILineInfo_get_textDescent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ILineInfo_get_textHeight_Proxy(ILineInfo *This,long *p);

  void __RPC_STUB ILineInfo_get_textHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ILineInfo_get_lineDirection_Proxy(ILineInfo *This,LONG *p);

  void __RPC_STUB ILineInfo_get_lineDirection_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IDisplayPointer_INTERFACE_DEFINED__
#define __IDisplayPointer_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IDisplayPointer;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IDisplayPointer : public IUnknown
  {
  public:
    virtual HRESULT WINAPI MoveToPoint(POINT ptPoint,COORD_SYSTEM eCoordSystem,IHTMLElement *pElementContext,DWORD dwHitTestOptions,DWORD *pdwHitTestResults) = 0;

    virtual HRESULT WINAPI MoveUnit(DISPLAY_MOVEUNIT eMoveUnit,LONG lXPos) = 0;

    virtual HRESULT WINAPI PositionMarkupPointer(IMarkupPointer *pMarkupPointer) = 0;

    virtual HRESULT WINAPI MoveToPointer(IDisplayPointer *pDispPointer) = 0;

    virtual HRESULT WINAPI SetPointerGravity(POINTER_GRAVITY eGravity) = 0;

    virtual HRESULT WINAPI GetPointerGravity(POINTER_GRAVITY *peGravity) = 0;

    virtual HRESULT WINAPI SetDisplayGravity(DISPLAY_GRAVITY eGravity) = 0;

    virtual HRESULT WINAPI GetDisplayGravity(DISPLAY_GRAVITY *peGravity) = 0;

    virtual HRESULT WINAPI IsPositioned(WINBOOL *pfPositioned) = 0;

    virtual HRESULT WINAPI Unposition(void) = 0;

    virtual HRESULT WINAPI IsEqualTo(IDisplayPointer *pDispPointer,WINBOOL *pfIsEqual) = 0;

    virtual HRESULT WINAPI IsLeftOf(IDisplayPointer *pDispPointer,WINBOOL *pfIsLeftOf) = 0;

    virtual HRESULT WINAPI IsRightOf(IDisplayPointer *pDispPointer,WINBOOL *pfIsRightOf) = 0;

    virtual HRESULT WINAPI IsAtBOL(WINBOOL *pfBOL) = 0;

    virtual HRESULT WINAPI MoveToMarkupPointer(IMarkupPointer *pPointer,IDisplayPointer *pDispLineContext) = 0;

    virtual HRESULT WINAPI ScrollIntoView(void) = 0;

    virtual HRESULT WINAPI GetLineInfo(ILineInfo **ppLineInfo) = 0;

    virtual HRESULT WINAPI GetFlowElement(IHTMLElement **ppLayoutElement) = 0;

    virtual HRESULT WINAPI QueryBreaks(DWORD *pdwBreaks) = 0;

  };
#else

  typedef struct IDisplayPointerVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IDisplayPointer *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IDisplayPointer *This);

      ULONG (WINAPI *Release)(IDisplayPointer *This);

      HRESULT (WINAPI *MoveToPoint)(IDisplayPointer *This,POINT ptPoint,COORD_SYSTEM eCoordSystem,IHTMLElement *pElementContext,DWORD dwHitTestOptions,DWORD *pdwHitTestResults);

      HRESULT (WINAPI *MoveUnit)(IDisplayPointer *This,DISPLAY_MOVEUNIT eMoveUnit,LONG lXPos);

      HRESULT (WINAPI *PositionMarkupPointer)(IDisplayPointer *This,IMarkupPointer *pMarkupPointer);

      HRESULT (WINAPI *MoveToPointer)(IDisplayPointer *This,IDisplayPointer *pDispPointer);

      HRESULT (WINAPI *SetPointerGravity)(IDisplayPointer *This,POINTER_GRAVITY eGravity);

      HRESULT (WINAPI *GetPointerGravity)(IDisplayPointer *This,POINTER_GRAVITY *peGravity);

      HRESULT (WINAPI *SetDisplayGravity)(IDisplayPointer *This,DISPLAY_GRAVITY eGravity);

      HRESULT (WINAPI *GetDisplayGravity)(IDisplayPointer *This,DISPLAY_GRAVITY *peGravity);

      HRESULT (WINAPI *IsPositioned)(IDisplayPointer *This,WINBOOL *pfPositioned);

      HRESULT (WINAPI *Unposition)(IDisplayPointer *This);

      HRESULT (WINAPI *IsEqualTo)(IDisplayPointer *This,IDisplayPointer *pDispPointer,WINBOOL *pfIsEqual);

      HRESULT (WINAPI *IsLeftOf)(IDisplayPointer *This,IDisplayPointer *pDispPointer,WINBOOL *pfIsLeftOf);

      HRESULT (WINAPI *IsRightOf)(IDisplayPointer *This,IDisplayPointer *pDispPointer,WINBOOL *pfIsRightOf);

      HRESULT (WINAPI *IsAtBOL)(IDisplayPointer *This,WINBOOL *pfBOL);

      HRESULT (WINAPI *MoveToMarkupPointer)(IDisplayPointer *This,IMarkupPointer *pPointer,IDisplayPointer *pDispLineContext);

      HRESULT (WINAPI *ScrollIntoView)(IDisplayPointer *This);

      HRESULT (WINAPI *GetLineInfo)(IDisplayPointer *This,ILineInfo **ppLineInfo);

      HRESULT (WINAPI *GetFlowElement)(IDisplayPointer *This,IHTMLElement **ppLayoutElement);

      HRESULT (WINAPI *QueryBreaks)(IDisplayPointer *This,DWORD *pdwBreaks);

    END_INTERFACE
  } IDisplayPointerVtbl;

  interface IDisplayPointer
  {
    CONST_VTBL struct IDisplayPointerVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IDisplayPointer_MoveToPoint_Proxy(IDisplayPointer *This,POINT ptPoint,COORD_SYSTEM eCoordSystem,IHTMLElement *pElementContext,DWORD dwHitTestOptions,DWORD *pdwHitTestResults);

  void __RPC_STUB IDisplayPointer_MoveToPoint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_MoveUnit_Proxy(IDisplayPointer *This,DISPLAY_MOVEUNIT eMoveUnit,LONG lXPos);

  void __RPC_STUB IDisplayPointer_MoveUnit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_PositionMarkupPointer_Proxy(IDisplayPointer *This,IMarkupPointer *pMarkupPointer);

  void __RPC_STUB IDisplayPointer_PositionMarkupPointer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_MoveToPointer_Proxy(IDisplayPointer *This,IDisplayPointer *pDispPointer);

  void __RPC_STUB IDisplayPointer_MoveToPointer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_SetPointerGravity_Proxy(IDisplayPointer *This,POINTER_GRAVITY eGravity);

  void __RPC_STUB IDisplayPointer_SetPointerGravity_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_GetPointerGravity_Proxy(IDisplayPointer *This,POINTER_GRAVITY *peGravity);

  void __RPC_STUB IDisplayPointer_GetPointerGravity_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_SetDisplayGravity_Proxy(IDisplayPointer *This,DISPLAY_GRAVITY eGravity);

  void __RPC_STUB IDisplayPointer_SetDisplayGravity_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_GetDisplayGravity_Proxy(IDisplayPointer *This,DISPLAY_GRAVITY *peGravity);

  void __RPC_STUB IDisplayPointer_GetDisplayGravity_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_IsPositioned_Proxy(IDisplayPointer *This,WINBOOL *pfPositioned);

  void __RPC_STUB IDisplayPointer_IsPositioned_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_Unposition_Proxy(IDisplayPointer *This);

  void __RPC_STUB IDisplayPointer_Unposition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_IsEqualTo_Proxy(IDisplayPointer *This,IDisplayPointer *pDispPointer,WINBOOL *pfIsEqual);

  void __RPC_STUB IDisplayPointer_IsEqualTo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_IsLeftOf_Proxy(IDisplayPointer *This,IDisplayPointer *pDispPointer,WINBOOL *pfIsLeftOf);

  void __RPC_STUB IDisplayPointer_IsLeftOf_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_IsRightOf_Proxy(IDisplayPointer *This,IDisplayPointer *pDispPointer,WINBOOL *pfIsRightOf);

  void __RPC_STUB IDisplayPointer_IsRightOf_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_IsAtBOL_Proxy(IDisplayPointer *This,WINBOOL *pfBOL);

  void __RPC_STUB IDisplayPointer_IsAtBOL_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_MoveToMarkupPointer_Proxy(IDisplayPointer *This,IMarkupPointer *pPointer,IDisplayPointer *pDispLineContext);

  void __RPC_STUB IDisplayPointer_MoveToMarkupPointer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_ScrollIntoView_Proxy(IDisplayPointer *This);

  void __RPC_STUB IDisplayPointer_ScrollIntoView_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_GetLineInfo_Proxy(IDisplayPointer *This,ILineInfo **ppLineInfo);

  void __RPC_STUB IDisplayPointer_GetLineInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_GetFlowElement_Proxy(IDisplayPointer *This,IHTMLElement **ppLayoutElement);

  void __RPC_STUB IDisplayPointer_GetFlowElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayPointer_QueryBreaks_Proxy(IDisplayPointer *This,DWORD *pdwBreaks);

  void __RPC_STUB IDisplayPointer_QueryBreaks_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IDisplayServices_INTERFACE_DEFINED__
#define __IDisplayServices_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IDisplayServices;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IDisplayServices : public IUnknown
  {
  public:
    virtual HRESULT WINAPI CreateDisplayPointer(IDisplayPointer **ppDispPointer) = 0;

    virtual HRESULT WINAPI TransformRect(RECT *pRect,COORD_SYSTEM eSource,COORD_SYSTEM eDestination,IHTMLElement *pIElement) = 0;

    virtual HRESULT WINAPI TransformPoint(POINT *pPoint,COORD_SYSTEM eSource,COORD_SYSTEM eDestination,IHTMLElement *pIElement) = 0;

    virtual HRESULT WINAPI GetCaret(IHTMLCaret **ppCaret) = 0;

    virtual HRESULT WINAPI GetComputedStyle(IMarkupPointer *pPointer,IHTMLComputedStyle **ppComputedStyle) = 0;

    virtual HRESULT WINAPI ScrollRectIntoView(IHTMLElement *pIElement,RECT rect) = 0;

    virtual HRESULT WINAPI HasFlowLayout(IHTMLElement *pIElement,WINBOOL *pfHasFlowLayout) = 0;

  };
#else

  typedef struct IDisplayServicesVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IDisplayServices *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IDisplayServices *This);

      ULONG (WINAPI *Release)(IDisplayServices *This);

      HRESULT (WINAPI *CreateDisplayPointer)(IDisplayServices *This,IDisplayPointer **ppDispPointer);

      HRESULT (WINAPI *TransformRect)(IDisplayServices *This,RECT *pRect,COORD_SYSTEM eSource,COORD_SYSTEM eDestination,IHTMLElement *pIElement);

      HRESULT (WINAPI *TransformPoint)(IDisplayServices *This,POINT *pPoint,COORD_SYSTEM eSource,COORD_SYSTEM eDestination,IHTMLElement *pIElement);

      HRESULT (WINAPI *GetCaret)(IDisplayServices *This,IHTMLCaret **ppCaret);

      HRESULT (WINAPI *GetComputedStyle)(IDisplayServices *This,IMarkupPointer *pPointer,IHTMLComputedStyle **ppComputedStyle);

      HRESULT (WINAPI *ScrollRectIntoView)(IDisplayServices *This,IHTMLElement *pIElement,RECT rect);

      HRESULT (WINAPI *HasFlowLayout)(IDisplayServices *This,IHTMLElement *pIElement,WINBOOL *pfHasFlowLayout);

    END_INTERFACE
  } IDisplayServicesVtbl;

  interface IDisplayServices
  {
    CONST_VTBL struct IDisplayServicesVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IDisplayServices_CreateDisplayPointer_Proxy(IDisplayServices *This,IDisplayPointer **ppDispPointer);

  void __RPC_STUB IDisplayServices_CreateDisplayPointer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayServices_TransformRect_Proxy(IDisplayServices *This,RECT *pRect,COORD_SYSTEM eSource,COORD_SYSTEM eDestination,IHTMLElement *pIElement);

  void __RPC_STUB IDisplayServices_TransformRect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayServices_TransformPoint_Proxy(IDisplayServices *This,POINT *pPoint,COORD_SYSTEM eSource,COORD_SYSTEM eDestination,IHTMLElement *pIElement);

  void __RPC_STUB IDisplayServices_TransformPoint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayServices_GetCaret_Proxy(IDisplayServices *This,IHTMLCaret **ppCaret);

  void __RPC_STUB IDisplayServices_GetCaret_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayServices_GetComputedStyle_Proxy(IDisplayServices *This,IMarkupPointer *pPointer,IHTMLComputedStyle **ppComputedStyle);

  void __RPC_STUB IDisplayServices_GetComputedStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayServices_ScrollRectIntoView_Proxy(IDisplayServices *This,IHTMLElement *pIElement,RECT rect);

  void __RPC_STUB IDisplayServices_ScrollRectIntoView_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IDisplayServices_HasFlowLayout_Proxy(IDisplayServices *This,IHTMLElement *pIElement,WINBOOL *pfHasFlowLayout);

  void __RPC_STUB IDisplayServices_HasFlowLayout_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHtmlDlgSafeHelper_INTERFACE_DEFINED__
#define __IHtmlDlgSafeHelper_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHtmlDlgSafeHelper;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHtmlDlgSafeHelper : public IDispatch
  {
  public:
    virtual HRESULT WINAPI choosecolordlg(VARIANT initColor,VARIANT *rgbColor) = 0;

    virtual HRESULT WINAPI getCharset(BSTR fontName,VARIANT *charset) = 0;

    virtual HRESULT WINAPI get_Fonts(IDispatch **p) = 0;

    virtual HRESULT WINAPI get_BlockFormats(IDispatch **p) = 0;

  };
#else

  typedef struct IHtmlDlgSafeHelperVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHtmlDlgSafeHelper *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHtmlDlgSafeHelper *This);

      ULONG (WINAPI *Release)(IHtmlDlgSafeHelper *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHtmlDlgSafeHelper *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHtmlDlgSafeHelper *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *choosecolordlg)(IHtmlDlgSafeHelper *This,VARIANT initColor,VARIANT *rgbColor);

      HRESULT (WINAPI *getCharset)(IHtmlDlgSafeHelper *This,BSTR fontName,VARIANT *charset);

      HRESULT (WINAPI *get_Fonts)(IHtmlDlgSafeHelper *This,IDispatch **p);

      HRESULT (WINAPI *get_BlockFormats)(IHtmlDlgSafeHelper *This,IDispatch **p);

    END_INTERFACE
  } IHtmlDlgSafeHelperVtbl;

  interface IHtmlDlgSafeHelper
  {
    CONST_VTBL struct IHtmlDlgSafeHelperVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHtmlDlgSafeHelper_choosecolordlg_Proxy(IHtmlDlgSafeHelper *This,VARIANT initColor,VARIANT *rgbColor);

  void __RPC_STUB IHtmlDlgSafeHelper_choosecolordlg_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHtmlDlgSafeHelper_getCharset_Proxy(IHtmlDlgSafeHelper *This,BSTR fontName,VARIANT *charset);

  void __RPC_STUB IHtmlDlgSafeHelper_getCharset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHtmlDlgSafeHelper_get_Fonts_Proxy(IHtmlDlgSafeHelper *This,IDispatch **p);

  void __RPC_STUB IHtmlDlgSafeHelper_get_Fonts_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHtmlDlgSafeHelper_get_BlockFormats_Proxy(IHtmlDlgSafeHelper *This,IDispatch **p);

  void __RPC_STUB IHtmlDlgSafeHelper_get_BlockFormats_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IBlockFormats_INTERFACE_DEFINED__
#define __IBlockFormats_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IBlockFormats;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IBlockFormats : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get__NewEnum(IUnknown **p) = 0;

    virtual HRESULT WINAPI get_Count(long *p) = 0;

    virtual HRESULT WINAPI Item(VARIANT *pvarIndex,BSTR *pbstrBlockFormat) = 0;

  };
#else

  typedef struct IBlockFormatsVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IBlockFormats *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IBlockFormats *This);

      ULONG (WINAPI *Release)(IBlockFormats *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IBlockFormats *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IBlockFormats *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get__NewEnum)(IBlockFormats *This,IUnknown **p);

      HRESULT (WINAPI *get_Count)(IBlockFormats *This,long *p);

      HRESULT (WINAPI *Item)(IBlockFormats *This,VARIANT *pvarIndex,BSTR *pbstrBlockFormat);

    END_INTERFACE
  } IBlockFormatsVtbl;

  interface IBlockFormats
  {
    CONST_VTBL struct IBlockFormatsVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IBlockFormats_get__NewEnum_Proxy(IBlockFormats *This,IUnknown **p);

  void __RPC_STUB IBlockFormats_get__NewEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IBlockFormats_get_Count_Proxy(IBlockFormats *This,long *p);

  void __RPC_STUB IBlockFormats_get_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IBlockFormats_Item_Proxy(IBlockFormats *This,VARIANT *pvarIndex,BSTR *pbstrBlockFormat);

  void __RPC_STUB IBlockFormats_Item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IFontNames_INTERFACE_DEFINED__
#define __IFontNames_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IFontNames;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IFontNames : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get__NewEnum(IUnknown **p) = 0;

    virtual HRESULT WINAPI get_Count(long *p) = 0;

    virtual HRESULT WINAPI Item(VARIANT *pvarIndex,BSTR *pbstrFontName) = 0;

  };
#else

  typedef struct IFontNamesVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IFontNames *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IFontNames *This);

      ULONG (WINAPI *Release)(IFontNames *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IFontNames *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IFontNames *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get__NewEnum)(IFontNames *This,IUnknown **p);

      HRESULT (WINAPI *get_Count)(IFontNames *This,long *p);

      HRESULT (WINAPI *Item)(IFontNames *This,VARIANT *pvarIndex,BSTR *pbstrFontName);

    END_INTERFACE
  } IFontNamesVtbl;

  interface IFontNames
  {
    CONST_VTBL struct IFontNamesVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IFontNames_get__NewEnum_Proxy(IFontNames *This,IUnknown **p);

  void __RPC_STUB IFontNames_get__NewEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IFontNames_get_Count_Proxy(IFontNames *This,long *p);

  void __RPC_STUB IFontNames_get_Count_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IFontNames_Item_Proxy(IFontNames *This,VARIANT *pvarIndex,BSTR *pbstrFontName);

  void __RPC_STUB IFontNames_Item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ICSSFilter_INTERFACE_DEFINED__
#define __ICSSFilter_INTERFACE_DEFINED__

  EXTERN_C const IID IID_ICSSFilter;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct ICSSFilter : public IUnknown
  {
  public:
    virtual HRESULT WINAPI SetSite(ICSSFilterSite *pSink) = 0;

    virtual HRESULT WINAPI OnAmbientPropertyChange(LONG dispid) = 0;

  };
#else

  typedef struct ICSSFilterVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(ICSSFilter *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(ICSSFilter *This);

      ULONG (WINAPI *Release)(ICSSFilter *This);

      HRESULT (WINAPI *SetSite)(ICSSFilter *This,ICSSFilterSite *pSink);

      HRESULT (WINAPI *OnAmbientPropertyChange)(ICSSFilter *This,LONG dispid);

    END_INTERFACE
  } ICSSFilterVtbl;

  interface ICSSFilter
  {
    CONST_VTBL struct ICSSFilterVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define ICSSFilter_SetSite(This,pSink) (This)->lpVtbl->SetSite(This,pSink)

#define ICSSFilter_OnAmbientPropertyChange(This,dispid) (This)->lpVtbl->OnAmbientPropertyChange(This,dispid)
#endif
#endif

  HRESULT WINAPI ICSSFilter_SetSite_Proxy(ICSSFilter *This,ICSSFilterSite *pSink);

  void __RPC_STUB ICSSFilter_SetSite_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ICSSFilter_OnAmbientPropertyChange_Proxy(ICSSFilter *This,LONG dispid);

  void __RPC_STUB ICSSFilter_OnAmbientPropertyChange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISecureUrlHost_INTERFACE_DEFINED__
#define __ISecureUrlHost_INTERFACE_DEFINED__

  EXTERN_C const IID IID_ISecureUrlHost;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct ISecureUrlHost : public IUnknown
  {
  public:
    virtual HRESULT WINAPI ValidateSecureUrl(WINBOOL *pfAllow,OLECHAR *pchUrlInQuestion,DWORD dwFlags) = 0;

  };
#else

  typedef struct ISecureUrlHostVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(ISecureUrlHost *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(ISecureUrlHost *This);

      ULONG (WINAPI *Release)(ISecureUrlHost *This);

      HRESULT (WINAPI *ValidateSecureUrl)(ISecureUrlHost *This,WINBOOL *pfAllow,OLECHAR *pchUrlInQuestion,DWORD dwFlags);

    END_INTERFACE
  } ISecureUrlHostVtbl;

  interface ISecureUrlHost
  {
    CONST_VTBL struct ISecureUrlHostVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define ISecureUrlHost_ValidateSecureUrl(This,pfAllow,pchUrlInQuestion,dwFlags) (This)->lpVtbl->ValidateSecureUrl(This,pfAllow,pchUrlInQuestion,dwFlags)
#endif
#endif

  HRESULT WINAPI ISecureUrlHost_ValidateSecureUrl_Proxy(ISecureUrlHost *This,WINBOOL *pfAllow,OLECHAR *pchUrlInQuestion,DWORD dwFlags);

  void __RPC_STUB ISecureUrlHost_ValidateSecureUrl_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMarkupServices_INTERFACE_DEFINED__
#define __IMarkupServices_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IMarkupServices;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IMarkupServices : public IUnknown
  {
  public:
    virtual HRESULT WINAPI CreateMarkupPointer(IMarkupPointer **ppPointer) = 0;

    virtual HRESULT WINAPI CreateMarkupContainer(IMarkupContainer **ppMarkupContainer) = 0;

    virtual HRESULT WINAPI CreateElement(ELEMENT_TAG_ID tagID,OLECHAR *pchAttributes,IHTMLElement **ppElement) = 0;

    virtual HRESULT WINAPI CloneElement(IHTMLElement *pElemCloneThis,IHTMLElement **ppElementTheClone) = 0;

    virtual HRESULT WINAPI InsertElement(IHTMLElement *pElementInsert,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) = 0;

    virtual HRESULT WINAPI RemoveElement(IHTMLElement *pElementRemove) = 0;

    virtual HRESULT WINAPI Remove(IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) = 0;

    virtual HRESULT WINAPI Copy(IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget) = 0;

    virtual HRESULT WINAPI Move(IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget) = 0;

    virtual HRESULT WINAPI InsertText(OLECHAR *pchText,long cch,IMarkupPointer *pPointerTarget) = 0;

    virtual HRESULT WINAPI ParseString(OLECHAR *pchHTML,DWORD dwFlags,IMarkupContainer **ppContainerResult,IMarkupPointer *ppPointerStart,IMarkupPointer *ppPointerFinish) = 0;

    virtual HRESULT WINAPI ParseGlobal(HGLOBAL hglobalHTML,DWORD dwFlags,IMarkupContainer **ppContainerResult,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) = 0;

    virtual HRESULT WINAPI IsScopedElement(IHTMLElement *pElement,WINBOOL *pfScoped) = 0;

    virtual HRESULT WINAPI GetElementTagId(IHTMLElement *pElement,ELEMENT_TAG_ID *ptagId) = 0;

    virtual HRESULT WINAPI GetTagIDForName(BSTR bstrName,ELEMENT_TAG_ID *ptagId) = 0;

    virtual HRESULT WINAPI GetNameForTagID(ELEMENT_TAG_ID tagId,BSTR *pbstrName) = 0;

    virtual HRESULT WINAPI MovePointersToRange(IHTMLTxtRange *pIRange,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) = 0;

    virtual HRESULT WINAPI MoveRangeToPointers(IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish,IHTMLTxtRange *pIRange) = 0;

    virtual HRESULT WINAPI BeginUndoUnit(OLECHAR *pchTitle) = 0;

    virtual HRESULT WINAPI EndUndoUnit(void) = 0;

  };
#else

  typedef struct IMarkupServicesVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IMarkupServices *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IMarkupServices *This);

      ULONG (WINAPI *Release)(IMarkupServices *This);

      HRESULT (WINAPI *CreateMarkupPointer)(IMarkupServices *This,IMarkupPointer **ppPointer);

      HRESULT (WINAPI *CreateMarkupContainer)(IMarkupServices *This,IMarkupContainer **ppMarkupContainer);

      HRESULT (WINAPI *CreateElement)(IMarkupServices *This,ELEMENT_TAG_ID tagID,OLECHAR *pchAttributes,IHTMLElement **ppElement);

      HRESULT (WINAPI *CloneElement)(IMarkupServices *This,IHTMLElement *pElemCloneThis,IHTMLElement **ppElementTheClone);

      HRESULT (WINAPI *InsertElement)(IMarkupServices *This,IHTMLElement *pElementInsert,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish);

      HRESULT (WINAPI *RemoveElement)(IMarkupServices *This,IHTMLElement *pElementRemove);

      HRESULT (WINAPI *Remove)(IMarkupServices *This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish);

      HRESULT (WINAPI *Copy)(IMarkupServices *This,IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget);

      HRESULT (WINAPI *Move)(IMarkupServices *This,IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget);

      HRESULT (WINAPI *InsertText)(IMarkupServices *This,OLECHAR *pchText,long cch,IMarkupPointer *pPointerTarget);

      HRESULT (WINAPI *ParseString)(IMarkupServices *This,OLECHAR *pchHTML,DWORD dwFlags,IMarkupContainer **ppContainerResult,IMarkupPointer *ppPointerStart,IMarkupPointer *ppPointerFinish);

      HRESULT (WINAPI *ParseGlobal)(IMarkupServices *This,HGLOBAL hglobalHTML,DWORD dwFlags,IMarkupContainer **ppContainerResult,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish);

      HRESULT (WINAPI *IsScopedElement)(IMarkupServices *This,IHTMLElement *pElement,WINBOOL *pfScoped);

      HRESULT (WINAPI *GetElementTagId)(IMarkupServices *This,IHTMLElement *pElement,ELEMENT_TAG_ID *ptagId);

      HRESULT (WINAPI *GetTagIDForName)(IMarkupServices *This,BSTR bstrName,ELEMENT_TAG_ID *ptagId);

      HRESULT (WINAPI *GetNameForTagID)(IMarkupServices *This,ELEMENT_TAG_ID tagId,BSTR *pbstrName);

      HRESULT (WINAPI *MovePointersToRange)(IMarkupServices *This,IHTMLTxtRange *pIRange,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish);

      HRESULT (WINAPI *MoveRangeToPointers)(IMarkupServices *This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish,IHTMLTxtRange *pIRange);

      HRESULT (WINAPI *BeginUndoUnit)(IMarkupServices *This,OLECHAR *pchTitle);

      HRESULT (WINAPI *EndUndoUnit)(IMarkupServices *This);

    END_INTERFACE
  } IMarkupServicesVtbl;

  interface IMarkupServices
  {
    CONST_VTBL struct IMarkupServicesVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IMarkupServices_CreateMarkupPointer_Proxy(IMarkupServices *This,IMarkupPointer **ppPointer);

  void __RPC_STUB IMarkupServices_CreateMarkupPointer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_CreateMarkupContainer_Proxy(IMarkupServices *This,IMarkupContainer **ppMarkupContainer);

  void __RPC_STUB IMarkupServices_CreateMarkupContainer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_CreateElement_Proxy(IMarkupServices *This,ELEMENT_TAG_ID tagID,OLECHAR *pchAttributes,IHTMLElement **ppElement);

  void __RPC_STUB IMarkupServices_CreateElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_CloneElement_Proxy(IMarkupServices *This,IHTMLElement *pElemCloneThis,IHTMLElement **ppElementTheClone);

  void __RPC_STUB IMarkupServices_CloneElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_InsertElement_Proxy(IMarkupServices *This,IHTMLElement *pElementInsert,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish);

  void __RPC_STUB IMarkupServices_InsertElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_RemoveElement_Proxy(IMarkupServices *This,IHTMLElement *pElementRemove);

  void __RPC_STUB IMarkupServices_RemoveElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_Remove_Proxy(IMarkupServices *This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish);

  void __RPC_STUB IMarkupServices_Remove_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_Copy_Proxy(IMarkupServices *This,IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget);

  void __RPC_STUB IMarkupServices_Copy_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_Move_Proxy(IMarkupServices *This,IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget);

  void __RPC_STUB IMarkupServices_Move_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_InsertText_Proxy(IMarkupServices *This,OLECHAR *pchText,long cch,IMarkupPointer *pPointerTarget);

  void __RPC_STUB IMarkupServices_InsertText_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_ParseString_Proxy(IMarkupServices *This,OLECHAR *pchHTML,DWORD dwFlags,IMarkupContainer **ppContainerResult,IMarkupPointer *ppPointerStart,IMarkupPointer *ppPointerFinish);

  void __RPC_STUB IMarkupServices_ParseString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_ParseGlobal_Proxy(IMarkupServices *This,HGLOBAL hglobalHTML,DWORD dwFlags,IMarkupContainer **ppContainerResult,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish);

  void __RPC_STUB IMarkupServices_ParseGlobal_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_IsScopedElement_Proxy(IMarkupServices *This,IHTMLElement *pElement,WINBOOL *pfScoped);

  void __RPC_STUB IMarkupServices_IsScopedElement_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_GetElementTagId_Proxy(IMarkupServices *This,IHTMLElement *pElement,ELEMENT_TAG_ID *ptagId);

  void __RPC_STUB IMarkupServices_GetElementTagId_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_GetTagIDForName_Proxy(IMarkupServices *This,BSTR bstrName,ELEMENT_TAG_ID *ptagId);

  void __RPC_STUB IMarkupServices_GetTagIDForName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_GetNameForTagID_Proxy(IMarkupServices *This,ELEMENT_TAG_ID tagId,BSTR *pbstrName);

  void __RPC_STUB IMarkupServices_GetNameForTagID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_MovePointersToRange_Proxy(IMarkupServices *This,IHTMLTxtRange *pIRange,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish);

  void __RPC_STUB IMarkupServices_MovePointersToRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_MoveRangeToPointers_Proxy(IMarkupServices *This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish,IHTMLTxtRange *pIRange);

  void __RPC_STUB IMarkupServices_MoveRangeToPointers_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_BeginUndoUnit_Proxy(IMarkupServices *This,OLECHAR *pchTitle);

  void __RPC_STUB IMarkupServices_BeginUndoUnit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices_EndUndoUnit_Proxy(IMarkupServices *This);

  void __RPC_STUB IMarkupServices_EndUndoUnit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMarkupServices2_INTERFACE_DEFINED__
#define __IMarkupServices2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IMarkupServices2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IMarkupServices2 : public IMarkupServices
  {
  public:
    virtual HRESULT WINAPI ParseGlobalEx(HGLOBAL hglobalHTML,DWORD dwFlags,IMarkupContainer *pContext,IMarkupContainer **ppContainerResult,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish) = 0;

    virtual HRESULT WINAPI ValidateElements(IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish,IMarkupPointer *pPointerTarget,IMarkupPointer *pPointerStatus,IHTMLElement **ppElemFailBottom,IHTMLElement **ppElemFailTop) = 0;

    virtual HRESULT WINAPI SaveSegmentsToClipboard(ISegmentList *pSegmentList,DWORD dwFlags) = 0;

  };
#else

  typedef struct IMarkupServices2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IMarkupServices2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IMarkupServices2 *This);

      ULONG (WINAPI *Release)(IMarkupServices2 *This);

      HRESULT (WINAPI *CreateMarkupPointer)(IMarkupServices2 *This,IMarkupPointer **ppPointer);

      HRESULT (WINAPI *CreateMarkupContainer)(IMarkupServices2 *This,IMarkupContainer **ppMarkupContainer);

      HRESULT (WINAPI *CreateElement)(IMarkupServices2 *This,ELEMENT_TAG_ID tagID,OLECHAR *pchAttributes,IHTMLElement **ppElement);

      HRESULT (WINAPI *CloneElement)(IMarkupServices2 *This,IHTMLElement *pElemCloneThis,IHTMLElement **ppElementTheClone);

      HRESULT (WINAPI *InsertElement)(IMarkupServices2 *This,IHTMLElement *pElementInsert,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish);

      HRESULT (WINAPI *RemoveElement)(IMarkupServices2 *This,IHTMLElement *pElementRemove);

      HRESULT (WINAPI *Remove)(IMarkupServices2 *This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish);

      HRESULT (WINAPI *Copy)(IMarkupServices2 *This,IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget);

      HRESULT (WINAPI *Move)(IMarkupServices2 *This,IMarkupPointer *pPointerSourceStart,IMarkupPointer *pPointerSourceFinish,IMarkupPointer *pPointerTarget);

      HRESULT (WINAPI *InsertText)(IMarkupServices2 *This,OLECHAR *pchText,long cch,IMarkupPointer *pPointerTarget);

      HRESULT (WINAPI *ParseString)(IMarkupServices2 *This,OLECHAR *pchHTML,DWORD dwFlags,IMarkupContainer **ppContainerResult,IMarkupPointer *ppPointerStart,IMarkupPointer *ppPointerFinish);

      HRESULT (WINAPI *ParseGlobal)(IMarkupServices2 *This,HGLOBAL hglobalHTML,DWORD dwFlags,IMarkupContainer **ppContainerResult,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish);

      HRESULT (WINAPI *IsScopedElement)(IMarkupServices2 *This,IHTMLElement *pElement,WINBOOL *pfScoped);

      HRESULT (WINAPI *GetElementTagId)(IMarkupServices2 *This,IHTMLElement *pElement,ELEMENT_TAG_ID *ptagId);

      HRESULT (WINAPI *GetTagIDForName)(IMarkupServices2 *This,BSTR bstrName,ELEMENT_TAG_ID *ptagId);

      HRESULT (WINAPI *GetNameForTagID)(IMarkupServices2 *This,ELEMENT_TAG_ID tagId,BSTR *pbstrName);

      HRESULT (WINAPI *MovePointersToRange)(IMarkupServices2 *This,IHTMLTxtRange *pIRange,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish);

      HRESULT (WINAPI *MoveRangeToPointers)(IMarkupServices2 *This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish,IHTMLTxtRange *pIRange);

      HRESULT (WINAPI *BeginUndoUnit)(IMarkupServices2 *This,OLECHAR *pchTitle);

      HRESULT (WINAPI *EndUndoUnit)(IMarkupServices2 *This);

      HRESULT (WINAPI *ParseGlobalEx)(IMarkupServices2 *This,HGLOBAL hglobalHTML,DWORD dwFlags,IMarkupContainer *pContext,IMarkupContainer **ppContainerResult,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish);

      HRESULT (WINAPI *ValidateElements)(IMarkupServices2 *This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish,IMarkupPointer *pPointerTarget,IMarkupPointer *pPointerStatus,IHTMLElement **ppElemFailBottom,IHTMLElement **ppElemFailTop);

      HRESULT (WINAPI *SaveSegmentsToClipboard)(IMarkupServices2 *This,ISegmentList *pSegmentList,DWORD dwFlags);

    END_INTERFACE
  } IMarkupServices2Vtbl;

  interface IMarkupServices2
  {
    CONST_VTBL struct IMarkupServices2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IMarkupServices2_ParseGlobalEx_Proxy(IMarkupServices2 *This,HGLOBAL hglobalHTML,DWORD dwFlags,IMarkupContainer *pContext,IMarkupContainer **ppContainerResult,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish);

  void __RPC_STUB IMarkupServices2_ParseGlobalEx_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices2_ValidateElements_Proxy(IMarkupServices2 *This,IMarkupPointer *pPointerStart,IMarkupPointer *pPointerFinish,IMarkupPointer *pPointerTarget,IMarkupPointer *pPointerStatus,IHTMLElement **ppElemFailBottom,IHTMLElement **ppElemFailTop);

  void __RPC_STUB IMarkupServices2_ValidateElements_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupServices2_SaveSegmentsToClipboard_Proxy(IMarkupServices2 *This,ISegmentList *pSegmentList,DWORD dwFlags);

  void __RPC_STUB IMarkupServices2_SaveSegmentsToClipboard_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLChangePlayback_INTERFACE_DEFINED__
#define __IHTMLChangePlayback_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLChangePlayback;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLChangePlayback : public IUnknown
  {
  public:
    virtual HRESULT WINAPI ExecChange(BYTE *pbRecord,WINBOOL fForward) = 0;

  };
#else

  typedef struct IHTMLChangePlaybackVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLChangePlayback *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLChangePlayback *This);

      ULONG (WINAPI *Release)(IHTMLChangePlayback *This);

      HRESULT (WINAPI *ExecChange)(IHTMLChangePlayback *This,BYTE *pbRecord,WINBOOL fForward);

    END_INTERFACE
  } IHTMLChangePlaybackVtbl;

  interface IHTMLChangePlayback
  {
    CONST_VTBL struct IHTMLChangePlaybackVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IHTMLChangePlayback_ExecChange(This,pbRecord,fForward) (This)->lpVtbl->ExecChange(This,pbRecord,fForward)
#endif
#endif

  HRESULT WINAPI IHTMLChangePlayback_ExecChange_Proxy(IHTMLChangePlayback *This,BYTE *pbRecord,WINBOOL fForward);

  void __RPC_STUB IHTMLChangePlayback_ExecChange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMarkupPointer2_INTERFACE_DEFINED__
#define __IMarkupPointer2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IMarkupPointer2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IMarkupPointer2 : public IMarkupPointer
  {
  public:
    virtual HRESULT WINAPI IsAtWordBreak(WINBOOL *pfAtBreak) = 0;

    virtual HRESULT WINAPI GetMarkupPosition(long *plMP) = 0;

    virtual HRESULT WINAPI MoveToMarkupPosition(IMarkupContainer *pContainer,long lMP) = 0;

    virtual HRESULT WINAPI MoveUnitBounded(MOVEUNIT_ACTION muAction,IMarkupPointer *pIBoundary) = 0;

    virtual HRESULT WINAPI IsInsideURL(IMarkupPointer *pRight,WINBOOL *pfResult) = 0;

    virtual HRESULT WINAPI MoveToContent(IHTMLElement *pIElement,WINBOOL fAtStart) = 0;

  };
#else

  typedef struct IMarkupPointer2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IMarkupPointer2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IMarkupPointer2 *This);

      ULONG (WINAPI *Release)(IMarkupPointer2 *This);

      HRESULT (WINAPI *OwningDoc)(IMarkupPointer2 *This,IHTMLDocument2 **ppDoc);

      HRESULT (WINAPI *Gravity)(IMarkupPointer2 *This,POINTER_GRAVITY *pGravity);

      HRESULT (WINAPI *SetGravity)(IMarkupPointer2 *This,POINTER_GRAVITY Gravity);

      HRESULT (WINAPI *Cling)(IMarkupPointer2 *This,WINBOOL *pfCling);

      HRESULT (WINAPI *SetCling)(IMarkupPointer2 *This,WINBOOL fCLing);

      HRESULT (WINAPI *Unposition)(IMarkupPointer2 *This);

      HRESULT (WINAPI *IsPositioned)(IMarkupPointer2 *This,WINBOOL *pfPositioned);

      HRESULT (WINAPI *GetContainer)(IMarkupPointer2 *This,IMarkupContainer **ppContainer);

      HRESULT (WINAPI *MoveAdjacentToElement)(IMarkupPointer2 *This,IHTMLElement *pElement,ELEMENT_ADJACENCY eAdj);

      HRESULT (WINAPI *MoveToPointer)(IMarkupPointer2 *This,IMarkupPointer *pPointer);

      HRESULT (WINAPI *MoveToContainer)(IMarkupPointer2 *This,IMarkupContainer *pContainer,WINBOOL fAtStart);

      HRESULT (WINAPI *Left)(IMarkupPointer2 *This,WINBOOL fMove,MARKUP_CONTEXT_TYPE *pContext,IHTMLElement **ppElement,long *pcch,OLECHAR *pchText);

      HRESULT (WINAPI *Right)(IMarkupPointer2 *This,WINBOOL fMove,MARKUP_CONTEXT_TYPE *pContext,IHTMLElement **ppElement,long *pcch,OLECHAR *pchText);

      HRESULT (WINAPI *CurrentScope)(IMarkupPointer2 *This,IHTMLElement **ppElemCurrent);

      HRESULT (WINAPI *IsLeftOf)(IMarkupPointer2 *This,IMarkupPointer *pPointerThat,WINBOOL *pfResult);

      HRESULT (WINAPI *IsLeftOfOrEqualTo)(IMarkupPointer2 *This,IMarkupPointer *pPointerThat,WINBOOL *pfResult);

      HRESULT (WINAPI *IsRightOf)(IMarkupPointer2 *This,IMarkupPointer *pPointerThat,WINBOOL *pfResult);

      HRESULT (WINAPI *IsRightOfOrEqualTo)(IMarkupPointer2 *This,IMarkupPointer *pPointerThat,WINBOOL *pfResult);

      HRESULT (WINAPI *IsEqualTo)(IMarkupPointer2 *This,IMarkupPointer *pPointerThat,WINBOOL *pfAreEqual);

      HRESULT (WINAPI *MoveUnit)(IMarkupPointer2 *This,MOVEUNIT_ACTION muAction);

      HRESULT (WINAPI *FindText)(IMarkupPointer2 *This,OLECHAR *pchFindText,DWORD dwFlags,IMarkupPointer *pIEndMatch,IMarkupPointer *pIEndSearch);

      HRESULT (WINAPI *IsAtWordBreak)(IMarkupPointer2 *This,WINBOOL *pfAtBreak);

      HRESULT (WINAPI *GetMarkupPosition)(IMarkupPointer2 *This,long *plMP);

      HRESULT (WINAPI *MoveToMarkupPosition)(IMarkupPointer2 *This,IMarkupContainer *pContainer,long lMP);

      HRESULT (WINAPI *MoveUnitBounded)(IMarkupPointer2 *This,MOVEUNIT_ACTION muAction,IMarkupPointer *pIBoundary);

      HRESULT (WINAPI *IsInsideURL)(IMarkupPointer2 *This,IMarkupPointer *pRight,WINBOOL *pfResult);

      HRESULT (WINAPI *MoveToContent)(IMarkupPointer2 *This,IHTMLElement *pIElement,WINBOOL fAtStart);

    END_INTERFACE
  } IMarkupPointer2Vtbl;

  interface IMarkupPointer2
  {
    CONST_VTBL struct IMarkupPointer2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IMarkupPointer2_IsAtWordBreak_Proxy(IMarkupPointer2 *This,WINBOOL *pfAtBreak);

  void __RPC_STUB IMarkupPointer2_IsAtWordBreak_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer2_GetMarkupPosition_Proxy(IMarkupPointer2 *This,long *plMP);

  void __RPC_STUB IMarkupPointer2_GetMarkupPosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer2_MoveToMarkupPosition_Proxy(IMarkupPointer2 *This,IMarkupContainer *pContainer,long lMP);

  void __RPC_STUB IMarkupPointer2_MoveToMarkupPosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer2_MoveUnitBounded_Proxy(IMarkupPointer2 *This,MOVEUNIT_ACTION muAction,IMarkupPointer *pIBoundary);

  void __RPC_STUB IMarkupPointer2_MoveUnitBounded_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer2_IsInsideURL_Proxy(IMarkupPointer2 *This,IMarkupPointer *pRight,WINBOOL *pfResult);

  void __RPC_STUB IMarkupPointer2_IsInsideURL_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupPointer2_MoveToContent_Proxy(IMarkupPointer2 *This,IHTMLElement *pIElement,WINBOOL fAtStart);

  void __RPC_STUB IMarkupPointer2_MoveToContent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IMarkupTextFrags_INTERFACE_DEFINED__
#define __IMarkupTextFrags_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IMarkupTextFrags;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IMarkupTextFrags : public IUnknown
  {
  public:
    virtual HRESULT WINAPI GetTextFragCount(long *pcFrags) = 0;

    virtual HRESULT WINAPI GetTextFrag(long iFrag,BSTR *pbstrFrag,IMarkupPointer *pPointerFrag) = 0;

    virtual HRESULT WINAPI RemoveTextFrag(long iFrag) = 0;

    virtual HRESULT WINAPI InsertTextFrag(long iFrag,BSTR bstrInsert,IMarkupPointer *pPointerInsert) = 0;

    virtual HRESULT WINAPI FindTextFragFromMarkupPointer(IMarkupPointer *pPointerFind,long *piFrag,WINBOOL *pfFragFound) = 0;

  };
#else

  typedef struct IMarkupTextFragsVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IMarkupTextFrags *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IMarkupTextFrags *This);

      ULONG (WINAPI *Release)(IMarkupTextFrags *This);

      HRESULT (WINAPI *GetTextFragCount)(IMarkupTextFrags *This,long *pcFrags);

      HRESULT (WINAPI *GetTextFrag)(IMarkupTextFrags *This,long iFrag,BSTR *pbstrFrag,IMarkupPointer *pPointerFrag);

      HRESULT (WINAPI *RemoveTextFrag)(IMarkupTextFrags *This,long iFrag);

      HRESULT (WINAPI *InsertTextFrag)(IMarkupTextFrags *This,long iFrag,BSTR bstrInsert,IMarkupPointer *pPointerInsert);

      HRESULT (WINAPI *FindTextFragFromMarkupPointer)(IMarkupTextFrags *This,IMarkupPointer *pPointerFind,long *piFrag,WINBOOL *pfFragFound);

    END_INTERFACE
  } IMarkupTextFragsVtbl;

  interface IMarkupTextFrags
  {
    CONST_VTBL struct IMarkupTextFragsVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IMarkupTextFrags_GetTextFragCount_Proxy(IMarkupTextFrags *This,long *pcFrags);

  void __RPC_STUB IMarkupTextFrags_GetTextFragCount_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupTextFrags_GetTextFrag_Proxy(IMarkupTextFrags *This,long iFrag,BSTR *pbstrFrag,IMarkupPointer *pPointerFrag);

  void __RPC_STUB IMarkupTextFrags_GetTextFrag_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupTextFrags_RemoveTextFrag_Proxy(IMarkupTextFrags *This,long iFrag);

  void __RPC_STUB IMarkupTextFrags_RemoveTextFrag_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupTextFrags_InsertTextFrag_Proxy(IMarkupTextFrags *This,long iFrag,BSTR bstrInsert,IMarkupPointer *pPointerInsert);

  void __RPC_STUB IMarkupTextFrags_InsertTextFrag_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IMarkupTextFrags_FindTextFragFromMarkupPointer_Proxy(IMarkupTextFrags *This,IMarkupPointer *pPointerFind,long *piFrag,WINBOOL *pfFragFound);

  void __RPC_STUB IMarkupTextFrags_FindTextFragFromMarkupPointer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IXMLGenericParse_INTERFACE_DEFINED__
#define __IXMLGenericParse_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IXMLGenericParse;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IXMLGenericParse : public IUnknown
  {
  public:
    virtual HRESULT WINAPI SetGenericParse(VARIANT_BOOL fDoGeneric) = 0;

  };
#else

  typedef struct IXMLGenericParseVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IXMLGenericParse *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IXMLGenericParse *This);

      ULONG (WINAPI *Release)(IXMLGenericParse *This);

      HRESULT (WINAPI *SetGenericParse)(IXMLGenericParse *This,VARIANT_BOOL fDoGeneric);

    END_INTERFACE
  } IXMLGenericParseVtbl;

  interface IXMLGenericParse
  {
    CONST_VTBL struct IXMLGenericParseVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IXMLGenericParse_SetGenericParse(This,fDoGeneric) (This)->lpVtbl->SetGenericParse(This,fDoGeneric)
#endif
#endif

  HRESULT WINAPI IXMLGenericParse_SetGenericParse_Proxy(IXMLGenericParse *This,VARIANT_BOOL fDoGeneric);

  void __RPC_STUB IXMLGenericParse_SetGenericParse_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLEditHost_INTERFACE_DEFINED__
#define __IHTMLEditHost_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLEditHost;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLEditHost : public IUnknown
  {
  public:
    virtual HRESULT WINAPI SnapRect(IHTMLElement *pIElement,RECT *prcNew,ELEMENT_CORNER eHandle) = 0;

  };
#else

  typedef struct IHTMLEditHostVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLEditHost *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLEditHost *This);

      ULONG (WINAPI *Release)(IHTMLEditHost *This);

      HRESULT (WINAPI *SnapRect)(IHTMLEditHost *This,IHTMLElement *pIElement,RECT *prcNew,ELEMENT_CORNER eHandle);

    END_INTERFACE
  } IHTMLEditHostVtbl;

  interface IHTMLEditHost
  {
    CONST_VTBL struct IHTMLEditHostVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IHTMLEditHost_SnapRect(This,pIElement,prcNew,eHandle) (This)->lpVtbl->SnapRect(This,pIElement,prcNew,eHandle)
#endif
#endif

  HRESULT WINAPI IHTMLEditHost_SnapRect_Proxy(IHTMLEditHost *This,IHTMLElement *pIElement,RECT *prcNew,ELEMENT_CORNER eHandle);

  void __RPC_STUB IHTMLEditHost_SnapRect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLEditHost2_INTERFACE_DEFINED__
#define __IHTMLEditHost2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLEditHost2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLEditHost2 : public IHTMLEditHost
  {
  public:
    virtual HRESULT WINAPI PreDrag(void) = 0;

  };
#else

  typedef struct IHTMLEditHost2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLEditHost2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLEditHost2 *This);

      ULONG (WINAPI *Release)(IHTMLEditHost2 *This);

      HRESULT (WINAPI *SnapRect)(IHTMLEditHost2 *This,IHTMLElement *pIElement,RECT *prcNew,ELEMENT_CORNER eHandle);

      HRESULT (WINAPI *PreDrag)(IHTMLEditHost2 *This);

    END_INTERFACE
  } IHTMLEditHost2Vtbl;

  interface IHTMLEditHost2
  {
    CONST_VTBL struct IHTMLEditHost2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IHTMLEditHost2_SnapRect(This,pIElement,prcNew,eHandle) (This)->lpVtbl->SnapRect(This,pIElement,prcNew,eHandle)

#define IHTMLEditHost2_PreDrag(This) (This)->lpVtbl->PreDrag(This)
#endif
#endif

  HRESULT WINAPI IHTMLEditHost2_PreDrag_Proxy(IHTMLEditHost2 *This);

  void __RPC_STUB IHTMLEditHost2_PreDrag_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISequenceNumber_INTERFACE_DEFINED__
#define __ISequenceNumber_INTERFACE_DEFINED__

  EXTERN_C const IID IID_ISequenceNumber;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct ISequenceNumber : public IUnknown
  {
  public:
    virtual HRESULT WINAPI GetSequenceNumber(long nCurrent,long *pnNew) = 0;

  };
#else

  typedef struct ISequenceNumberVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(ISequenceNumber *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(ISequenceNumber *This);

      ULONG (WINAPI *Release)(ISequenceNumber *This);

      HRESULT (WINAPI *GetSequenceNumber)(ISequenceNumber *This,long nCurrent,long *pnNew);

    END_INTERFACE
  } ISequenceNumberVtbl;

  interface ISequenceNumber
  {
    CONST_VTBL struct ISequenceNumberVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define ISequenceNumber_GetSequenceNumber(This,nCurrent,pnNew) (This)->lpVtbl->GetSequenceNumber(This,nCurrent,pnNew)
#endif
#endif

  HRESULT WINAPI ISequenceNumber_GetSequenceNumber_Proxy(ISequenceNumber *This,long nCurrent,long *pnNew);

  void __RPC_STUB ISequenceNumber_GetSequenceNumber_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IIMEServices_INTERFACE_DEFINED__
#define __IIMEServices_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IIMEServices;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IIMEServices : public IUnknown
  {
  public:
    virtual HRESULT WINAPI GetActiveIMM(IActiveIMMApp **ppActiveIMM) = 0;

  };
#else

  typedef struct IIMEServicesVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IIMEServices *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IIMEServices *This);

      ULONG (WINAPI *Release)(IIMEServices *This);

      HRESULT (WINAPI *GetActiveIMM)(IIMEServices *This,IActiveIMMApp **ppActiveIMM);

    END_INTERFACE
  } IIMEServicesVtbl;

  interface IIMEServices
  {
    CONST_VTBL struct IIMEServicesVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IIMEServices_GetActiveIMM(This,ppActiveIMM) (This)->lpVtbl->GetActiveIMM(This,ppActiveIMM)
#endif
#endif

  HRESULT WINAPI IIMEServices_GetActiveIMM_Proxy(IIMEServices *This,IActiveIMMApp **ppActiveIMM);

  void __RPC_STUB IIMEServices_GetActiveIMM_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISelectionServicesListener_INTERFACE_DEFINED__
#define __ISelectionServicesListener_INTERFACE_DEFINED__

  EXTERN_C const IID IID_ISelectionServicesListener;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct ISelectionServicesListener : public IUnknown
  {
  public:
    virtual HRESULT WINAPI BeginSelectionUndo(void) = 0;

    virtual HRESULT WINAPI EndSelectionUndo(void) = 0;

    virtual HRESULT WINAPI OnSelectedElementExit(IMarkupPointer *pIElementStart,IMarkupPointer *pIElementEnd,IMarkupPointer *pIElementContentStart,IMarkupPointer *pIElementContentEnd) = 0;

    virtual HRESULT WINAPI OnChangeType(SELECTION_TYPE eType,ISelectionServicesListener *pIListener) = 0;

    virtual HRESULT WINAPI GetTypeDetail(BSTR *pTypeDetail) = 0;

  };
#else

  typedef struct ISelectionServicesListenerVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(ISelectionServicesListener *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(ISelectionServicesListener *This);

      ULONG (WINAPI *Release)(ISelectionServicesListener *This);

      HRESULT (WINAPI *BeginSelectionUndo)(ISelectionServicesListener *This);

      HRESULT (WINAPI *EndSelectionUndo)(ISelectionServicesListener *This);

      HRESULT (WINAPI *OnSelectedElementExit)(ISelectionServicesListener *This,IMarkupPointer *pIElementStart,IMarkupPointer *pIElementEnd,IMarkupPointer *pIElementContentStart,IMarkupPointer *pIElementContentEnd);

      HRESULT (WINAPI *OnChangeType)(ISelectionServicesListener *This,SELECTION_TYPE eType,ISelectionServicesListener *pIListener);

      HRESULT (WINAPI *GetTypeDetail)(ISelectionServicesListener *This,BSTR *pTypeDetail);

    END_INTERFACE
  } ISelectionServicesListenerVtbl;

  interface ISelectionServicesListener
  {
    CONST_VTBL struct ISelectionServicesListenerVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI ISelectionServicesListener_BeginSelectionUndo_Proxy(ISelectionServicesListener *This);

  void __RPC_STUB ISelectionServicesListener_BeginSelectionUndo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ISelectionServicesListener_EndSelectionUndo_Proxy(ISelectionServicesListener *This);

  void __RPC_STUB ISelectionServicesListener_EndSelectionUndo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ISelectionServicesListener_OnSelectedElementExit_Proxy(ISelectionServicesListener *This,IMarkupPointer *pIElementStart,IMarkupPointer *pIElementEnd,IMarkupPointer *pIElementContentStart,IMarkupPointer *pIElementContentEnd);

  void __RPC_STUB ISelectionServicesListener_OnSelectedElementExit_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ISelectionServicesListener_OnChangeType_Proxy(ISelectionServicesListener *This,SELECTION_TYPE eType,ISelectionServicesListener *pIListener);

  void __RPC_STUB ISelectionServicesListener_OnChangeType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ISelectionServicesListener_GetTypeDetail_Proxy(ISelectionServicesListener *This,BSTR *pTypeDetail);

  void __RPC_STUB ISelectionServicesListener_GetTypeDetail_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __ISelectionServices_INTERFACE_DEFINED__
#define __ISelectionServices_INTERFACE_DEFINED__

  EXTERN_C const IID IID_ISelectionServices;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct ISelectionServices : public IUnknown
  {
  public:
    virtual HRESULT WINAPI SetSelectionType(SELECTION_TYPE eType,ISelectionServicesListener *pIListener) = 0;

    virtual HRESULT WINAPI GetMarkupContainer(IMarkupContainer **ppIContainer) = 0;

    virtual HRESULT WINAPI AddSegment(IMarkupPointer *pIStart,IMarkupPointer *pIEnd,ISegment **ppISegmentAdded) = 0;

    virtual HRESULT WINAPI AddElementSegment(IHTMLElement *pIElement,IElementSegment **ppISegmentAdded) = 0;

    virtual HRESULT WINAPI RemoveSegment(ISegment *pISegment) = 0;

    virtual HRESULT WINAPI GetSelectionServicesListener(ISelectionServicesListener **ppISelectionServicesListener) = 0;

  };
#else

  typedef struct ISelectionServicesVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(ISelectionServices *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(ISelectionServices *This);

      ULONG (WINAPI *Release)(ISelectionServices *This);

      HRESULT (WINAPI *SetSelectionType)(ISelectionServices *This,SELECTION_TYPE eType,ISelectionServicesListener *pIListener);

      HRESULT (WINAPI *GetMarkupContainer)(ISelectionServices *This,IMarkupContainer **ppIContainer);

      HRESULT (WINAPI *AddSegment)(ISelectionServices *This,IMarkupPointer *pIStart,IMarkupPointer *pIEnd,ISegment **ppISegmentAdded);

      HRESULT (WINAPI *AddElementSegment)(ISelectionServices *This,IHTMLElement *pIElement,IElementSegment **ppISegmentAdded);

      HRESULT (WINAPI *RemoveSegment)(ISelectionServices *This,ISegment *pISegment);

      HRESULT (WINAPI *GetSelectionServicesListener)(ISelectionServices *This,ISelectionServicesListener **ppISelectionServicesListener);

    END_INTERFACE
  } ISelectionServicesVtbl;

  interface ISelectionServices
  {
    CONST_VTBL struct ISelectionServicesVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI ISelectionServices_SetSelectionType_Proxy(ISelectionServices *This,SELECTION_TYPE eType,ISelectionServicesListener *pIListener);

  void __RPC_STUB ISelectionServices_SetSelectionType_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ISelectionServices_GetMarkupContainer_Proxy(ISelectionServices *This,IMarkupContainer **ppIContainer);

  void __RPC_STUB ISelectionServices_GetMarkupContainer_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ISelectionServices_AddSegment_Proxy(ISelectionServices *This,IMarkupPointer *pIStart,IMarkupPointer *pIEnd,ISegment **ppISegmentAdded);

  void __RPC_STUB ISelectionServices_AddSegment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ISelectionServices_AddElementSegment_Proxy(ISelectionServices *This,IHTMLElement *pIElement,IElementSegment **ppISegmentAdded);

  void __RPC_STUB ISelectionServices_AddElementSegment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ISelectionServices_RemoveSegment_Proxy(ISelectionServices *This,ISegment *pISegment);

  void __RPC_STUB ISelectionServices_RemoveSegment_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI ISelectionServices_GetSelectionServicesListener_Proxy(ISelectionServices *This,ISelectionServicesListener **ppISelectionServicesListener);

  void __RPC_STUB ISelectionServices_GetSelectionServicesListener_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLEditDesigner_INTERFACE_DEFINED__
#define __IHTMLEditDesigner_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLEditDesigner;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLEditDesigner : public IUnknown
  {
  public:
    virtual HRESULT WINAPI PreHandleEvent(DISPID inEvtDispId,IHTMLEventObj *pIEventObj) = 0;

    virtual HRESULT WINAPI PostHandleEvent(DISPID inEvtDispId,IHTMLEventObj *pIEventObj) = 0;

    virtual HRESULT WINAPI TranslateAccelerator(DISPID inEvtDispId,IHTMLEventObj *pIEventObj) = 0;

    virtual HRESULT WINAPI PostEditorEventNotify(DISPID inEvtDispId,IHTMLEventObj *pIEventObj) = 0;

  };
#else

  typedef struct IHTMLEditDesignerVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLEditDesigner *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLEditDesigner *This);

      ULONG (WINAPI *Release)(IHTMLEditDesigner *This);

      HRESULT (WINAPI *PreHandleEvent)(IHTMLEditDesigner *This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj);

      HRESULT (WINAPI *PostHandleEvent)(IHTMLEditDesigner *This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj);

      HRESULT (WINAPI *TranslateAccelerator)(IHTMLEditDesigner *This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj);

      HRESULT (WINAPI *PostEditorEventNotify)(IHTMLEditDesigner *This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj);

    END_INTERFACE
  } IHTMLEditDesignerVtbl;

  interface IHTMLEditDesigner
  {
    CONST_VTBL struct IHTMLEditDesignerVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLEditDesigner_PreHandleEvent_Proxy(IHTMLEditDesigner *This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj);

  void __RPC_STUB IHTMLEditDesigner_PreHandleEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEditDesigner_PostHandleEvent_Proxy(IHTMLEditDesigner *This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj);

  void __RPC_STUB IHTMLEditDesigner_PostHandleEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEditDesigner_TranslateAccelerator_Proxy(IHTMLEditDesigner *This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj);

  void __RPC_STUB IHTMLEditDesigner_TranslateAccelerator_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEditDesigner_PostEditorEventNotify_Proxy(IHTMLEditDesigner *This,DISPID inEvtDispId,IHTMLEventObj *pIEventObj);

  void __RPC_STUB IHTMLEditDesigner_PostEditorEventNotify_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLEditServices_INTERFACE_DEFINED__
#define __IHTMLEditServices_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLEditServices;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLEditServices : public IUnknown
  {
  public:
    virtual HRESULT WINAPI AddDesigner(IHTMLEditDesigner *pIDesigner) = 0;

    virtual HRESULT WINAPI RemoveDesigner(IHTMLEditDesigner *pIDesigner) = 0;

    virtual HRESULT WINAPI GetSelectionServices(IMarkupContainer *pIContainer,ISelectionServices **ppSelSvc) = 0;

    virtual HRESULT WINAPI MoveToSelectionAnchor(IMarkupPointer *pIStartAnchor) = 0;

    virtual HRESULT WINAPI MoveToSelectionEnd(IMarkupPointer *pIEndAnchor) = 0;

    virtual HRESULT WINAPI SelectRange(IMarkupPointer *pStart,IMarkupPointer *pEnd,SELECTION_TYPE eType) = 0;

  };
#else

  typedef struct IHTMLEditServicesVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLEditServices *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLEditServices *This);

      ULONG (WINAPI *Release)(IHTMLEditServices *This);

      HRESULT (WINAPI *AddDesigner)(IHTMLEditServices *This,IHTMLEditDesigner *pIDesigner);

      HRESULT (WINAPI *RemoveDesigner)(IHTMLEditServices *This,IHTMLEditDesigner *pIDesigner);

      HRESULT (WINAPI *GetSelectionServices)(IHTMLEditServices *This,IMarkupContainer *pIContainer,ISelectionServices **ppSelSvc);

      HRESULT (WINAPI *MoveToSelectionAnchor)(IHTMLEditServices *This,IMarkupPointer *pIStartAnchor);

      HRESULT (WINAPI *MoveToSelectionEnd)(IHTMLEditServices *This,IMarkupPointer *pIEndAnchor);

      HRESULT (WINAPI *SelectRange)(IHTMLEditServices *This,IMarkupPointer *pStart,IMarkupPointer *pEnd,SELECTION_TYPE eType);

    END_INTERFACE
  } IHTMLEditServicesVtbl;

  interface IHTMLEditServices
  {
    CONST_VTBL struct IHTMLEditServicesVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLEditServices_AddDesigner_Proxy(IHTMLEditServices *This,IHTMLEditDesigner *pIDesigner);

  void __RPC_STUB IHTMLEditServices_AddDesigner_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEditServices_RemoveDesigner_Proxy(IHTMLEditServices *This,IHTMLEditDesigner *pIDesigner);

  void __RPC_STUB IHTMLEditServices_RemoveDesigner_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEditServices_GetSelectionServices_Proxy(IHTMLEditServices *This,IMarkupContainer *pIContainer,ISelectionServices **ppSelSvc);

  void __RPC_STUB IHTMLEditServices_GetSelectionServices_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEditServices_MoveToSelectionAnchor_Proxy(IHTMLEditServices *This,IMarkupPointer *pIStartAnchor);

  void __RPC_STUB IHTMLEditServices_MoveToSelectionAnchor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEditServices_MoveToSelectionEnd_Proxy(IHTMLEditServices *This,IMarkupPointer *pIEndAnchor);

  void __RPC_STUB IHTMLEditServices_MoveToSelectionEnd_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEditServices_SelectRange_Proxy(IHTMLEditServices *This,IMarkupPointer *pStart,IMarkupPointer *pEnd,SELECTION_TYPE eType);

  void __RPC_STUB IHTMLEditServices_SelectRange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLEditServices2_INTERFACE_DEFINED__
#define __IHTMLEditServices2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLEditServices2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLEditServices2 : public IHTMLEditServices
  {
  public:
    virtual HRESULT WINAPI MoveToSelectionAnchorEx(IDisplayPointer *pIStartAnchor) = 0;

    virtual HRESULT WINAPI MoveToSelectionEndEx(IDisplayPointer *pIEndAnchor) = 0;

    virtual HRESULT WINAPI FreezeVirtualCaretPos(WINBOOL fReCompute) = 0;

    virtual HRESULT WINAPI UnFreezeVirtualCaretPos(WINBOOL fReset) = 0;

  };
#else

  typedef struct IHTMLEditServices2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLEditServices2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLEditServices2 *This);

      ULONG (WINAPI *Release)(IHTMLEditServices2 *This);

      HRESULT (WINAPI *AddDesigner)(IHTMLEditServices2 *This,IHTMLEditDesigner *pIDesigner);

      HRESULT (WINAPI *RemoveDesigner)(IHTMLEditServices2 *This,IHTMLEditDesigner *pIDesigner);

      HRESULT (WINAPI *GetSelectionServices)(IHTMLEditServices2 *This,IMarkupContainer *pIContainer,ISelectionServices **ppSelSvc);

      HRESULT (WINAPI *MoveToSelectionAnchor)(IHTMLEditServices2 *This,IMarkupPointer *pIStartAnchor);

      HRESULT (WINAPI *MoveToSelectionEnd)(IHTMLEditServices2 *This,IMarkupPointer *pIEndAnchor);

      HRESULT (WINAPI *SelectRange)(IHTMLEditServices2 *This,IMarkupPointer *pStart,IMarkupPointer *pEnd,SELECTION_TYPE eType);

      HRESULT (WINAPI *MoveToSelectionAnchorEx)(IHTMLEditServices2 *This,IDisplayPointer *pIStartAnchor);

      HRESULT (WINAPI *MoveToSelectionEndEx)(IHTMLEditServices2 *This,IDisplayPointer *pIEndAnchor);

      HRESULT (WINAPI *FreezeVirtualCaretPos)(IHTMLEditServices2 *This,WINBOOL fReCompute);

      HRESULT (WINAPI *UnFreezeVirtualCaretPos)(IHTMLEditServices2 *This,WINBOOL fReset);

    END_INTERFACE
  } IHTMLEditServices2Vtbl;

  interface IHTMLEditServices2
  {
    CONST_VTBL struct IHTMLEditServices2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLEditServices2_MoveToSelectionAnchorEx_Proxy(IHTMLEditServices2 *This,IDisplayPointer *pIStartAnchor);

  void __RPC_STUB IHTMLEditServices2_MoveToSelectionAnchorEx_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEditServices2_MoveToSelectionEndEx_Proxy(IHTMLEditServices2 *This,IDisplayPointer *pIEndAnchor);

  void __RPC_STUB IHTMLEditServices2_MoveToSelectionEndEx_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEditServices2_FreezeVirtualCaretPos_Proxy(IHTMLEditServices2 *This,WINBOOL fReCompute);

  void __RPC_STUB IHTMLEditServices2_FreezeVirtualCaretPos_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLEditServices2_UnFreezeVirtualCaretPos_Proxy(IHTMLEditServices2 *This,WINBOOL fReset);

  void __RPC_STUB IHTMLEditServices2_UnFreezeVirtualCaretPos_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLComputedStyle_INTERFACE_DEFINED__
#define __IHTMLComputedStyle_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLComputedStyle;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLComputedStyle : public IUnknown
  {
  public:
    virtual HRESULT WINAPI get_bold(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_italic(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_underline(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_overline(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_strikeOut(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_subScript(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_superScript(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_explicitFace(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_fontWeight(long *p) = 0;

    virtual HRESULT WINAPI get_fontSize(long *p) = 0;

    virtual HRESULT WINAPI get_fontName(TCHAR *p) = 0;

    virtual HRESULT WINAPI get_hasBgColor(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_textColor(DWORD *p) = 0;

    virtual HRESULT WINAPI get_backgroundColor(DWORD *p) = 0;

    virtual HRESULT WINAPI get_preFormatted(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_direction(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_blockDirection(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI get_OL(VARIANT_BOOL *p) = 0;

    virtual HRESULT WINAPI IsEqual(IHTMLComputedStyle *pComputedStyle,VARIANT_BOOL *pfEqual) = 0;

  };
#else

  typedef struct IHTMLComputedStyleVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLComputedStyle *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLComputedStyle *This);

      ULONG (WINAPI *Release)(IHTMLComputedStyle *This);

      HRESULT (WINAPI *get_bold)(IHTMLComputedStyle *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_italic)(IHTMLComputedStyle *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_underline)(IHTMLComputedStyle *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_overline)(IHTMLComputedStyle *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_strikeOut)(IHTMLComputedStyle *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_subScript)(IHTMLComputedStyle *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_superScript)(IHTMLComputedStyle *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_explicitFace)(IHTMLComputedStyle *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_fontWeight)(IHTMLComputedStyle *This,long *p);

      HRESULT (WINAPI *get_fontSize)(IHTMLComputedStyle *This,long *p);

      HRESULT (WINAPI *get_fontName)(IHTMLComputedStyle *This,TCHAR *p);

      HRESULT (WINAPI *get_hasBgColor)(IHTMLComputedStyle *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_textColor)(IHTMLComputedStyle *This,DWORD *p);

      HRESULT (WINAPI *get_backgroundColor)(IHTMLComputedStyle *This,DWORD *p);

      HRESULT (WINAPI *get_preFormatted)(IHTMLComputedStyle *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_direction)(IHTMLComputedStyle *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_blockDirection)(IHTMLComputedStyle *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *get_OL)(IHTMLComputedStyle *This,VARIANT_BOOL *p);

      HRESULT (WINAPI *IsEqual)(IHTMLComputedStyle *This,IHTMLComputedStyle *pComputedStyle,VARIANT_BOOL *pfEqual);

    END_INTERFACE
  } IHTMLComputedStyleVtbl;

  interface IHTMLComputedStyle
  {
    CONST_VTBL struct IHTMLComputedStyleVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLComputedStyle_get_bold_Proxy(IHTMLComputedStyle *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLComputedStyle_get_bold_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_italic_Proxy(IHTMLComputedStyle *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLComputedStyle_get_italic_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_underline_Proxy(IHTMLComputedStyle *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLComputedStyle_get_underline_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_overline_Proxy(IHTMLComputedStyle *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLComputedStyle_get_overline_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_strikeOut_Proxy(IHTMLComputedStyle *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLComputedStyle_get_strikeOut_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_subScript_Proxy(IHTMLComputedStyle *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLComputedStyle_get_subScript_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_superScript_Proxy(IHTMLComputedStyle *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLComputedStyle_get_superScript_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_explicitFace_Proxy(IHTMLComputedStyle *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLComputedStyle_get_explicitFace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_fontWeight_Proxy(IHTMLComputedStyle *This,long *p);

  void __RPC_STUB IHTMLComputedStyle_get_fontWeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_fontSize_Proxy(IHTMLComputedStyle *This,long *p);

  void __RPC_STUB IHTMLComputedStyle_get_fontSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_fontName_Proxy(IHTMLComputedStyle *This,TCHAR *p);

  void __RPC_STUB IHTMLComputedStyle_get_fontName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_hasBgColor_Proxy(IHTMLComputedStyle *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLComputedStyle_get_hasBgColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_textColor_Proxy(IHTMLComputedStyle *This,DWORD *p);

  void __RPC_STUB IHTMLComputedStyle_get_textColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_backgroundColor_Proxy(IHTMLComputedStyle *This,DWORD *p);

  void __RPC_STUB IHTMLComputedStyle_get_backgroundColor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_preFormatted_Proxy(IHTMLComputedStyle *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLComputedStyle_get_preFormatted_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_direction_Proxy(IHTMLComputedStyle *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLComputedStyle_get_direction_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_blockDirection_Proxy(IHTMLComputedStyle *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLComputedStyle_get_blockDirection_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_get_OL_Proxy(IHTMLComputedStyle *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLComputedStyle_get_OL_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLComputedStyle_IsEqual_Proxy(IHTMLComputedStyle *This,IHTMLComputedStyle *pComputedStyle,VARIANT_BOOL *pfEqual);

  void __RPC_STUB IHTMLComputedStyle_IsEqual_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  EXTERN_C const CLSID CLSID_HtmlDlgSafeHelper;

#ifdef __cplusplus

  class HtmlDlgSafeHelper;
#endif

  EXTERN_C const CLSID CLSID_BlockFormats;

#ifdef __cplusplus

  class BlockFormats;
#endif

  EXTERN_C const CLSID CLSID_FontNames;

#ifdef __cplusplus

  class FontNames;
#endif

#ifndef __HTMLNamespaceEvents_DISPINTERFACE_DEFINED__
#define __HTMLNamespaceEvents_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_HTMLNamespaceEvents;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct HTMLNamespaceEvents : public IDispatch
  {
  };
#else

  typedef struct HTMLNamespaceEventsVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(HTMLNamespaceEvents *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(HTMLNamespaceEvents *This);

      ULONG (WINAPI *Release)(HTMLNamespaceEvents *This);

      HRESULT (WINAPI *GetTypeInfoCount)(HTMLNamespaceEvents *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(HTMLNamespaceEvents *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct HTMLNamespaceEventsVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

#ifndef __IHTMLNamespace_INTERFACE_DEFINED__
#define __IHTMLNamespace_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLNamespace;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLNamespace : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get_name(BSTR *p) = 0;

    virtual HRESULT WINAPI get_urn(BSTR *p) = 0;

    virtual HRESULT WINAPI get_tagNames(IDispatch **p) = 0;

    virtual HRESULT WINAPI get_readyState(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_onreadystatechange(VARIANT v) = 0;

    virtual HRESULT WINAPI get_onreadystatechange(VARIANT *p) = 0;

    virtual HRESULT WINAPI doImport(BSTR bstrImplementationUrl) = 0;

    virtual HRESULT WINAPI attachEvent(BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult) = 0;

    virtual HRESULT WINAPI detachEvent(BSTR event,IDispatch *pDisp) = 0;

  };
#else

  typedef struct IHTMLNamespaceVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLNamespace *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLNamespace *This);

      ULONG (WINAPI *Release)(IHTMLNamespace *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLNamespace *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLNamespace *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get_name)(IHTMLNamespace *This,BSTR *p);

      HRESULT (WINAPI *get_urn)(IHTMLNamespace *This,BSTR *p);

      HRESULT (WINAPI *get_tagNames)(IHTMLNamespace *This,IDispatch **p);

      HRESULT (WINAPI *get_readyState)(IHTMLNamespace *This,VARIANT *p);

      HRESULT (WINAPI *put_onreadystatechange)(IHTMLNamespace *This,VARIANT v);

      HRESULT (WINAPI *get_onreadystatechange)(IHTMLNamespace *This,VARIANT *p);

      HRESULT (WINAPI *doImport)(IHTMLNamespace *This,BSTR bstrImplementationUrl);

      HRESULT (WINAPI *attachEvent)(IHTMLNamespace *This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult);

      HRESULT (WINAPI *detachEvent)(IHTMLNamespace *This,BSTR event,IDispatch *pDisp);

    END_INTERFACE
  } IHTMLNamespaceVtbl;

  interface IHTMLNamespace
  {
    CONST_VTBL struct IHTMLNamespaceVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLNamespace_get_name_Proxy(IHTMLNamespace *This,BSTR *p);

  void __RPC_STUB IHTMLNamespace_get_name_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLNamespace_get_urn_Proxy(IHTMLNamespace *This,BSTR *p);

  void __RPC_STUB IHTMLNamespace_get_urn_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLNamespace_get_tagNames_Proxy(IHTMLNamespace *This,IDispatch **p);

  void __RPC_STUB IHTMLNamespace_get_tagNames_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLNamespace_get_readyState_Proxy(IHTMLNamespace *This,VARIANT *p);

  void __RPC_STUB IHTMLNamespace_get_readyState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLNamespace_put_onreadystatechange_Proxy(IHTMLNamespace *This,VARIANT v);

  void __RPC_STUB IHTMLNamespace_put_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLNamespace_get_onreadystatechange_Proxy(IHTMLNamespace *This,VARIANT *p);

  void __RPC_STUB IHTMLNamespace_get_onreadystatechange_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLNamespace_doImport_Proxy(IHTMLNamespace *This,BSTR bstrImplementationUrl);

  void __RPC_STUB IHTMLNamespace_doImport_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLNamespace_attachEvent_Proxy(IHTMLNamespace *This,BSTR event,IDispatch *pDisp,VARIANT_BOOL *pfResult);

  void __RPC_STUB IHTMLNamespace_attachEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLNamespace_detachEvent_Proxy(IHTMLNamespace *This,BSTR event,IDispatch *pDisp);

  void __RPC_STUB IHTMLNamespace_detachEvent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLNamespaceCollection_INTERFACE_DEFINED__
#define __IHTMLNamespaceCollection_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLNamespaceCollection;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLNamespaceCollection : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;

    virtual HRESULT WINAPI item(VARIANT index,IDispatch **ppNamespace) = 0;

    virtual HRESULT WINAPI add(BSTR bstrNamespace,BSTR bstrUrn,VARIANT implementationUrl,IDispatch **ppNamespace) = 0;

  };
#else

  typedef struct IHTMLNamespaceCollectionVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLNamespaceCollection *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLNamespaceCollection *This);

      ULONG (WINAPI *Release)(IHTMLNamespaceCollection *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLNamespaceCollection *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLNamespaceCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get_length)(IHTMLNamespaceCollection *This,long *p);

      HRESULT (WINAPI *item)(IHTMLNamespaceCollection *This,VARIANT index,IDispatch **ppNamespace);

      HRESULT (WINAPI *add)(IHTMLNamespaceCollection *This,BSTR bstrNamespace,BSTR bstrUrn,VARIANT implementationUrl,IDispatch **ppNamespace);

    END_INTERFACE
  } IHTMLNamespaceCollectionVtbl;

  interface IHTMLNamespaceCollection
  {
    CONST_VTBL struct IHTMLNamespaceCollectionVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLNamespaceCollection_get_length_Proxy(IHTMLNamespaceCollection *This,long *p);

  void __RPC_STUB IHTMLNamespaceCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLNamespaceCollection_item_Proxy(IHTMLNamespaceCollection *This,VARIANT index,IDispatch **ppNamespace);

  void __RPC_STUB IHTMLNamespaceCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLNamespaceCollection_add_Proxy(IHTMLNamespaceCollection *This,BSTR bstrNamespace,BSTR bstrUrn,VARIANT implementationUrl,IDispatch **ppNamespace);

  void __RPC_STUB IHTMLNamespaceCollection_add_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  EXTERN_C const CLSID CLSID_HTMLNamespace;

#ifdef __cplusplus

  class HTMLNamespace;
#endif

  EXTERN_C const CLSID CLSID_HTMLNamespaceCollection;

#ifdef __cplusplus

  class HTMLNamespaceCollection;
#endif

#ifndef __IHTMLPainter_INTERFACE_DEFINED__
#define __IHTMLPainter_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLPainter;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLPainter : public IUnknown
  {
  public:
    virtual HRESULT WINAPI Draw(RECT rcBounds,RECT rcUpdate,LONG lDrawFlags,HDC hdc,LPVOID pvDrawObject) = 0;

    virtual HRESULT WINAPI OnResize(SIZE size) = 0;

    virtual HRESULT WINAPI GetPainterInfo(HTML_PAINTER_INFO *pInfo) = 0;

    virtual HRESULT WINAPI HitTestPoint(POINT pt,WINBOOL *pbHit,LONG *plPartID) = 0;

  };
#else

  typedef struct IHTMLPainterVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLPainter *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLPainter *This);

      ULONG (WINAPI *Release)(IHTMLPainter *This);

      HRESULT (WINAPI *Draw)(IHTMLPainter *This,RECT rcBounds,RECT rcUpdate,LONG lDrawFlags,HDC hdc,LPVOID pvDrawObject);

      HRESULT (WINAPI *OnResize)(IHTMLPainter *This,SIZE size);

      HRESULT (WINAPI *GetPainterInfo)(IHTMLPainter *This,HTML_PAINTER_INFO *pInfo);

      HRESULT (WINAPI *HitTestPoint)(IHTMLPainter *This,POINT pt,WINBOOL *pbHit,LONG *plPartID);

    END_INTERFACE
  } IHTMLPainterVtbl;

  interface IHTMLPainter
  {
    CONST_VTBL struct IHTMLPainterVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLPainter_Draw_Proxy(IHTMLPainter *This,RECT rcBounds,RECT rcUpdate,LONG lDrawFlags,HDC hdc,LPVOID pvDrawObject);

  void __RPC_STUB IHTMLPainter_Draw_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPainter_OnResize_Proxy(IHTMLPainter *This,SIZE size);

  void __RPC_STUB IHTMLPainter_OnResize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPainter_GetPainterInfo_Proxy(IHTMLPainter *This,HTML_PAINTER_INFO *pInfo);

  void __RPC_STUB IHTMLPainter_GetPainterInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPainter_HitTestPoint_Proxy(IHTMLPainter *This,POINT pt,WINBOOL *pbHit,LONG *plPartID);

  void __RPC_STUB IHTMLPainter_HitTestPoint_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLPaintSite_INTERFACE_DEFINED__
#define __IHTMLPaintSite_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLPaintSite;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLPaintSite : public IUnknown
  {
  public:
    virtual HRESULT WINAPI InvalidatePainterInfo(void) = 0;

    virtual HRESULT WINAPI InvalidateRect(RECT *prcInvalid) = 0;

    virtual HRESULT WINAPI InvalidateRegion(HRGN rgnInvalid) = 0;

    virtual HRESULT WINAPI GetDrawInfo(LONG lFlags,HTML_PAINT_DRAW_INFO *pDrawInfo) = 0;

    virtual HRESULT WINAPI TransformGlobalToLocal(POINT ptGlobal,POINT *pptLocal) = 0;

    virtual HRESULT WINAPI TransformLocalToGlobal(POINT ptLocal,POINT *pptGlobal) = 0;

    virtual HRESULT WINAPI GetHitTestCookie(LONG *plCookie) = 0;

  };
#else

  typedef struct IHTMLPaintSiteVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLPaintSite *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLPaintSite *This);

      ULONG (WINAPI *Release)(IHTMLPaintSite *This);

      HRESULT (WINAPI *InvalidatePainterInfo)(IHTMLPaintSite *This);

      HRESULT (WINAPI *InvalidateRect)(IHTMLPaintSite *This,RECT *prcInvalid);

      HRESULT (WINAPI *InvalidateRegion)(IHTMLPaintSite *This,HRGN rgnInvalid);

      HRESULT (WINAPI *GetDrawInfo)(IHTMLPaintSite *This,LONG lFlags,HTML_PAINT_DRAW_INFO *pDrawInfo);

      HRESULT (WINAPI *TransformGlobalToLocal)(IHTMLPaintSite *This,POINT ptGlobal,POINT *pptLocal);

      HRESULT (WINAPI *TransformLocalToGlobal)(IHTMLPaintSite *This,POINT ptLocal,POINT *pptGlobal);

      HRESULT (WINAPI *GetHitTestCookie)(IHTMLPaintSite *This,LONG *plCookie);

    END_INTERFACE
  } IHTMLPaintSiteVtbl;

  interface IHTMLPaintSite
  {
    CONST_VTBL struct IHTMLPaintSiteVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLPaintSite_InvalidatePainterInfo_Proxy(IHTMLPaintSite *This);

  void __RPC_STUB IHTMLPaintSite_InvalidatePainterInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPaintSite_InvalidateRect_Proxy(IHTMLPaintSite *This,RECT *prcInvalid);

  void __RPC_STUB IHTMLPaintSite_InvalidateRect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPaintSite_InvalidateRegion_Proxy(IHTMLPaintSite *This,HRGN rgnInvalid);

  void __RPC_STUB IHTMLPaintSite_InvalidateRegion_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPaintSite_GetDrawInfo_Proxy(IHTMLPaintSite *This,LONG lFlags,HTML_PAINT_DRAW_INFO *pDrawInfo);

  void __RPC_STUB IHTMLPaintSite_GetDrawInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPaintSite_TransformGlobalToLocal_Proxy(IHTMLPaintSite *This,POINT ptGlobal,POINT *pptLocal);

  void __RPC_STUB IHTMLPaintSite_TransformGlobalToLocal_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPaintSite_TransformLocalToGlobal_Proxy(IHTMLPaintSite *This,POINT ptLocal,POINT *pptGlobal);

  void __RPC_STUB IHTMLPaintSite_TransformLocalToGlobal_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPaintSite_GetHitTestCookie_Proxy(IHTMLPaintSite *This,LONG *plCookie);

  void __RPC_STUB IHTMLPaintSite_GetHitTestCookie_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLPainterEventInfo_INTERFACE_DEFINED__
#define __IHTMLPainterEventInfo_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLPainterEventInfo;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLPainterEventInfo : public IUnknown
  {
  public:
    virtual HRESULT WINAPI GetEventInfoFlags(long *plEventInfoFlags) = 0;

    virtual HRESULT WINAPI GetEventTarget(IHTMLElement **ppElement) = 0;

    virtual HRESULT WINAPI SetCursor(LONG lPartID) = 0;

    virtual HRESULT WINAPI StringFromPartID(LONG lPartID,BSTR *pbstrPart) = 0;

  };
#else

  typedef struct IHTMLPainterEventInfoVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLPainterEventInfo *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLPainterEventInfo *This);

      ULONG (WINAPI *Release)(IHTMLPainterEventInfo *This);

      HRESULT (WINAPI *GetEventInfoFlags)(IHTMLPainterEventInfo *This,long *plEventInfoFlags);

      HRESULT (WINAPI *GetEventTarget)(IHTMLPainterEventInfo *This,IHTMLElement **ppElement);

      HRESULT (WINAPI *SetCursor)(IHTMLPainterEventInfo *This,LONG lPartID);

      HRESULT (WINAPI *StringFromPartID)(IHTMLPainterEventInfo *This,LONG lPartID,BSTR *pbstrPart);

    END_INTERFACE
  } IHTMLPainterEventInfoVtbl;

  interface IHTMLPainterEventInfo
  {
    CONST_VTBL struct IHTMLPainterEventInfoVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLPainterEventInfo_GetEventInfoFlags_Proxy(IHTMLPainterEventInfo *This,long *plEventInfoFlags);

  void __RPC_STUB IHTMLPainterEventInfo_GetEventInfoFlags_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPainterEventInfo_GetEventTarget_Proxy(IHTMLPainterEventInfo *This,IHTMLElement **ppElement);

  void __RPC_STUB IHTMLPainterEventInfo_GetEventTarget_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPainterEventInfo_SetCursor_Proxy(IHTMLPainterEventInfo *This,LONG lPartID);

  void __RPC_STUB IHTMLPainterEventInfo_SetCursor_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPainterEventInfo_StringFromPartID_Proxy(IHTMLPainterEventInfo *This,LONG lPartID,BSTR *pbstrPart);

  void __RPC_STUB IHTMLPainterEventInfo_StringFromPartID_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLPainterOverlay_INTERFACE_DEFINED__
#define __IHTMLPainterOverlay_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLPainterOverlay;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLPainterOverlay : public IUnknown
  {
  public:
    virtual HRESULT WINAPI OnMove(RECT rcDevice) = 0;

  };
#else

  typedef struct IHTMLPainterOverlayVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLPainterOverlay *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLPainterOverlay *This);

      ULONG (WINAPI *Release)(IHTMLPainterOverlay *This);

      HRESULT (WINAPI *OnMove)(IHTMLPainterOverlay *This,RECT rcDevice);

    END_INTERFACE
  } IHTMLPainterOverlayVtbl;

  interface IHTMLPainterOverlay
  {
    CONST_VTBL struct IHTMLPainterOverlayVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IHTMLPainterOverlay_OnMove(This,rcDevice) (This)->lpVtbl->OnMove(This,rcDevice)
#endif
#endif

  HRESULT WINAPI IHTMLPainterOverlay_OnMove_Proxy(IHTMLPainterOverlay *This,RECT rcDevice);

  void __RPC_STUB IHTMLPainterOverlay_OnMove_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLIPrintCollection_INTERFACE_DEFINED__
#define __IHTMLIPrintCollection_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLIPrintCollection;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLIPrintCollection : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get_length(long *p) = 0;

    virtual HRESULT WINAPI get__newEnum(IUnknown **p) = 0;

    virtual HRESULT WINAPI item(long index,IUnknown **ppIPrint) = 0;

  };
#else

  typedef struct IHTMLIPrintCollectionVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLIPrintCollection *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLIPrintCollection *This);

      ULONG (WINAPI *Release)(IHTMLIPrintCollection *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLIPrintCollection *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLIPrintCollection *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get_length)(IHTMLIPrintCollection *This,long *p);

      HRESULT (WINAPI *get__newEnum)(IHTMLIPrintCollection *This,IUnknown **p);

      HRESULT (WINAPI *item)(IHTMLIPrintCollection *This,long index,IUnknown **ppIPrint);

    END_INTERFACE
  } IHTMLIPrintCollectionVtbl;

  interface IHTMLIPrintCollection
  {
    CONST_VTBL struct IHTMLIPrintCollectionVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLIPrintCollection_get_length_Proxy(IHTMLIPrintCollection *This,long *p);

  void __RPC_STUB IHTMLIPrintCollection_get_length_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLIPrintCollection_get__newEnum_Proxy(IHTMLIPrintCollection *This,IUnknown **p);

  void __RPC_STUB IHTMLIPrintCollection_get__newEnum_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLIPrintCollection_item_Proxy(IHTMLIPrintCollection *This,long index,IUnknown **ppIPrint);

  void __RPC_STUB IHTMLIPrintCollection_item_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IEnumPrivacyRecords_INTERFACE_DEFINED__
#define __IEnumPrivacyRecords_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IEnumPrivacyRecords;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IEnumPrivacyRecords : public IUnknown
  {
  public:
    virtual HRESULT WINAPI Reset(void) = 0;

    virtual HRESULT WINAPI GetSize(ULONG *pSize) = 0;

    virtual HRESULT WINAPI GetPrivacyImpacted(WINBOOL *pState) = 0;

    virtual HRESULT WINAPI Next(BSTR *pbstrUrl,BSTR *pbstrPolicyRef,LONG *pdwReserved,DWORD *pdwPrivacyFlags) = 0;

  };
#else

  typedef struct IEnumPrivacyRecordsVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IEnumPrivacyRecords *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IEnumPrivacyRecords *This);

      ULONG (WINAPI *Release)(IEnumPrivacyRecords *This);

      HRESULT (WINAPI *Reset)(IEnumPrivacyRecords *This);

      HRESULT (WINAPI *GetSize)(IEnumPrivacyRecords *This,ULONG *pSize);

      HRESULT (WINAPI *GetPrivacyImpacted)(IEnumPrivacyRecords *This,WINBOOL *pState);

      HRESULT (WINAPI *Next)(IEnumPrivacyRecords *This,BSTR *pbstrUrl,BSTR *pbstrPolicyRef,LONG *pdwReserved,DWORD *pdwPrivacyFlags);

    END_INTERFACE
  } IEnumPrivacyRecordsVtbl;

  interface IEnumPrivacyRecords
  {
    CONST_VTBL struct IEnumPrivacyRecordsVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IEnumPrivacyRecords_Reset_Proxy(IEnumPrivacyRecords *This);

  void __RPC_STUB IEnumPrivacyRecords_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IEnumPrivacyRecords_GetSize_Proxy(IEnumPrivacyRecords *This,ULONG *pSize);

  void __RPC_STUB IEnumPrivacyRecords_GetSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IEnumPrivacyRecords_GetPrivacyImpacted_Proxy(IEnumPrivacyRecords *This,WINBOOL *pState);

  void __RPC_STUB IEnumPrivacyRecords_GetPrivacyImpacted_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IEnumPrivacyRecords_Next_Proxy(IEnumPrivacyRecords *This,BSTR *pbstrUrl,BSTR *pbstrPolicyRef,LONG *pdwReserved,DWORD *pdwPrivacyFlags);

  void __RPC_STUB IEnumPrivacyRecords_Next_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDialog_INTERFACE_DEFINED__
#define __IHTMLDialog_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLDialog;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLDialog : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_dialogTop(VARIANT v) = 0;

    virtual HRESULT WINAPI get_dialogTop(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_dialogLeft(VARIANT v) = 0;

    virtual HRESULT WINAPI get_dialogLeft(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_dialogWidth(VARIANT v) = 0;

    virtual HRESULT WINAPI get_dialogWidth(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_dialogHeight(VARIANT v) = 0;

    virtual HRESULT WINAPI get_dialogHeight(VARIANT *p) = 0;

    virtual HRESULT WINAPI get_dialogArguments(VARIANT *p) = 0;

    virtual HRESULT WINAPI get_menuArguments(VARIANT *p) = 0;

    virtual HRESULT WINAPI put_returnValue(VARIANT v) = 0;

    virtual HRESULT WINAPI get_returnValue(VARIANT *p) = 0;

    virtual HRESULT WINAPI close(void) = 0;

    virtual HRESULT WINAPI toString(BSTR *String) = 0;

  };
#else

  typedef struct IHTMLDialogVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLDialog *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLDialog *This);

      ULONG (WINAPI *Release)(IHTMLDialog *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDialog *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLDialog *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_dialogTop)(IHTMLDialog *This,VARIANT v);

      HRESULT (WINAPI *get_dialogTop)(IHTMLDialog *This,VARIANT *p);

      HRESULT (WINAPI *put_dialogLeft)(IHTMLDialog *This,VARIANT v);

      HRESULT (WINAPI *get_dialogLeft)(IHTMLDialog *This,VARIANT *p);

      HRESULT (WINAPI *put_dialogWidth)(IHTMLDialog *This,VARIANT v);

      HRESULT (WINAPI *get_dialogWidth)(IHTMLDialog *This,VARIANT *p);

      HRESULT (WINAPI *put_dialogHeight)(IHTMLDialog *This,VARIANT v);

      HRESULT (WINAPI *get_dialogHeight)(IHTMLDialog *This,VARIANT *p);

      HRESULT (WINAPI *get_dialogArguments)(IHTMLDialog *This,VARIANT *p);

      HRESULT (WINAPI *get_menuArguments)(IHTMLDialog *This,VARIANT *p);

      HRESULT (WINAPI *put_returnValue)(IHTMLDialog *This,VARIANT v);

      HRESULT (WINAPI *get_returnValue)(IHTMLDialog *This,VARIANT *p);

      HRESULT (WINAPI *close)(IHTMLDialog *This);

      HRESULT (WINAPI *toString)(IHTMLDialog *This,BSTR *String);

    END_INTERFACE
  } IHTMLDialogVtbl;

  interface IHTMLDialog
  {
    CONST_VTBL struct IHTMLDialogVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLDialog_put_dialogTop_Proxy(IHTMLDialog *This,VARIANT v);

  void __RPC_STUB IHTMLDialog_put_dialogTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog_get_dialogTop_Proxy(IHTMLDialog *This,VARIANT *p);

  void __RPC_STUB IHTMLDialog_get_dialogTop_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog_put_dialogLeft_Proxy(IHTMLDialog *This,VARIANT v);

  void __RPC_STUB IHTMLDialog_put_dialogLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog_get_dialogLeft_Proxy(IHTMLDialog *This,VARIANT *p);

  void __RPC_STUB IHTMLDialog_get_dialogLeft_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog_put_dialogWidth_Proxy(IHTMLDialog *This,VARIANT v);

  void __RPC_STUB IHTMLDialog_put_dialogWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog_get_dialogWidth_Proxy(IHTMLDialog *This,VARIANT *p);

  void __RPC_STUB IHTMLDialog_get_dialogWidth_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog_put_dialogHeight_Proxy(IHTMLDialog *This,VARIANT v);

  void __RPC_STUB IHTMLDialog_put_dialogHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog_get_dialogHeight_Proxy(IHTMLDialog *This,VARIANT *p);

  void __RPC_STUB IHTMLDialog_get_dialogHeight_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog_get_dialogArguments_Proxy(IHTMLDialog *This,VARIANT *p);

  void __RPC_STUB IHTMLDialog_get_dialogArguments_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog_get_menuArguments_Proxy(IHTMLDialog *This,VARIANT *p);

  void __RPC_STUB IHTMLDialog_get_menuArguments_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog_put_returnValue_Proxy(IHTMLDialog *This,VARIANT v);

  void __RPC_STUB IHTMLDialog_put_returnValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog_get_returnValue_Proxy(IHTMLDialog *This,VARIANT *p);

  void __RPC_STUB IHTMLDialog_get_returnValue_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog_close_Proxy(IHTMLDialog *This);

  void __RPC_STUB IHTMLDialog_close_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog_toString_Proxy(IHTMLDialog *This,BSTR *String);

  void __RPC_STUB IHTMLDialog_toString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDialog2_INTERFACE_DEFINED__
#define __IHTMLDialog2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLDialog2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLDialog2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_status(BSTR v) = 0;

    virtual HRESULT WINAPI get_status(BSTR *p) = 0;

    virtual HRESULT WINAPI put_resizable(BSTR v) = 0;

    virtual HRESULT WINAPI get_resizable(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLDialog2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLDialog2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLDialog2 *This);

      ULONG (WINAPI *Release)(IHTMLDialog2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDialog2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLDialog2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_status)(IHTMLDialog2 *This,BSTR v);

      HRESULT (WINAPI *get_status)(IHTMLDialog2 *This,BSTR *p);

      HRESULT (WINAPI *put_resizable)(IHTMLDialog2 *This,BSTR v);

      HRESULT (WINAPI *get_resizable)(IHTMLDialog2 *This,BSTR *p);

    END_INTERFACE
  } IHTMLDialog2Vtbl;

  interface IHTMLDialog2
  {
    CONST_VTBL struct IHTMLDialog2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLDialog2_put_status_Proxy(IHTMLDialog2 *This,BSTR v);

  void __RPC_STUB IHTMLDialog2_put_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog2_get_status_Proxy(IHTMLDialog2 *This,BSTR *p);

  void __RPC_STUB IHTMLDialog2_get_status_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog2_put_resizable_Proxy(IHTMLDialog2 *This,BSTR v);

  void __RPC_STUB IHTMLDialog2_put_resizable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog2_get_resizable_Proxy(IHTMLDialog2 *This,BSTR *p);

  void __RPC_STUB IHTMLDialog2_get_resizable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLDialog3_INTERFACE_DEFINED__
#define __IHTMLDialog3_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLDialog3;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLDialog3 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_unadorned(BSTR v) = 0;

    virtual HRESULT WINAPI get_unadorned(BSTR *p) = 0;

    virtual HRESULT WINAPI put_dialogHide(BSTR v) = 0;

    virtual HRESULT WINAPI get_dialogHide(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLDialog3Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLDialog3 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLDialog3 *This);

      ULONG (WINAPI *Release)(IHTMLDialog3 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLDialog3 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLDialog3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_unadorned)(IHTMLDialog3 *This,BSTR v);

      HRESULT (WINAPI *get_unadorned)(IHTMLDialog3 *This,BSTR *p);

      HRESULT (WINAPI *put_dialogHide)(IHTMLDialog3 *This,BSTR v);

      HRESULT (WINAPI *get_dialogHide)(IHTMLDialog3 *This,BSTR *p);

    END_INTERFACE
  } IHTMLDialog3Vtbl;

  interface IHTMLDialog3
  {
    CONST_VTBL struct IHTMLDialog3Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLDialog3_put_unadorned_Proxy(IHTMLDialog3 *This,BSTR v);

  void __RPC_STUB IHTMLDialog3_put_unadorned_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog3_get_unadorned_Proxy(IHTMLDialog3 *This,BSTR *p);

  void __RPC_STUB IHTMLDialog3_get_unadorned_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog3_put_dialogHide_Proxy(IHTMLDialog3 *This,BSTR v);

  void __RPC_STUB IHTMLDialog3_put_dialogHide_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLDialog3_get_dialogHide_Proxy(IHTMLDialog3 *This,BSTR *p);

  void __RPC_STUB IHTMLDialog3_get_dialogHide_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLModelessInit_INTERFACE_DEFINED__
#define __IHTMLModelessInit_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLModelessInit;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLModelessInit : public IDispatch
  {
  public:
    virtual HRESULT WINAPI get_parameters(VARIANT *p) = 0;

    virtual HRESULT WINAPI get_optionString(VARIANT *p) = 0;

    virtual HRESULT WINAPI get_moniker(IUnknown **p) = 0;

    virtual HRESULT WINAPI get_document(IUnknown **p) = 0;

  };
#else

  typedef struct IHTMLModelessInitVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLModelessInit *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLModelessInit *This);

      ULONG (WINAPI *Release)(IHTMLModelessInit *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLModelessInit *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLModelessInit *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *get_parameters)(IHTMLModelessInit *This,VARIANT *p);

      HRESULT (WINAPI *get_optionString)(IHTMLModelessInit *This,VARIANT *p);

      HRESULT (WINAPI *get_moniker)(IHTMLModelessInit *This,IUnknown **p);

      HRESULT (WINAPI *get_document)(IHTMLModelessInit *This,IUnknown **p);

    END_INTERFACE
  } IHTMLModelessInitVtbl;

  interface IHTMLModelessInit
  {
    CONST_VTBL struct IHTMLModelessInitVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLModelessInit_get_parameters_Proxy(IHTMLModelessInit *This,VARIANT *p);

  void __RPC_STUB IHTMLModelessInit_get_parameters_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLModelessInit_get_optionString_Proxy(IHTMLModelessInit *This,VARIANT *p);

  void __RPC_STUB IHTMLModelessInit_get_optionString_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLModelessInit_get_moniker_Proxy(IHTMLModelessInit *This,IUnknown **p);

  void __RPC_STUB IHTMLModelessInit_get_moniker_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLModelessInit_get_document_Proxy(IHTMLModelessInit *This,IUnknown **p);

  void __RPC_STUB IHTMLModelessInit_get_document_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

  EXTERN_C const CLSID CLSID_ThreadDialogProcParam;

#ifdef __cplusplus

  class ThreadDialogProcParam;
#endif

  EXTERN_C const CLSID CLSID_HTMLDialog;

#ifdef __cplusplus

  class HTMLDialog;
#endif

#ifndef __IHTMLPopup_INTERFACE_DEFINED__
#define __IHTMLPopup_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLPopup;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLPopup : public IDispatch
  {
  public:
    virtual HRESULT WINAPI show(long x,long y,long w,long h,VARIANT *pElement) = 0;

    virtual HRESULT WINAPI hide(void) = 0;

    virtual HRESULT WINAPI get_document(IHTMLDocument **p) = 0;

    virtual HRESULT WINAPI get_isOpen(VARIANT_BOOL *p) = 0;

  };
#else

  typedef struct IHTMLPopupVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLPopup *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLPopup *This);

      ULONG (WINAPI *Release)(IHTMLPopup *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLPopup *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLPopup *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *show)(IHTMLPopup *This,long x,long y,long w,long h,VARIANT *pElement);

      HRESULT (WINAPI *hide)(IHTMLPopup *This);

      HRESULT (WINAPI *get_document)(IHTMLPopup *This,IHTMLDocument **p);

      HRESULT (WINAPI *get_isOpen)(IHTMLPopup *This,VARIANT_BOOL *p);

    END_INTERFACE
  } IHTMLPopupVtbl;

  interface IHTMLPopup
  {
    CONST_VTBL struct IHTMLPopupVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLPopup_show_Proxy(IHTMLPopup *This,long x,long y,long w,long h,VARIANT *pElement);

  void __RPC_STUB IHTMLPopup_show_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPopup_hide_Proxy(IHTMLPopup *This);

  void __RPC_STUB IHTMLPopup_hide_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPopup_get_document_Proxy(IHTMLPopup *This,IHTMLDocument **p);

  void __RPC_STUB IHTMLPopup_get_document_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLPopup_get_isOpen_Proxy(IHTMLPopup *This,VARIANT_BOOL *p);

  void __RPC_STUB IHTMLPopup_get_isOpen_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLPopup_DISPINTERFACE_DEFINED__
#define __DispHTMLPopup_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLPopup;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLPopup : public IDispatch
  {
  };
#else

  typedef struct DispHTMLPopupVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLPopup *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLPopup *This);

      ULONG (WINAPI *Release)(DispHTMLPopup *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLPopup *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLPopup *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLPopupVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLPopup;

#ifdef __cplusplus

  class HTMLPopup;
#endif

#ifndef __IHTMLAppBehavior_INTERFACE_DEFINED__
#define __IHTMLAppBehavior_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLAppBehavior;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLAppBehavior : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_applicationName(BSTR v) = 0;

    virtual HRESULT WINAPI get_applicationName(BSTR *p) = 0;

    virtual HRESULT WINAPI put_version(BSTR v) = 0;

    virtual HRESULT WINAPI get_version(BSTR *p) = 0;

    virtual HRESULT WINAPI put_icon(BSTR v) = 0;

    virtual HRESULT WINAPI get_icon(BSTR *p) = 0;

    virtual HRESULT WINAPI put_singleInstance(BSTR v) = 0;

    virtual HRESULT WINAPI get_singleInstance(BSTR *p) = 0;

    virtual HRESULT WINAPI put_minimizeButton(BSTR v) = 0;

    virtual HRESULT WINAPI get_minimizeButton(BSTR *p) = 0;

    virtual HRESULT WINAPI put_maximizeButton(BSTR v) = 0;

    virtual HRESULT WINAPI get_maximizeButton(BSTR *p) = 0;

    virtual HRESULT WINAPI put_border(BSTR v) = 0;

    virtual HRESULT WINAPI get_border(BSTR *p) = 0;

    virtual HRESULT WINAPI put_borderStyle(BSTR v) = 0;

    virtual HRESULT WINAPI get_borderStyle(BSTR *p) = 0;

    virtual HRESULT WINAPI put_sysMenu(BSTR v) = 0;

    virtual HRESULT WINAPI get_sysMenu(BSTR *p) = 0;

    virtual HRESULT WINAPI put_caption(BSTR v) = 0;

    virtual HRESULT WINAPI get_caption(BSTR *p) = 0;

    virtual HRESULT WINAPI put_windowState(BSTR v) = 0;

    virtual HRESULT WINAPI get_windowState(BSTR *p) = 0;

    virtual HRESULT WINAPI put_showInTaskBar(BSTR v) = 0;

    virtual HRESULT WINAPI get_showInTaskBar(BSTR *p) = 0;

    virtual HRESULT WINAPI get_commandLine(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLAppBehaviorVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLAppBehavior *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLAppBehavior *This);

      ULONG (WINAPI *Release)(IHTMLAppBehavior *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLAppBehavior *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLAppBehavior *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_applicationName)(IHTMLAppBehavior *This,BSTR v);

      HRESULT (WINAPI *get_applicationName)(IHTMLAppBehavior *This,BSTR *p);

      HRESULT (WINAPI *put_version)(IHTMLAppBehavior *This,BSTR v);

      HRESULT (WINAPI *get_version)(IHTMLAppBehavior *This,BSTR *p);

      HRESULT (WINAPI *put_icon)(IHTMLAppBehavior *This,BSTR v);

      HRESULT (WINAPI *get_icon)(IHTMLAppBehavior *This,BSTR *p);

      HRESULT (WINAPI *put_singleInstance)(IHTMLAppBehavior *This,BSTR v);

      HRESULT (WINAPI *get_singleInstance)(IHTMLAppBehavior *This,BSTR *p);

      HRESULT (WINAPI *put_minimizeButton)(IHTMLAppBehavior *This,BSTR v);

      HRESULT (WINAPI *get_minimizeButton)(IHTMLAppBehavior *This,BSTR *p);

      HRESULT (WINAPI *put_maximizeButton)(IHTMLAppBehavior *This,BSTR v);

      HRESULT (WINAPI *get_maximizeButton)(IHTMLAppBehavior *This,BSTR *p);

      HRESULT (WINAPI *put_border)(IHTMLAppBehavior *This,BSTR v);

      HRESULT (WINAPI *get_border)(IHTMLAppBehavior *This,BSTR *p);

      HRESULT (WINAPI *put_borderStyle)(IHTMLAppBehavior *This,BSTR v);

      HRESULT (WINAPI *get_borderStyle)(IHTMLAppBehavior *This,BSTR *p);

      HRESULT (WINAPI *put_sysMenu)(IHTMLAppBehavior *This,BSTR v);

      HRESULT (WINAPI *get_sysMenu)(IHTMLAppBehavior *This,BSTR *p);

      HRESULT (WINAPI *put_caption)(IHTMLAppBehavior *This,BSTR v);

      HRESULT (WINAPI *get_caption)(IHTMLAppBehavior *This,BSTR *p);

      HRESULT (WINAPI *put_windowState)(IHTMLAppBehavior *This,BSTR v);

      HRESULT (WINAPI *get_windowState)(IHTMLAppBehavior *This,BSTR *p);

      HRESULT (WINAPI *put_showInTaskBar)(IHTMLAppBehavior *This,BSTR v);

      HRESULT (WINAPI *get_showInTaskBar)(IHTMLAppBehavior *This,BSTR *p);

      HRESULT (WINAPI *get_commandLine)(IHTMLAppBehavior *This,BSTR *p);

    END_INTERFACE
  } IHTMLAppBehaviorVtbl;

  interface IHTMLAppBehavior
  {
    CONST_VTBL struct IHTMLAppBehaviorVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLAppBehavior_put_applicationName_Proxy(IHTMLAppBehavior *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior_put_applicationName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_get_applicationName_Proxy(IHTMLAppBehavior *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior_get_applicationName_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_put_version_Proxy(IHTMLAppBehavior *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior_put_version_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_get_version_Proxy(IHTMLAppBehavior *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior_get_version_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_put_icon_Proxy(IHTMLAppBehavior *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior_put_icon_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_get_icon_Proxy(IHTMLAppBehavior *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior_get_icon_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_put_singleInstance_Proxy(IHTMLAppBehavior *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior_put_singleInstance_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_get_singleInstance_Proxy(IHTMLAppBehavior *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior_get_singleInstance_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_put_minimizeButton_Proxy(IHTMLAppBehavior *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior_put_minimizeButton_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_get_minimizeButton_Proxy(IHTMLAppBehavior *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior_get_minimizeButton_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_put_maximizeButton_Proxy(IHTMLAppBehavior *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior_put_maximizeButton_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_get_maximizeButton_Proxy(IHTMLAppBehavior *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior_get_maximizeButton_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_put_border_Proxy(IHTMLAppBehavior *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior_put_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_get_border_Proxy(IHTMLAppBehavior *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior_get_border_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_put_borderStyle_Proxy(IHTMLAppBehavior *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior_put_borderStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_get_borderStyle_Proxy(IHTMLAppBehavior *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior_get_borderStyle_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_put_sysMenu_Proxy(IHTMLAppBehavior *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior_put_sysMenu_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_get_sysMenu_Proxy(IHTMLAppBehavior *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior_get_sysMenu_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_put_caption_Proxy(IHTMLAppBehavior *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior_put_caption_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_get_caption_Proxy(IHTMLAppBehavior *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior_get_caption_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_put_windowState_Proxy(IHTMLAppBehavior *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior_put_windowState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_get_windowState_Proxy(IHTMLAppBehavior *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior_get_windowState_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_put_showInTaskBar_Proxy(IHTMLAppBehavior *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior_put_showInTaskBar_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_get_showInTaskBar_Proxy(IHTMLAppBehavior *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior_get_showInTaskBar_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior_get_commandLine_Proxy(IHTMLAppBehavior *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior_get_commandLine_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLAppBehavior2_INTERFACE_DEFINED__
#define __IHTMLAppBehavior2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLAppBehavior2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLAppBehavior2 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_contextMenu(BSTR v) = 0;

    virtual HRESULT WINAPI get_contextMenu(BSTR *p) = 0;

    virtual HRESULT WINAPI put_innerBorder(BSTR v) = 0;

    virtual HRESULT WINAPI get_innerBorder(BSTR *p) = 0;

    virtual HRESULT WINAPI put_scroll(BSTR v) = 0;

    virtual HRESULT WINAPI get_scroll(BSTR *p) = 0;

    virtual HRESULT WINAPI put_scrollFlat(BSTR v) = 0;

    virtual HRESULT WINAPI get_scrollFlat(BSTR *p) = 0;

    virtual HRESULT WINAPI put_selection(BSTR v) = 0;

    virtual HRESULT WINAPI get_selection(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLAppBehavior2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLAppBehavior2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLAppBehavior2 *This);

      ULONG (WINAPI *Release)(IHTMLAppBehavior2 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLAppBehavior2 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLAppBehavior2 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_contextMenu)(IHTMLAppBehavior2 *This,BSTR v);

      HRESULT (WINAPI *get_contextMenu)(IHTMLAppBehavior2 *This,BSTR *p);

      HRESULT (WINAPI *put_innerBorder)(IHTMLAppBehavior2 *This,BSTR v);

      HRESULT (WINAPI *get_innerBorder)(IHTMLAppBehavior2 *This,BSTR *p);

      HRESULT (WINAPI *put_scroll)(IHTMLAppBehavior2 *This,BSTR v);

      HRESULT (WINAPI *get_scroll)(IHTMLAppBehavior2 *This,BSTR *p);

      HRESULT (WINAPI *put_scrollFlat)(IHTMLAppBehavior2 *This,BSTR v);

      HRESULT (WINAPI *get_scrollFlat)(IHTMLAppBehavior2 *This,BSTR *p);

      HRESULT (WINAPI *put_selection)(IHTMLAppBehavior2 *This,BSTR v);

      HRESULT (WINAPI *get_selection)(IHTMLAppBehavior2 *This,BSTR *p);

    END_INTERFACE
  } IHTMLAppBehavior2Vtbl;

  interface IHTMLAppBehavior2
  {
    CONST_VTBL struct IHTMLAppBehavior2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#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)
#endif
#endif

  HRESULT WINAPI IHTMLAppBehavior2_put_contextMenu_Proxy(IHTMLAppBehavior2 *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior2_put_contextMenu_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior2_get_contextMenu_Proxy(IHTMLAppBehavior2 *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior2_get_contextMenu_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior2_put_innerBorder_Proxy(IHTMLAppBehavior2 *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior2_put_innerBorder_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior2_get_innerBorder_Proxy(IHTMLAppBehavior2 *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior2_get_innerBorder_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior2_put_scroll_Proxy(IHTMLAppBehavior2 *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior2_put_scroll_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior2_get_scroll_Proxy(IHTMLAppBehavior2 *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior2_get_scroll_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior2_put_scrollFlat_Proxy(IHTMLAppBehavior2 *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior2_put_scrollFlat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior2_get_scrollFlat_Proxy(IHTMLAppBehavior2 *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior2_get_scrollFlat_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior2_put_selection_Proxy(IHTMLAppBehavior2 *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior2_put_selection_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior2_get_selection_Proxy(IHTMLAppBehavior2 *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior2_get_selection_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHTMLAppBehavior3_INTERFACE_DEFINED__
#define __IHTMLAppBehavior3_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHTMLAppBehavior3;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHTMLAppBehavior3 : public IDispatch
  {
  public:
    virtual HRESULT WINAPI put_navigable(BSTR v) = 0;

    virtual HRESULT WINAPI get_navigable(BSTR *p) = 0;

  };
#else

  typedef struct IHTMLAppBehavior3Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IHTMLAppBehavior3 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IHTMLAppBehavior3 *This);

      ULONG (WINAPI *Release)(IHTMLAppBehavior3 *This);

      HRESULT (WINAPI *GetTypeInfoCount)(IHTMLAppBehavior3 *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(IHTMLAppBehavior3 *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

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

      HRESULT (WINAPI *put_navigable)(IHTMLAppBehavior3 *This,BSTR v);

      HRESULT (WINAPI *get_navigable)(IHTMLAppBehavior3 *This,BSTR *p);

    END_INTERFACE
  } IHTMLAppBehavior3Vtbl;

  interface IHTMLAppBehavior3
  {
    CONST_VTBL struct IHTMLAppBehavior3Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IHTMLAppBehavior3_put_navigable(This,v) (This)->lpVtbl->put_navigable(This,v)

#define IHTMLAppBehavior3_get_navigable(This,p) (This)->lpVtbl->get_navigable(This,p)
#endif
#endif

  HRESULT WINAPI IHTMLAppBehavior3_put_navigable_Proxy(IHTMLAppBehavior3 *This,BSTR v);

  void __RPC_STUB IHTMLAppBehavior3_put_navigable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IHTMLAppBehavior3_get_navigable_Proxy(IHTMLAppBehavior3 *This,BSTR *p);

  void __RPC_STUB IHTMLAppBehavior3_get_navigable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __DispHTMLAppBehavior_DISPINTERFACE_DEFINED__
#define __DispHTMLAppBehavior_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispHTMLAppBehavior;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispHTMLAppBehavior : public IDispatch
  {
  };
#else

  typedef struct DispHTMLAppBehaviorVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispHTMLAppBehavior *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispHTMLAppBehavior *This);

      ULONG (WINAPI *Release)(DispHTMLAppBehavior *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispHTMLAppBehavior *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispHTMLAppBehavior *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispHTMLAppBehaviorVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLAppBehavior;

#ifdef __cplusplus

  class HTMLAppBehavior;
#endif

  EXTERN_C const CLSID CLSID_OldHTMLDocument;

#ifdef __cplusplus

  class OldHTMLDocument;
#endif

  EXTERN_C const CLSID CLSID_OldHTMLFormElement;

#ifdef __cplusplus

  class OldHTMLFormElement;
#endif

#ifndef __DispIHTMLInputButtonElement_DISPINTERFACE_DEFINED__
#define __DispIHTMLInputButtonElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispIHTMLInputButtonElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispIHTMLInputButtonElement : public IDispatch
  {
  };
#else

  typedef struct DispIHTMLInputButtonElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispIHTMLInputButtonElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispIHTMLInputButtonElement *This);

      ULONG (WINAPI *Release)(DispIHTMLInputButtonElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispIHTMLInputButtonElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispIHTMLInputButtonElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispIHTMLInputButtonElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLInputButtonElement;

#ifdef __cplusplus

  class HTMLInputButtonElement;
#endif

#ifndef __DispIHTMLInputTextElement_DISPINTERFACE_DEFINED__
#define __DispIHTMLInputTextElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispIHTMLInputTextElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispIHTMLInputTextElement : public IDispatch
  {
  };
#else

  typedef struct DispIHTMLInputTextElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispIHTMLInputTextElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispIHTMLInputTextElement *This);

      ULONG (WINAPI *Release)(DispIHTMLInputTextElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispIHTMLInputTextElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispIHTMLInputTextElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispIHTMLInputTextElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLInputTextElement;

#ifdef __cplusplus

  class HTMLInputTextElement;
#endif

#ifndef __DispIHTMLInputFileElement_DISPINTERFACE_DEFINED__
#define __DispIHTMLInputFileElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispIHTMLInputFileElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispIHTMLInputFileElement : public IDispatch
  {
  };
#else

  typedef struct DispIHTMLInputFileElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispIHTMLInputFileElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispIHTMLInputFileElement *This);

      ULONG (WINAPI *Release)(DispIHTMLInputFileElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispIHTMLInputFileElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispIHTMLInputFileElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispIHTMLInputFileElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLInputFileElement;

#ifdef __cplusplus

  class HTMLInputFileElement;
#endif

#ifndef __DispIHTMLOptionButtonElement_DISPINTERFACE_DEFINED__
#define __DispIHTMLOptionButtonElement_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispIHTMLOptionButtonElement;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispIHTMLOptionButtonElement : public IDispatch
  {
  };
#else

  typedef struct DispIHTMLOptionButtonElementVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispIHTMLOptionButtonElement *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispIHTMLOptionButtonElement *This);

      ULONG (WINAPI *Release)(DispIHTMLOptionButtonElement *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispIHTMLOptionButtonElement *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispIHTMLOptionButtonElement *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispIHTMLOptionButtonElementVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLOptionButtonElement;

#ifdef __cplusplus

  class HTMLOptionButtonElement;
#endif

#ifndef __DispIHTMLInputImage_DISPINTERFACE_DEFINED__
#define __DispIHTMLInputImage_DISPINTERFACE_DEFINED__

  EXTERN_C const IID DIID_DispIHTMLInputImage;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct DispIHTMLInputImage : public IDispatch
  {
  };
#else

  typedef struct DispIHTMLInputImageVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(DispIHTMLInputImage *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(DispIHTMLInputImage *This);

      ULONG (WINAPI *Release)(DispIHTMLInputImage *This);

      HRESULT (WINAPI *GetTypeInfoCount)(DispIHTMLInputImage *This,UINT *pctinfo);

      HRESULT (WINAPI *GetTypeInfo)(DispIHTMLInputImage *This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo);

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

      HRESULT (WINAPI *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 struct DispIHTMLInputImageVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif
#endif

  EXTERN_C const CLSID CLSID_HTMLInputImage;

#ifdef __cplusplus

  class HTMLInputImage;
#endif

#ifndef __IElementNamespace_INTERFACE_DEFINED__
#define __IElementNamespace_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementNamespace;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementNamespace : public IUnknown
  {
  public:
    virtual HRESULT WINAPI AddTag(BSTR bstrTagName,LONG lFlags) = 0;

  };
#else

  typedef struct IElementNamespaceVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementNamespace *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementNamespace *This);

      ULONG (WINAPI *Release)(IElementNamespace *This);

      HRESULT (WINAPI *AddTag)(IElementNamespace *This,BSTR bstrTagName,LONG lFlags);

    END_INTERFACE
  } IElementNamespaceVtbl;

  interface IElementNamespace
  {
    CONST_VTBL struct IElementNamespaceVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IElementNamespace_AddTag(This,bstrTagName,lFlags) (This)->lpVtbl->AddTag(This,bstrTagName,lFlags)
#endif
#endif

  HRESULT WINAPI IElementNamespace_AddTag_Proxy(IElementNamespace *This,BSTR bstrTagName,LONG lFlags);

  void __RPC_STUB IElementNamespace_AddTag_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementNamespaceTable_INTERFACE_DEFINED__
#define __IElementNamespaceTable_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementNamespaceTable;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementNamespaceTable : public IUnknown
  {
  public:
    virtual HRESULT WINAPI AddNamespace(BSTR bstrNamespace,BSTR bstrUrn,LONG lFlags,VARIANT *pvarFactory) = 0;

  };
#else

  typedef struct IElementNamespaceTableVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementNamespaceTable *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementNamespaceTable *This);

      ULONG (WINAPI *Release)(IElementNamespaceTable *This);

      HRESULT (WINAPI *AddNamespace)(IElementNamespaceTable *This,BSTR bstrNamespace,BSTR bstrUrn,LONG lFlags,VARIANT *pvarFactory);

    END_INTERFACE
  } IElementNamespaceTableVtbl;

  interface IElementNamespaceTable
  {
    CONST_VTBL struct IElementNamespaceTableVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IElementNamespaceTable_AddNamespace(This,bstrNamespace,bstrUrn,lFlags,pvarFactory) (This)->lpVtbl->AddNamespace(This,bstrNamespace,bstrUrn,lFlags,pvarFactory)
#endif
#endif

  HRESULT WINAPI IElementNamespaceTable_AddNamespace_Proxy(IElementNamespaceTable *This,BSTR bstrNamespace,BSTR bstrUrn,LONG lFlags,VARIANT *pvarFactory);

  void __RPC_STUB IElementNamespaceTable_AddNamespace_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementNamespaceFactory_INTERFACE_DEFINED__
#define __IElementNamespaceFactory_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementNamespaceFactory;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementNamespaceFactory : public IUnknown
  {
  public:
    virtual HRESULT WINAPI Create(IElementNamespace *pNamespace) = 0;

  };
#else

  typedef struct IElementNamespaceFactoryVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementNamespaceFactory *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementNamespaceFactory *This);

      ULONG (WINAPI *Release)(IElementNamespaceFactory *This);

      HRESULT (WINAPI *Create)(IElementNamespaceFactory *This,IElementNamespace *pNamespace);

    END_INTERFACE
  } IElementNamespaceFactoryVtbl;

  interface IElementNamespaceFactory
  {
    CONST_VTBL struct IElementNamespaceFactoryVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IElementNamespaceFactory_Create(This,pNamespace) (This)->lpVtbl->Create(This,pNamespace)
#endif
#endif

  HRESULT WINAPI IElementNamespaceFactory_Create_Proxy(IElementNamespaceFactory *This,IElementNamespace *pNamespace);

  void __RPC_STUB IElementNamespaceFactory_Create_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementNamespaceFactory2_INTERFACE_DEFINED__
#define __IElementNamespaceFactory2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementNamespaceFactory2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementNamespaceFactory2 : public IElementNamespaceFactory
  {
  public:
    virtual HRESULT WINAPI CreateWithImplementation(IElementNamespace *pNamespace,BSTR bstrImplementation) = 0;

  };
#else

  typedef struct IElementNamespaceFactory2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementNamespaceFactory2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementNamespaceFactory2 *This);

      ULONG (WINAPI *Release)(IElementNamespaceFactory2 *This);

      HRESULT (WINAPI *Create)(IElementNamespaceFactory2 *This,IElementNamespace *pNamespace);

      HRESULT (WINAPI *CreateWithImplementation)(IElementNamespaceFactory2 *This,IElementNamespace *pNamespace,BSTR bstrImplementation);

    END_INTERFACE
  } IElementNamespaceFactory2Vtbl;

  interface IElementNamespaceFactory2
  {
    CONST_VTBL struct IElementNamespaceFactory2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IElementNamespaceFactory2_Create(This,pNamespace) (This)->lpVtbl->Create(This,pNamespace)

#define IElementNamespaceFactory2_CreateWithImplementation(This,pNamespace,bstrImplementation) (This)->lpVtbl->CreateWithImplementation(This,pNamespace,bstrImplementation)
#endif
#endif

  HRESULT WINAPI IElementNamespaceFactory2_CreateWithImplementation_Proxy(IElementNamespaceFactory2 *This,IElementNamespace *pNamespace,BSTR bstrImplementation);

  void __RPC_STUB IElementNamespaceFactory2_CreateWithImplementation_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementNamespaceFactoryCallback_INTERFACE_DEFINED__
#define __IElementNamespaceFactoryCallback_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementNamespaceFactoryCallback;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementNamespaceFactoryCallback : public IUnknown
  {
  public:
    virtual HRESULT WINAPI Resolve(BSTR bstrNamespace,BSTR bstrTagName,BSTR bstrAttrs,IElementNamespace *pNamespace) = 0;

  };
#else

  typedef struct IElementNamespaceFactoryCallbackVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementNamespaceFactoryCallback *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementNamespaceFactoryCallback *This);

      ULONG (WINAPI *Release)(IElementNamespaceFactoryCallback *This);

      HRESULT (WINAPI *Resolve)(IElementNamespaceFactoryCallback *This,BSTR bstrNamespace,BSTR bstrTagName,BSTR bstrAttrs,IElementNamespace *pNamespace);

    END_INTERFACE
  } IElementNamespaceFactoryCallbackVtbl;

  interface IElementNamespaceFactoryCallback
  {
    CONST_VTBL struct IElementNamespaceFactoryCallbackVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IElementNamespaceFactoryCallback_Resolve(This,bstrNamespace,bstrTagName,bstrAttrs,pNamespace) (This)->lpVtbl->Resolve(This,bstrNamespace,bstrTagName,bstrAttrs,pNamespace)
#endif
#endif

  HRESULT WINAPI IElementNamespaceFactoryCallback_Resolve_Proxy(IElementNamespaceFactoryCallback *This,BSTR bstrNamespace,BSTR bstrTagName,BSTR bstrAttrs,IElementNamespace *pNamespace);

  void __RPC_STUB IElementNamespaceFactoryCallback_Resolve_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehaviorSiteOM2_INTERFACE_DEFINED__
#define __IElementBehaviorSiteOM2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementBehaviorSiteOM2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementBehaviorSiteOM2 : public IElementBehaviorSiteOM
  {
  public:
    virtual HRESULT WINAPI GetDefaults(IHTMLElementDefaults **ppDefaults) = 0;

  };
#else

  typedef struct IElementBehaviorSiteOM2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementBehaviorSiteOM2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementBehaviorSiteOM2 *This);

      ULONG (WINAPI *Release)(IElementBehaviorSiteOM2 *This);

      HRESULT (WINAPI *RegisterEvent)(IElementBehaviorSiteOM2 *This,LPOLESTR pchEvent,LONG lFlags,LONG *plCookie);

      HRESULT (WINAPI *GetEventCookie)(IElementBehaviorSiteOM2 *This,LPOLESTR pchEvent,LONG *plCookie);

      HRESULT (WINAPI *FireEvent)(IElementBehaviorSiteOM2 *This,LONG lCookie,IHTMLEventObj *pEventObject);

      HRESULT (WINAPI *CreateEventObject)(IElementBehaviorSiteOM2 *This,IHTMLEventObj **ppEventObject);

      HRESULT (WINAPI *RegisterName)(IElementBehaviorSiteOM2 *This,LPOLESTR pchName);

      HRESULT (WINAPI *RegisterUrn)(IElementBehaviorSiteOM2 *This,LPOLESTR pchUrn);

      HRESULT (WINAPI *GetDefaults)(IElementBehaviorSiteOM2 *This,IHTMLElementDefaults **ppDefaults);

    END_INTERFACE
  } IElementBehaviorSiteOM2Vtbl;

  interface IElementBehaviorSiteOM2
  {
    CONST_VTBL struct IElementBehaviorSiteOM2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)

#define IElementBehaviorSiteOM2_GetDefaults(This,ppDefaults) (This)->lpVtbl->GetDefaults(This,ppDefaults)
#endif
#endif

  HRESULT WINAPI IElementBehaviorSiteOM2_GetDefaults_Proxy(IElementBehaviorSiteOM2 *This,IHTMLElementDefaults **ppDefaults);

  void __RPC_STUB IElementBehaviorSiteOM2_GetDefaults_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehaviorCategory_INTERFACE_DEFINED__
#define __IElementBehaviorCategory_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementBehaviorCategory;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementBehaviorCategory : public IUnknown
  {
  public:
    virtual HRESULT WINAPI GetCategory(LPOLESTR *ppchCategory) = 0;

  };
#else

  typedef struct IElementBehaviorCategoryVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementBehaviorCategory *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementBehaviorCategory *This);

      ULONG (WINAPI *Release)(IElementBehaviorCategory *This);

      HRESULT (WINAPI *GetCategory)(IElementBehaviorCategory *This,LPOLESTR *ppchCategory);

    END_INTERFACE
  } IElementBehaviorCategoryVtbl;

  interface IElementBehaviorCategory
  {
    CONST_VTBL struct IElementBehaviorCategoryVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IElementBehaviorCategory_GetCategory(This,ppchCategory) (This)->lpVtbl->GetCategory(This,ppchCategory)
#endif
#endif

  HRESULT WINAPI IElementBehaviorCategory_GetCategory_Proxy(IElementBehaviorCategory *This,LPOLESTR *ppchCategory);

  void __RPC_STUB IElementBehaviorCategory_GetCategory_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehaviorSiteCategory_INTERFACE_DEFINED__
#define __IElementBehaviorSiteCategory_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementBehaviorSiteCategory;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementBehaviorSiteCategory : public IUnknown
  {
  public:
    virtual HRESULT WINAPI GetRelatedBehaviors(LONG lDirection,LPOLESTR pchCategory,IEnumUnknown **ppEnumerator) = 0;

  };
#else

  typedef struct IElementBehaviorSiteCategoryVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementBehaviorSiteCategory *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementBehaviorSiteCategory *This);

      ULONG (WINAPI *Release)(IElementBehaviorSiteCategory *This);

      HRESULT (WINAPI *GetRelatedBehaviors)(IElementBehaviorSiteCategory *This,LONG lDirection,LPOLESTR pchCategory,IEnumUnknown **ppEnumerator);

    END_INTERFACE
  } IElementBehaviorSiteCategoryVtbl;

  interface IElementBehaviorSiteCategory
  {
    CONST_VTBL struct IElementBehaviorSiteCategoryVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IElementBehaviorSiteCategory_GetRelatedBehaviors(This,lDirection,pchCategory,ppEnumerator) (This)->lpVtbl->GetRelatedBehaviors(This,lDirection,pchCategory,ppEnumerator)
#endif
#endif

  HRESULT WINAPI IElementBehaviorSiteCategory_GetRelatedBehaviors_Proxy(IElementBehaviorSiteCategory *This,LONG lDirection,LPOLESTR pchCategory,IEnumUnknown **ppEnumerator);

  void __RPC_STUB IElementBehaviorSiteCategory_GetRelatedBehaviors_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehaviorSubmit_INTERFACE_DEFINED__
#define __IElementBehaviorSubmit_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementBehaviorSubmit;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementBehaviorSubmit : public IUnknown
  {
  public:
    virtual HRESULT WINAPI GetSubmitInfo(IHTMLSubmitData *pSubmitData) = 0;

    virtual HRESULT WINAPI Reset(void) = 0;

  };
#else

  typedef struct IElementBehaviorSubmitVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementBehaviorSubmit *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementBehaviorSubmit *This);

      ULONG (WINAPI *Release)(IElementBehaviorSubmit *This);

      HRESULT (WINAPI *GetSubmitInfo)(IElementBehaviorSubmit *This,IHTMLSubmitData *pSubmitData);

      HRESULT (WINAPI *Reset)(IElementBehaviorSubmit *This);

    END_INTERFACE
  } IElementBehaviorSubmitVtbl;

  interface IElementBehaviorSubmit
  {
    CONST_VTBL struct IElementBehaviorSubmitVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IElementBehaviorSubmit_GetSubmitInfo(This,pSubmitData) (This)->lpVtbl->GetSubmitInfo(This,pSubmitData)

#define IElementBehaviorSubmit_Reset(This) (This)->lpVtbl->Reset(This)
#endif
#endif

  HRESULT WINAPI IElementBehaviorSubmit_GetSubmitInfo_Proxy(IElementBehaviorSubmit *This,IHTMLSubmitData *pSubmitData);

  void __RPC_STUB IElementBehaviorSubmit_GetSubmitInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IElementBehaviorSubmit_Reset_Proxy(IElementBehaviorSubmit *This);

  void __RPC_STUB IElementBehaviorSubmit_Reset_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehaviorFocus_INTERFACE_DEFINED__
#define __IElementBehaviorFocus_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementBehaviorFocus;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementBehaviorFocus : public IUnknown
  {
  public:
    virtual HRESULT WINAPI GetFocusRect(RECT *pRect) = 0;

  };
#else

  typedef struct IElementBehaviorFocusVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementBehaviorFocus *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementBehaviorFocus *This);

      ULONG (WINAPI *Release)(IElementBehaviorFocus *This);

      HRESULT (WINAPI *GetFocusRect)(IElementBehaviorFocus *This,RECT *pRect);

    END_INTERFACE
  } IElementBehaviorFocusVtbl;

  interface IElementBehaviorFocus
  {
    CONST_VTBL struct IElementBehaviorFocusVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IElementBehaviorFocus_GetFocusRect(This,pRect) (This)->lpVtbl->GetFocusRect(This,pRect)
#endif
#endif

  HRESULT WINAPI IElementBehaviorFocus_GetFocusRect_Proxy(IElementBehaviorFocus *This,RECT *pRect);

  void __RPC_STUB IElementBehaviorFocus_GetFocusRect_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehaviorLayout_INTERFACE_DEFINED__
#define __IElementBehaviorLayout_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementBehaviorLayout;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementBehaviorLayout : public IUnknown
  {
  public:
    virtual HRESULT WINAPI GetSize(LONG dwFlags,SIZE sizeContent,POINT *pptTranslateBy,POINT *pptTopLeft,SIZE *psizeProposed) = 0;

    virtual HRESULT WINAPI GetLayoutInfo(LONG *plLayoutInfo) = 0;

    virtual HRESULT WINAPI GetPosition(LONG lFlags,POINT *pptTopLeft) = 0;

    virtual HRESULT WINAPI MapSize(SIZE *psizeIn,RECT *prcOut) = 0;

  };
#else

  typedef struct IElementBehaviorLayoutVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementBehaviorLayout *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementBehaviorLayout *This);

      ULONG (WINAPI *Release)(IElementBehaviorLayout *This);

      HRESULT (WINAPI *GetSize)(IElementBehaviorLayout *This,LONG dwFlags,SIZE sizeContent,POINT *pptTranslateBy,POINT *pptTopLeft,SIZE *psizeProposed);

      HRESULT (WINAPI *GetLayoutInfo)(IElementBehaviorLayout *This,LONG *plLayoutInfo);

      HRESULT (WINAPI *GetPosition)(IElementBehaviorLayout *This,LONG lFlags,POINT *pptTopLeft);

      HRESULT (WINAPI *MapSize)(IElementBehaviorLayout *This,SIZE *psizeIn,RECT *prcOut);

    END_INTERFACE
  } IElementBehaviorLayoutVtbl;

  interface IElementBehaviorLayout
  {
    CONST_VTBL struct IElementBehaviorLayoutVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IElementBehaviorLayout_GetSize_Proxy(IElementBehaviorLayout *This,LONG dwFlags,SIZE sizeContent,POINT *pptTranslateBy,POINT *pptTopLeft,SIZE *psizeProposed);

  void __RPC_STUB IElementBehaviorLayout_GetSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IElementBehaviorLayout_GetLayoutInfo_Proxy(IElementBehaviorLayout *This,LONG *plLayoutInfo);

  void __RPC_STUB IElementBehaviorLayout_GetLayoutInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IElementBehaviorLayout_GetPosition_Proxy(IElementBehaviorLayout *This,LONG lFlags,POINT *pptTopLeft);

  void __RPC_STUB IElementBehaviorLayout_GetPosition_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IElementBehaviorLayout_MapSize_Proxy(IElementBehaviorLayout *This,SIZE *psizeIn,RECT *prcOut);

  void __RPC_STUB IElementBehaviorLayout_MapSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehaviorLayout2_INTERFACE_DEFINED__
#define __IElementBehaviorLayout2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementBehaviorLayout2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementBehaviorLayout2 : public IUnknown
  {
  public:
    virtual HRESULT WINAPI GetTextDescent(LONG *plDescent) = 0;

  };
#else

  typedef struct IElementBehaviorLayout2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementBehaviorLayout2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementBehaviorLayout2 *This);

      ULONG (WINAPI *Release)(IElementBehaviorLayout2 *This);

      HRESULT (WINAPI *GetTextDescent)(IElementBehaviorLayout2 *This,LONG *plDescent);

    END_INTERFACE
  } IElementBehaviorLayout2Vtbl;

  interface IElementBehaviorLayout2
  {
    CONST_VTBL struct IElementBehaviorLayout2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#define IElementBehaviorLayout2_GetTextDescent(This,plDescent) (This)->lpVtbl->GetTextDescent(This,plDescent)
#endif
#endif

  HRESULT WINAPI IElementBehaviorLayout2_GetTextDescent_Proxy(IElementBehaviorLayout2 *This,LONG *plDescent);

  void __RPC_STUB IElementBehaviorLayout2_GetTextDescent_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehaviorSiteLayout_INTERFACE_DEFINED__
#define __IElementBehaviorSiteLayout_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementBehaviorSiteLayout;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementBehaviorSiteLayout : public IUnknown
  {
  public:
    virtual HRESULT WINAPI InvalidateLayoutInfo(void) = 0;

    virtual HRESULT WINAPI InvalidateSize(void) = 0;

    virtual HRESULT WINAPI GetMediaResolution(SIZE *psizeResolution) = 0;

  };
#else

  typedef struct IElementBehaviorSiteLayoutVtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementBehaviorSiteLayout *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementBehaviorSiteLayout *This);

      ULONG (WINAPI *Release)(IElementBehaviorSiteLayout *This);

      HRESULT (WINAPI *InvalidateLayoutInfo)(IElementBehaviorSiteLayout *This);

      HRESULT (WINAPI *InvalidateSize)(IElementBehaviorSiteLayout *This);

      HRESULT (WINAPI *GetMediaResolution)(IElementBehaviorSiteLayout *This,SIZE *psizeResolution);

    END_INTERFACE
  } IElementBehaviorSiteLayoutVtbl;

  interface IElementBehaviorSiteLayout
  {
    CONST_VTBL struct IElementBehaviorSiteLayoutVtbl *lpVtbl;
  };

#ifdef COBJMACROS

#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)

#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)
#endif
#endif

  HRESULT WINAPI IElementBehaviorSiteLayout_InvalidateLayoutInfo_Proxy(IElementBehaviorSiteLayout *This);

  void __RPC_STUB IElementBehaviorSiteLayout_InvalidateLayoutInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IElementBehaviorSiteLayout_InvalidateSize_Proxy(IElementBehaviorSiteLayout *This);

  void __RPC_STUB IElementBehaviorSiteLayout_InvalidateSize_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);

  HRESULT WINAPI IElementBehaviorSiteLayout_GetMediaResolution_Proxy(IElementBehaviorSiteLayout *This,SIZE *psizeResolution);

  void __RPC_STUB IElementBehaviorSiteLayout_GetMediaResolution_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IElementBehaviorSiteLayout2_INTERFACE_DEFINED__
#define __IElementBehaviorSiteLayout2_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IElementBehaviorSiteLayout2;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IElementBehaviorSiteLayout2 : public IUnknown {
  public:
    virtual HRESULT WINAPI GetFontInfo(LOGFONTW *plf) = 0;

  };
#else

  typedef struct IElementBehaviorSiteLayout2Vtbl
  {
    BEGIN_INTERFACE

      HRESULT (WINAPI *QueryInterface)(IElementBehaviorSiteLayout2 *This,REFIID riid,void **ppvObject);

      ULONG (WINAPI *AddRef)(IElementBehaviorSiteLayout2 *This);

      ULONG (WINAPI *Release)(IElementBehaviorSiteLayout2 *This);

      HRESULT (WINAPI *GetFontInfo)(IElementBehaviorSiteLayout2 *This,LOGFONTW *plf);

    END_INTERFACE
  } IElementBehaviorSiteLayout2Vtbl;

  interface IElementBehaviorSiteLayout2
  {
    CONST_VTBL struct IElementBehaviorSiteLayout2Vtbl *lpVtbl;
  };

#ifdef COBJMACROS
#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)
#define IElementBehaviorSiteLayout2_GetFontInfo(This,plf) (This)->lpVtbl->GetFontInfo(This,plf)
#endif
#endif

  HRESULT WINAPI IElementBehaviorSiteLayout2_GetFontInfo_Proxy(IElementBehaviorSiteLayout2 *This,LOGFONTW *plf);

  void __RPC_STUB IElementBehaviorSiteLayout2_GetFontInfo_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif

#ifndef __IHostBehaviorInit_INTERFACE_DEFINED__
#define __IHostBehaviorInit_INTERFACE_DEFINED__

  EXTERN_C const IID IID_IHostBehaviorInit;

#if defined(__cplusplus) && !defined(CINTERFACE)

  struct IHostBehaviorInit : public IUnknown {
  public:
    virtual HRESULT WINAPI PopulateNamespaceTable(void) = 0;
  };
#else
  typedef struct IHostBehaviorInitVtbl {
    BEGIN_INTERFACE
      HRESULT (WINAPI *QueryInterface)(IHostBehaviorInit *This,REFIID riid,void **ppvObject);
      ULONG (WINAPI *AddRef)(IHostBehaviorInit *This);
      ULONG (WINAPI *Release)(IHostBehaviorInit *This);
      HRESULT (WINAPI *PopulateNamespaceTable)(IHostBehaviorInit *This);
    END_INTERFACE
  } IHostBehaviorInitVtbl;
  interface IHostBehaviorInit {
    CONST_VTBL struct IHostBehaviorInitVtbl *lpVtbl;
  };
#ifdef COBJMACROS
#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)
#define IHostBehaviorInit_PopulateNamespaceTable(This) (This)->lpVtbl->PopulateNamespaceTable(This)
#endif
#endif
  HRESULT WINAPI IHostBehaviorInit_PopulateNamespaceTable_Proxy(IHostBehaviorInit *This);
  void __RPC_STUB IHostBehaviorInit_PopulateNamespaceTable_Stub(IRpcStubBuffer *This,IRpcChannelBuffer *_pRpcChannelBuffer,PRPC_MESSAGE _pRpcMessage,DWORD *_pdwStubPhase);
#endif
#endif

  unsigned long __RPC_API VARIANT_UserSize(unsigned long *,unsigned long,VARIANT *);
  unsigned char *__RPC_API VARIANT_UserMarshal(unsigned long *,unsigned char *,VARIANT *);
  unsigned char *__RPC_API VARIANT_UserUnmarshal(unsigned long *,unsigned char *,VARIANT *);
  void __RPC_API VARIANT_UserFree(unsigned long *,VARIANT *);

#ifdef __cplusplus
}
#endif
#endif
