/*** Autogenerated by WIDL 8.12 from include/msxml2.idl - Do not edit ***/

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

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

#ifndef __msxml2_h__
#define __msxml2_h__

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

/* Forward declarations */

#ifndef __IXMLElementCollection_FWD_DEFINED__
#define __IXMLElementCollection_FWD_DEFINED__
typedef interface IXMLElementCollection IXMLElementCollection;
#ifdef __cplusplus
interface IXMLElementCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXMLElement_FWD_DEFINED__
#define __IXMLElement_FWD_DEFINED__
typedef interface IXMLElement IXMLElement;
#ifdef __cplusplus
interface IXMLElement;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMNode_FWD_DEFINED__
#define __IXMLDOMNode_FWD_DEFINED__
typedef interface IXMLDOMNode IXMLDOMNode;
#ifdef __cplusplus
interface IXMLDOMNode;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMDocument_FWD_DEFINED__
#define __IXMLDOMDocument_FWD_DEFINED__
typedef interface IXMLDOMDocument IXMLDOMDocument;
#ifdef __cplusplus
interface IXMLDOMDocument;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMSchemaCollection_FWD_DEFINED__
#define __IXMLDOMSchemaCollection_FWD_DEFINED__
typedef interface IXMLDOMSchemaCollection IXMLDOMSchemaCollection;
#ifdef __cplusplus
interface IXMLDOMSchemaCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMSchemaCollection2_FWD_DEFINED__
#define __IXMLDOMSchemaCollection2_FWD_DEFINED__
typedef interface IXMLDOMSchemaCollection2 IXMLDOMSchemaCollection2;
#ifdef __cplusplus
interface IXMLDOMSchemaCollection2;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMDocument2_FWD_DEFINED__
#define __IXMLDOMDocument2_FWD_DEFINED__
typedef interface IXMLDOMDocument2 IXMLDOMDocument2;
#ifdef __cplusplus
interface IXMLDOMDocument2;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMDocument3_FWD_DEFINED__
#define __IXMLDOMDocument3_FWD_DEFINED__
typedef interface IXMLDOMDocument3 IXMLDOMDocument3;
#ifdef __cplusplus
interface IXMLDOMDocument3;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMNodeList_FWD_DEFINED__
#define __IXMLDOMNodeList_FWD_DEFINED__
typedef interface IXMLDOMNodeList IXMLDOMNodeList;
#ifdef __cplusplus
interface IXMLDOMNodeList;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMSelection_FWD_DEFINED__
#define __IXMLDOMSelection_FWD_DEFINED__
typedef interface IXMLDOMSelection IXMLDOMSelection;
#ifdef __cplusplus
interface IXMLDOMSelection;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMNamedNodeMap_FWD_DEFINED__
#define __IXMLDOMNamedNodeMap_FWD_DEFINED__
typedef interface IXMLDOMNamedNodeMap IXMLDOMNamedNodeMap;
#ifdef __cplusplus
interface IXMLDOMNamedNodeMap;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMDocumentFragment_FWD_DEFINED__
#define __IXMLDOMDocumentFragment_FWD_DEFINED__
typedef interface IXMLDOMDocumentFragment IXMLDOMDocumentFragment;
#ifdef __cplusplus
interface IXMLDOMDocumentFragment;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMCharacterData_FWD_DEFINED__
#define __IXMLDOMCharacterData_FWD_DEFINED__
typedef interface IXMLDOMCharacterData IXMLDOMCharacterData;
#ifdef __cplusplus
interface IXMLDOMCharacterData;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMAttribute_FWD_DEFINED__
#define __IXMLDOMAttribute_FWD_DEFINED__
typedef interface IXMLDOMAttribute IXMLDOMAttribute;
#ifdef __cplusplus
interface IXMLDOMAttribute;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMElement_FWD_DEFINED__
#define __IXMLDOMElement_FWD_DEFINED__
typedef interface IXMLDOMElement IXMLDOMElement;
#ifdef __cplusplus
interface IXMLDOMElement;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMText_FWD_DEFINED__
#define __IXMLDOMText_FWD_DEFINED__
typedef interface IXMLDOMText IXMLDOMText;
#ifdef __cplusplus
interface IXMLDOMText;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMComment_FWD_DEFINED__
#define __IXMLDOMComment_FWD_DEFINED__
typedef interface IXMLDOMComment IXMLDOMComment;
#ifdef __cplusplus
interface IXMLDOMComment;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMProcessingInstruction_FWD_DEFINED__
#define __IXMLDOMProcessingInstruction_FWD_DEFINED__
typedef interface IXMLDOMProcessingInstruction IXMLDOMProcessingInstruction;
#ifdef __cplusplus
interface IXMLDOMProcessingInstruction;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMCDATASection_FWD_DEFINED__
#define __IXMLDOMCDATASection_FWD_DEFINED__
typedef interface IXMLDOMCDATASection IXMLDOMCDATASection;
#ifdef __cplusplus
interface IXMLDOMCDATASection;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMDocumentType_FWD_DEFINED__
#define __IXMLDOMDocumentType_FWD_DEFINED__
typedef interface IXMLDOMDocumentType IXMLDOMDocumentType;
#ifdef __cplusplus
interface IXMLDOMDocumentType;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMNotation_FWD_DEFINED__
#define __IXMLDOMNotation_FWD_DEFINED__
typedef interface IXMLDOMNotation IXMLDOMNotation;
#ifdef __cplusplus
interface IXMLDOMNotation;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMEntity_FWD_DEFINED__
#define __IXMLDOMEntity_FWD_DEFINED__
typedef interface IXMLDOMEntity IXMLDOMEntity;
#ifdef __cplusplus
interface IXMLDOMEntity;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMEntityReference_FWD_DEFINED__
#define __IXMLDOMEntityReference_FWD_DEFINED__
typedef interface IXMLDOMEntityReference IXMLDOMEntityReference;
#ifdef __cplusplus
interface IXMLDOMEntityReference;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMImplementation_FWD_DEFINED__
#define __IXMLDOMImplementation_FWD_DEFINED__
typedef interface IXMLDOMImplementation IXMLDOMImplementation;
#ifdef __cplusplus
interface IXMLDOMImplementation;
#endif /* __cplusplus */
#endif

#ifndef __IXTLRuntime_FWD_DEFINED__
#define __IXTLRuntime_FWD_DEFINED__
typedef interface IXTLRuntime IXTLRuntime;
#ifdef __cplusplus
interface IXTLRuntime;
#endif /* __cplusplus */
#endif

#ifndef __IDSOControl_FWD_DEFINED__
#define __IDSOControl_FWD_DEFINED__
typedef interface IDSOControl IDSOControl;
#ifdef __cplusplus
interface IDSOControl;
#endif /* __cplusplus */
#endif

#ifndef __XMLDOMDocumentEvents_FWD_DEFINED__
#define __XMLDOMDocumentEvents_FWD_DEFINED__
typedef interface XMLDOMDocumentEvents XMLDOMDocumentEvents;
#ifdef __cplusplus
interface XMLDOMDocumentEvents;
#endif /* __cplusplus */
#endif

#ifndef __IXSLProcessor_FWD_DEFINED__
#define __IXSLProcessor_FWD_DEFINED__
typedef interface IXSLProcessor IXSLProcessor;
#ifdef __cplusplus
interface IXSLProcessor;
#endif /* __cplusplus */
#endif

#ifndef __IXSLTemplate_FWD_DEFINED__
#define __IXSLTemplate_FWD_DEFINED__
typedef interface IXSLTemplate IXSLTemplate;
#ifdef __cplusplus
interface IXSLTemplate;
#endif /* __cplusplus */
#endif

#ifndef __IXMLHTTPRequest_FWD_DEFINED__
#define __IXMLHTTPRequest_FWD_DEFINED__
typedef interface IXMLHTTPRequest IXMLHTTPRequest;
#ifdef __cplusplus
interface IXMLHTTPRequest;
#endif /* __cplusplus */
#endif

#ifndef __IServerXMLHTTPRequest_FWD_DEFINED__
#define __IServerXMLHTTPRequest_FWD_DEFINED__
typedef interface IServerXMLHTTPRequest IServerXMLHTTPRequest;
#ifdef __cplusplus
interface IServerXMLHTTPRequest;
#endif /* __cplusplus */
#endif

#ifndef __IServerXMLHTTPRequest2_FWD_DEFINED__
#define __IServerXMLHTTPRequest2_FWD_DEFINED__
typedef interface IServerXMLHTTPRequest2 IServerXMLHTTPRequest2;
#ifdef __cplusplus
interface IServerXMLHTTPRequest2;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMParseError_FWD_DEFINED__
#define __IXMLDOMParseError_FWD_DEFINED__
typedef interface IXMLDOMParseError IXMLDOMParseError;
#ifdef __cplusplus
interface IXMLDOMParseError;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMParseError2_FWD_DEFINED__
#define __IXMLDOMParseError2_FWD_DEFINED__
typedef interface IXMLDOMParseError2 IXMLDOMParseError2;
#ifdef __cplusplus
interface IXMLDOMParseError2;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMParseErrorCollection_FWD_DEFINED__
#define __IXMLDOMParseErrorCollection_FWD_DEFINED__
typedef interface IXMLDOMParseErrorCollection IXMLDOMParseErrorCollection;
#ifdef __cplusplus
interface IXMLDOMParseErrorCollection;
#endif /* __cplusplus */
#endif

#ifndef __DOMDocument26_FWD_DEFINED__
#define __DOMDocument26_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMDocument26 DOMDocument26;
#else
typedef struct DOMDocument26 DOMDocument26;
#endif /* defined __cplusplus */
#endif /* defined __DOMDocument26_FWD_DEFINED__ */

#ifndef __DOMDocument30_FWD_DEFINED__
#define __DOMDocument30_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMDocument30 DOMDocument30;
#else
typedef struct DOMDocument30 DOMDocument30;
#endif /* defined __cplusplus */
#endif /* defined __DOMDocument30_FWD_DEFINED__ */

#ifndef __DOMDocument40_FWD_DEFINED__
#define __DOMDocument40_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMDocument40 DOMDocument40;
#else
typedef struct DOMDocument40 DOMDocument40;
#endif /* defined __cplusplus */
#endif /* defined __DOMDocument40_FWD_DEFINED__ */

#ifndef __DOMDocument60_FWD_DEFINED__
#define __DOMDocument60_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMDocument60 DOMDocument60;
#else
typedef struct DOMDocument60 DOMDocument60;
#endif /* defined __cplusplus */
#endif /* defined __DOMDocument60_FWD_DEFINED__ */

#ifndef __DOMDocument_FWD_DEFINED__
#define __DOMDocument_FWD_DEFINED__
#ifdef __cplusplus
typedef class DOMDocument DOMDocument;
#else
typedef struct DOMDocument DOMDocument;
#endif /* defined __cplusplus */
#endif /* defined __DOMDocument_FWD_DEFINED__ */

#ifndef __FreeThreadedDOMDocument26_FWD_DEFINED__
#define __FreeThreadedDOMDocument26_FWD_DEFINED__
#ifdef __cplusplus
typedef class FreeThreadedDOMDocument26 FreeThreadedDOMDocument26;
#else
typedef struct FreeThreadedDOMDocument26 FreeThreadedDOMDocument26;
#endif /* defined __cplusplus */
#endif /* defined __FreeThreadedDOMDocument26_FWD_DEFINED__ */

#ifndef __FreeThreadedDOMDocument30_FWD_DEFINED__
#define __FreeThreadedDOMDocument30_FWD_DEFINED__
#ifdef __cplusplus
typedef class FreeThreadedDOMDocument30 FreeThreadedDOMDocument30;
#else
typedef struct FreeThreadedDOMDocument30 FreeThreadedDOMDocument30;
#endif /* defined __cplusplus */
#endif /* defined __FreeThreadedDOMDocument30_FWD_DEFINED__ */

#ifndef __FreeThreadedDOMDocument40_FWD_DEFINED__
#define __FreeThreadedDOMDocument40_FWD_DEFINED__
#ifdef __cplusplus
typedef class FreeThreadedDOMDocument40 FreeThreadedDOMDocument40;
#else
typedef struct FreeThreadedDOMDocument40 FreeThreadedDOMDocument40;
#endif /* defined __cplusplus */
#endif /* defined __FreeThreadedDOMDocument40_FWD_DEFINED__ */

#ifndef __FreeThreadedDOMDocument60_FWD_DEFINED__
#define __FreeThreadedDOMDocument60_FWD_DEFINED__
#ifdef __cplusplus
typedef class FreeThreadedDOMDocument60 FreeThreadedDOMDocument60;
#else
typedef struct FreeThreadedDOMDocument60 FreeThreadedDOMDocument60;
#endif /* defined __cplusplus */
#endif /* defined __FreeThreadedDOMDocument60_FWD_DEFINED__ */

#ifndef __FreeThreadedDOMDocument_FWD_DEFINED__
#define __FreeThreadedDOMDocument_FWD_DEFINED__
#ifdef __cplusplus
typedef class FreeThreadedDOMDocument FreeThreadedDOMDocument;
#else
typedef struct FreeThreadedDOMDocument FreeThreadedDOMDocument;
#endif /* defined __cplusplus */
#endif /* defined __FreeThreadedDOMDocument_FWD_DEFINED__ */

#ifndef __XMLHTTP26_FWD_DEFINED__
#define __XMLHTTP26_FWD_DEFINED__
#ifdef __cplusplus
typedef class XMLHTTP26 XMLHTTP26;
#else
typedef struct XMLHTTP26 XMLHTTP26;
#endif /* defined __cplusplus */
#endif /* defined __XMLHTTP26_FWD_DEFINED__ */

#ifndef __XMLHTTP30_FWD_DEFINED__
#define __XMLHTTP30_FWD_DEFINED__
#ifdef __cplusplus
typedef class XMLHTTP30 XMLHTTP30;
#else
typedef struct XMLHTTP30 XMLHTTP30;
#endif /* defined __cplusplus */
#endif /* defined __XMLHTTP30_FWD_DEFINED__ */

#ifndef __XMLHTTP40_FWD_DEFINED__
#define __XMLHTTP40_FWD_DEFINED__
#ifdef __cplusplus
typedef class XMLHTTP40 XMLHTTP40;
#else
typedef struct XMLHTTP40 XMLHTTP40;
#endif /* defined __cplusplus */
#endif /* defined __XMLHTTP40_FWD_DEFINED__ */

#ifndef __XMLHTTP60_FWD_DEFINED__
#define __XMLHTTP60_FWD_DEFINED__
#ifdef __cplusplus
typedef class XMLHTTP60 XMLHTTP60;
#else
typedef struct XMLHTTP60 XMLHTTP60;
#endif /* defined __cplusplus */
#endif /* defined __XMLHTTP60_FWD_DEFINED__ */

#ifndef __XMLHTTP_FWD_DEFINED__
#define __XMLHTTP_FWD_DEFINED__
#ifdef __cplusplus
typedef class XMLHTTP XMLHTTP;
#else
typedef struct XMLHTTP XMLHTTP;
#endif /* defined __cplusplus */
#endif /* defined __XMLHTTP_FWD_DEFINED__ */

#ifndef __ServerXMLHTTP30_FWD_DEFINED__
#define __ServerXMLHTTP30_FWD_DEFINED__
#ifdef __cplusplus
typedef class ServerXMLHTTP30 ServerXMLHTTP30;
#else
typedef struct ServerXMLHTTP30 ServerXMLHTTP30;
#endif /* defined __cplusplus */
#endif /* defined __ServerXMLHTTP30_FWD_DEFINED__ */

#ifndef __ServerXMLHTTP40_FWD_DEFINED__
#define __ServerXMLHTTP40_FWD_DEFINED__
#ifdef __cplusplus
typedef class ServerXMLHTTP40 ServerXMLHTTP40;
#else
typedef struct ServerXMLHTTP40 ServerXMLHTTP40;
#endif /* defined __cplusplus */
#endif /* defined __ServerXMLHTTP40_FWD_DEFINED__ */

#ifndef __ServerXMLHTTP60_FWD_DEFINED__
#define __ServerXMLHTTP60_FWD_DEFINED__
#ifdef __cplusplus
typedef class ServerXMLHTTP60 ServerXMLHTTP60;
#else
typedef struct ServerXMLHTTP60 ServerXMLHTTP60;
#endif /* defined __cplusplus */
#endif /* defined __ServerXMLHTTP60_FWD_DEFINED__ */

#ifndef __ServerXMLHTTP_FWD_DEFINED__
#define __ServerXMLHTTP_FWD_DEFINED__
#ifdef __cplusplus
typedef class ServerXMLHTTP ServerXMLHTTP;
#else
typedef struct ServerXMLHTTP ServerXMLHTTP;
#endif /* defined __cplusplus */
#endif /* defined __ServerXMLHTTP_FWD_DEFINED__ */

#ifndef __XMLSchemaCache26_FWD_DEFINED__
#define __XMLSchemaCache26_FWD_DEFINED__
#ifdef __cplusplus
typedef class XMLSchemaCache26 XMLSchemaCache26;
#else
typedef struct XMLSchemaCache26 XMLSchemaCache26;
#endif /* defined __cplusplus */
#endif /* defined __XMLSchemaCache26_FWD_DEFINED__ */

#ifndef __XMLSchemaCache30_FWD_DEFINED__
#define __XMLSchemaCache30_FWD_DEFINED__
#ifdef __cplusplus
typedef class XMLSchemaCache30 XMLSchemaCache30;
#else
typedef struct XMLSchemaCache30 XMLSchemaCache30;
#endif /* defined __cplusplus */
#endif /* defined __XMLSchemaCache30_FWD_DEFINED__ */

#ifndef __XMLSchemaCache40_FWD_DEFINED__
#define __XMLSchemaCache40_FWD_DEFINED__
#ifdef __cplusplus
typedef class XMLSchemaCache40 XMLSchemaCache40;
#else
typedef struct XMLSchemaCache40 XMLSchemaCache40;
#endif /* defined __cplusplus */
#endif /* defined __XMLSchemaCache40_FWD_DEFINED__ */

#ifndef __XMLSchemaCache60_FWD_DEFINED__
#define __XMLSchemaCache60_FWD_DEFINED__
#ifdef __cplusplus
typedef class XMLSchemaCache60 XMLSchemaCache60;
#else
typedef struct XMLSchemaCache60 XMLSchemaCache60;
#endif /* defined __cplusplus */
#endif /* defined __XMLSchemaCache60_FWD_DEFINED__ */

#ifndef __XMLSchemaCache_FWD_DEFINED__
#define __XMLSchemaCache_FWD_DEFINED__
#ifdef __cplusplus
typedef class XMLSchemaCache XMLSchemaCache;
#else
typedef struct XMLSchemaCache XMLSchemaCache;
#endif /* defined __cplusplus */
#endif /* defined __XMLSchemaCache_FWD_DEFINED__ */

#ifndef __XSLTemplate26_FWD_DEFINED__
#define __XSLTemplate26_FWD_DEFINED__
#ifdef __cplusplus
typedef class XSLTemplate26 XSLTemplate26;
#else
typedef struct XSLTemplate26 XSLTemplate26;
#endif /* defined __cplusplus */
#endif /* defined __XSLTemplate26_FWD_DEFINED__ */

#ifndef __XSLTemplate30_FWD_DEFINED__
#define __XSLTemplate30_FWD_DEFINED__
#ifdef __cplusplus
typedef class XSLTemplate30 XSLTemplate30;
#else
typedef struct XSLTemplate30 XSLTemplate30;
#endif /* defined __cplusplus */
#endif /* defined __XSLTemplate30_FWD_DEFINED__ */

#ifndef __XSLTemplate40_FWD_DEFINED__
#define __XSLTemplate40_FWD_DEFINED__
#ifdef __cplusplus
typedef class XSLTemplate40 XSLTemplate40;
#else
typedef struct XSLTemplate40 XSLTemplate40;
#endif /* defined __cplusplus */
#endif /* defined __XSLTemplate40_FWD_DEFINED__ */

#ifndef __XSLTemplate60_FWD_DEFINED__
#define __XSLTemplate60_FWD_DEFINED__
#ifdef __cplusplus
typedef class XSLTemplate60 XSLTemplate60;
#else
typedef struct XSLTemplate60 XSLTemplate60;
#endif /* defined __cplusplus */
#endif /* defined __XSLTemplate60_FWD_DEFINED__ */

#ifndef __XSLTemplate_FWD_DEFINED__
#define __XSLTemplate_FWD_DEFINED__
#ifdef __cplusplus
typedef class XSLTemplate XSLTemplate;
#else
typedef struct XSLTemplate XSLTemplate;
#endif /* defined __cplusplus */
#endif /* defined __XSLTemplate_FWD_DEFINED__ */

#ifndef __ISAXAttributes_FWD_DEFINED__
#define __ISAXAttributes_FWD_DEFINED__
typedef interface ISAXAttributes ISAXAttributes;
#ifdef __cplusplus
interface ISAXAttributes;
#endif /* __cplusplus */
#endif

#ifndef __ISAXContentHandler_FWD_DEFINED__
#define __ISAXContentHandler_FWD_DEFINED__
typedef interface ISAXContentHandler ISAXContentHandler;
#ifdef __cplusplus
interface ISAXContentHandler;
#endif /* __cplusplus */
#endif

#ifndef __ISAXDeclHandler_FWD_DEFINED__
#define __ISAXDeclHandler_FWD_DEFINED__
typedef interface ISAXDeclHandler ISAXDeclHandler;
#ifdef __cplusplus
interface ISAXDeclHandler;
#endif /* __cplusplus */
#endif

#ifndef __ISAXDTDHandler_FWD_DEFINED__
#define __ISAXDTDHandler_FWD_DEFINED__
typedef interface ISAXDTDHandler ISAXDTDHandler;
#ifdef __cplusplus
interface ISAXDTDHandler;
#endif /* __cplusplus */
#endif

#ifndef __ISAXEntityResolver_FWD_DEFINED__
#define __ISAXEntityResolver_FWD_DEFINED__
typedef interface ISAXEntityResolver ISAXEntityResolver;
#ifdef __cplusplus
interface ISAXEntityResolver;
#endif /* __cplusplus */
#endif

#ifndef __ISAXErrorHandler_FWD_DEFINED__
#define __ISAXErrorHandler_FWD_DEFINED__
typedef interface ISAXErrorHandler ISAXErrorHandler;
#ifdef __cplusplus
interface ISAXErrorHandler;
#endif /* __cplusplus */
#endif

#ifndef __ISAXLexicalHandler_FWD_DEFINED__
#define __ISAXLexicalHandler_FWD_DEFINED__
typedef interface ISAXLexicalHandler ISAXLexicalHandler;
#ifdef __cplusplus
interface ISAXLexicalHandler;
#endif /* __cplusplus */
#endif

#ifndef __ISAXLocator_FWD_DEFINED__
#define __ISAXLocator_FWD_DEFINED__
typedef interface ISAXLocator ISAXLocator;
#ifdef __cplusplus
interface ISAXLocator;
#endif /* __cplusplus */
#endif

#ifndef __ISAXXMLReader_FWD_DEFINED__
#define __ISAXXMLReader_FWD_DEFINED__
typedef interface ISAXXMLReader ISAXXMLReader;
#ifdef __cplusplus
interface ISAXXMLReader;
#endif /* __cplusplus */
#endif

#ifndef __ISAXXMLFilter_FWD_DEFINED__
#define __ISAXXMLFilter_FWD_DEFINED__
typedef interface ISAXXMLFilter ISAXXMLFilter;
#ifdef __cplusplus
interface ISAXXMLFilter;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXAttributes_FWD_DEFINED__
#define __IVBSAXAttributes_FWD_DEFINED__
typedef interface IVBSAXAttributes IVBSAXAttributes;
#ifdef __cplusplus
interface IVBSAXAttributes;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXContentHandler_FWD_DEFINED__
#define __IVBSAXContentHandler_FWD_DEFINED__
typedef interface IVBSAXContentHandler IVBSAXContentHandler;
#ifdef __cplusplus
interface IVBSAXContentHandler;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXDeclHandler_FWD_DEFINED__
#define __IVBSAXDeclHandler_FWD_DEFINED__
typedef interface IVBSAXDeclHandler IVBSAXDeclHandler;
#ifdef __cplusplus
interface IVBSAXDeclHandler;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXDTDHandler_FWD_DEFINED__
#define __IVBSAXDTDHandler_FWD_DEFINED__
typedef interface IVBSAXDTDHandler IVBSAXDTDHandler;
#ifdef __cplusplus
interface IVBSAXDTDHandler;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXEntityResolver_FWD_DEFINED__
#define __IVBSAXEntityResolver_FWD_DEFINED__
typedef interface IVBSAXEntityResolver IVBSAXEntityResolver;
#ifdef __cplusplus
interface IVBSAXEntityResolver;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXErrorHandler_FWD_DEFINED__
#define __IVBSAXErrorHandler_FWD_DEFINED__
typedef interface IVBSAXErrorHandler IVBSAXErrorHandler;
#ifdef __cplusplus
interface IVBSAXErrorHandler;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXLexicalHandler_FWD_DEFINED__
#define __IVBSAXLexicalHandler_FWD_DEFINED__
typedef interface IVBSAXLexicalHandler IVBSAXLexicalHandler;
#ifdef __cplusplus
interface IVBSAXLexicalHandler;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXLocator_FWD_DEFINED__
#define __IVBSAXLocator_FWD_DEFINED__
typedef interface IVBSAXLocator IVBSAXLocator;
#ifdef __cplusplus
interface IVBSAXLocator;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXXMLFilter_FWD_DEFINED__
#define __IVBSAXXMLFilter_FWD_DEFINED__
typedef interface IVBSAXXMLFilter IVBSAXXMLFilter;
#ifdef __cplusplus
interface IVBSAXXMLFilter;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXXMLReader_FWD_DEFINED__
#define __IVBSAXXMLReader_FWD_DEFINED__
typedef interface IVBSAXXMLReader IVBSAXXMLReader;
#ifdef __cplusplus
interface IVBSAXXMLReader;
#endif /* __cplusplus */
#endif

#ifndef __IMXAttributes_FWD_DEFINED__
#define __IMXAttributes_FWD_DEFINED__
typedef interface IMXAttributes IMXAttributes;
#ifdef __cplusplus
interface IMXAttributes;
#endif /* __cplusplus */
#endif

#ifndef __IMXSchemaDeclHandler_FWD_DEFINED__
#define __IMXSchemaDeclHandler_FWD_DEFINED__
typedef interface IMXSchemaDeclHandler IMXSchemaDeclHandler;
#ifdef __cplusplus
interface IMXSchemaDeclHandler;
#endif /* __cplusplus */
#endif

#ifndef __IMXReaderControl_FWD_DEFINED__
#define __IMXReaderControl_FWD_DEFINED__
typedef interface IMXReaderControl IMXReaderControl;
#ifdef __cplusplus
interface IMXReaderControl;
#endif /* __cplusplus */
#endif

#ifndef __IMXWriter_FWD_DEFINED__
#define __IMXWriter_FWD_DEFINED__
typedef interface IMXWriter IMXWriter;
#ifdef __cplusplus
interface IMXWriter;
#endif /* __cplusplus */
#endif

#ifndef __IMXNamespacePrefixes_FWD_DEFINED__
#define __IMXNamespacePrefixes_FWD_DEFINED__
typedef interface IMXNamespacePrefixes IMXNamespacePrefixes;
#ifdef __cplusplus
interface IMXNamespacePrefixes;
#endif /* __cplusplus */
#endif

#ifndef __IMXNamespaceManager_FWD_DEFINED__
#define __IMXNamespaceManager_FWD_DEFINED__
typedef interface IMXNamespaceManager IMXNamespaceManager;
#ifdef __cplusplus
interface IMXNamespaceManager;
#endif /* __cplusplus */
#endif

#ifndef __IVBMXNamespaceManager_FWD_DEFINED__
#define __IVBMXNamespaceManager_FWD_DEFINED__
typedef interface IVBMXNamespaceManager IVBMXNamespaceManager;
#ifdef __cplusplus
interface IVBMXNamespaceManager;
#endif /* __cplusplus */
#endif

#ifndef __IMXXMLFilter_FWD_DEFINED__
#define __IMXXMLFilter_FWD_DEFINED__
typedef interface IMXXMLFilter IMXXMLFilter;
#ifdef __cplusplus
interface IMXXMLFilter;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaStringCollection_FWD_DEFINED__
#define __ISchemaStringCollection_FWD_DEFINED__
typedef interface ISchemaStringCollection ISchemaStringCollection;
#ifdef __cplusplus
interface ISchemaStringCollection;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaItemCollection_FWD_DEFINED__
#define __ISchemaItemCollection_FWD_DEFINED__
typedef interface ISchemaItemCollection ISchemaItemCollection;
#ifdef __cplusplus
interface ISchemaItemCollection;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaItem_FWD_DEFINED__
#define __ISchemaItem_FWD_DEFINED__
typedef interface ISchemaItem ISchemaItem;
#ifdef __cplusplus
interface ISchemaItem;
#endif /* __cplusplus */
#endif

#ifndef __ISchema_FWD_DEFINED__
#define __ISchema_FWD_DEFINED__
typedef interface ISchema ISchema;
#ifdef __cplusplus
interface ISchema;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaParticle_FWD_DEFINED__
#define __ISchemaParticle_FWD_DEFINED__
typedef interface ISchemaParticle ISchemaParticle;
#ifdef __cplusplus
interface ISchemaParticle;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaAttribute_FWD_DEFINED__
#define __ISchemaAttribute_FWD_DEFINED__
typedef interface ISchemaAttribute ISchemaAttribute;
#ifdef __cplusplus
interface ISchemaAttribute;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaElement_FWD_DEFINED__
#define __ISchemaElement_FWD_DEFINED__
typedef interface ISchemaElement ISchemaElement;
#ifdef __cplusplus
interface ISchemaElement;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaType_FWD_DEFINED__
#define __ISchemaType_FWD_DEFINED__
typedef interface ISchemaType ISchemaType;
#ifdef __cplusplus
interface ISchemaType;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaComplexType_FWD_DEFINED__
#define __ISchemaComplexType_FWD_DEFINED__
typedef interface ISchemaComplexType ISchemaComplexType;
#ifdef __cplusplus
interface ISchemaComplexType;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaAttributeGroup_FWD_DEFINED__
#define __ISchemaAttributeGroup_FWD_DEFINED__
typedef interface ISchemaAttributeGroup ISchemaAttributeGroup;
#ifdef __cplusplus
interface ISchemaAttributeGroup;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaModelGroup_FWD_DEFINED__
#define __ISchemaModelGroup_FWD_DEFINED__
typedef interface ISchemaModelGroup ISchemaModelGroup;
#ifdef __cplusplus
interface ISchemaModelGroup;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaAny_FWD_DEFINED__
#define __ISchemaAny_FWD_DEFINED__
typedef interface ISchemaAny ISchemaAny;
#ifdef __cplusplus
interface ISchemaAny;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaIdentityConstraint_FWD_DEFINED__
#define __ISchemaIdentityConstraint_FWD_DEFINED__
typedef interface ISchemaIdentityConstraint ISchemaIdentityConstraint;
#ifdef __cplusplus
interface ISchemaIdentityConstraint;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaNotation_FWD_DEFINED__
#define __ISchemaNotation_FWD_DEFINED__
typedef interface ISchemaNotation ISchemaNotation;
#ifdef __cplusplus
interface ISchemaNotation;
#endif /* __cplusplus */
#endif

#ifndef __SAXXMLReader30_FWD_DEFINED__
#define __SAXXMLReader30_FWD_DEFINED__
#ifdef __cplusplus
typedef class SAXXMLReader30 SAXXMLReader30;
#else
typedef struct SAXXMLReader30 SAXXMLReader30;
#endif /* defined __cplusplus */
#endif /* defined __SAXXMLReader30_FWD_DEFINED__ */

#ifndef __SAXXMLReader40_FWD_DEFINED__
#define __SAXXMLReader40_FWD_DEFINED__
#ifdef __cplusplus
typedef class SAXXMLReader40 SAXXMLReader40;
#else
typedef struct SAXXMLReader40 SAXXMLReader40;
#endif /* defined __cplusplus */
#endif /* defined __SAXXMLReader40_FWD_DEFINED__ */

#ifndef __SAXXMLReader60_FWD_DEFINED__
#define __SAXXMLReader60_FWD_DEFINED__
#ifdef __cplusplus
typedef class SAXXMLReader60 SAXXMLReader60;
#else
typedef struct SAXXMLReader60 SAXXMLReader60;
#endif /* defined __cplusplus */
#endif /* defined __SAXXMLReader60_FWD_DEFINED__ */

#ifndef __SAXXMLReader_FWD_DEFINED__
#define __SAXXMLReader_FWD_DEFINED__
#ifdef __cplusplus
typedef class SAXXMLReader SAXXMLReader;
#else
typedef struct SAXXMLReader SAXXMLReader;
#endif /* defined __cplusplus */
#endif /* defined __SAXXMLReader_FWD_DEFINED__ */

#ifndef __MXHTMLWriter_FWD_DEFINED__
#define __MXHTMLWriter_FWD_DEFINED__
#ifdef __cplusplus
typedef class MXHTMLWriter MXHTMLWriter;
#else
typedef struct MXHTMLWriter MXHTMLWriter;
#endif /* defined __cplusplus */
#endif /* defined __MXHTMLWriter_FWD_DEFINED__ */

#ifndef __MXHTMLWriter30_FWD_DEFINED__
#define __MXHTMLWriter30_FWD_DEFINED__
#ifdef __cplusplus
typedef class MXHTMLWriter30 MXHTMLWriter30;
#else
typedef struct MXHTMLWriter30 MXHTMLWriter30;
#endif /* defined __cplusplus */
#endif /* defined __MXHTMLWriter30_FWD_DEFINED__ */

#ifndef __MXHTMLWriter40_FWD_DEFINED__
#define __MXHTMLWriter40_FWD_DEFINED__
#ifdef __cplusplus
typedef class MXHTMLWriter40 MXHTMLWriter40;
#else
typedef struct MXHTMLWriter40 MXHTMLWriter40;
#endif /* defined __cplusplus */
#endif /* defined __MXHTMLWriter40_FWD_DEFINED__ */

#ifndef __MXHTMLWriter60_FWD_DEFINED__
#define __MXHTMLWriter60_FWD_DEFINED__
#ifdef __cplusplus
typedef class MXHTMLWriter60 MXHTMLWriter60;
#else
typedef struct MXHTMLWriter60 MXHTMLWriter60;
#endif /* defined __cplusplus */
#endif /* defined __MXHTMLWriter60_FWD_DEFINED__ */

#ifndef __MXXMLWriter30_FWD_DEFINED__
#define __MXXMLWriter30_FWD_DEFINED__
#ifdef __cplusplus
typedef class MXXMLWriter30 MXXMLWriter30;
#else
typedef struct MXXMLWriter30 MXXMLWriter30;
#endif /* defined __cplusplus */
#endif /* defined __MXXMLWriter30_FWD_DEFINED__ */

#ifndef __MXXMLWriter40_FWD_DEFINED__
#define __MXXMLWriter40_FWD_DEFINED__
#ifdef __cplusplus
typedef class MXXMLWriter40 MXXMLWriter40;
#else
typedef struct MXXMLWriter40 MXXMLWriter40;
#endif /* defined __cplusplus */
#endif /* defined __MXXMLWriter40_FWD_DEFINED__ */

#ifndef __MXXMLWriter60_FWD_DEFINED__
#define __MXXMLWriter60_FWD_DEFINED__
#ifdef __cplusplus
typedef class MXXMLWriter60 MXXMLWriter60;
#else
typedef struct MXXMLWriter60 MXXMLWriter60;
#endif /* defined __cplusplus */
#endif /* defined __MXXMLWriter60_FWD_DEFINED__ */

#ifndef __MXXMLWriter_FWD_DEFINED__
#define __MXXMLWriter_FWD_DEFINED__
#ifdef __cplusplus
typedef class MXXMLWriter MXXMLWriter;
#else
typedef struct MXXMLWriter MXXMLWriter;
#endif /* defined __cplusplus */
#endif /* defined __MXXMLWriter_FWD_DEFINED__ */

#ifndef __MXNamespaceManager_FWD_DEFINED__
#define __MXNamespaceManager_FWD_DEFINED__
#ifdef __cplusplus
typedef class MXNamespaceManager MXNamespaceManager;
#else
typedef struct MXNamespaceManager MXNamespaceManager;
#endif /* defined __cplusplus */
#endif /* defined __MXNamespaceManager_FWD_DEFINED__ */

#ifndef __MXNamespaceManager40_FWD_DEFINED__
#define __MXNamespaceManager40_FWD_DEFINED__
#ifdef __cplusplus
typedef class MXNamespaceManager40 MXNamespaceManager40;
#else
typedef struct MXNamespaceManager40 MXNamespaceManager40;
#endif /* defined __cplusplus */
#endif /* defined __MXNamespaceManager40_FWD_DEFINED__ */

#ifndef __MXNamespaceManager60_FWD_DEFINED__
#define __MXNamespaceManager60_FWD_DEFINED__
#ifdef __cplusplus
typedef class MXNamespaceManager60 MXNamespaceManager60;
#else
typedef struct MXNamespaceManager60 MXNamespaceManager60;
#endif /* defined __cplusplus */
#endif /* defined __MXNamespaceManager60_FWD_DEFINED__ */

#ifndef __SAXAttributes30_FWD_DEFINED__
#define __SAXAttributes30_FWD_DEFINED__
#ifdef __cplusplus
typedef class SAXAttributes30 SAXAttributes30;
#else
typedef struct SAXAttributes30 SAXAttributes30;
#endif /* defined __cplusplus */
#endif /* defined __SAXAttributes30_FWD_DEFINED__ */

#ifndef __SAXAttributes40_FWD_DEFINED__
#define __SAXAttributes40_FWD_DEFINED__
#ifdef __cplusplus
typedef class SAXAttributes40 SAXAttributes40;
#else
typedef struct SAXAttributes40 SAXAttributes40;
#endif /* defined __cplusplus */
#endif /* defined __SAXAttributes40_FWD_DEFINED__ */

#ifndef __SAXAttributes60_FWD_DEFINED__
#define __SAXAttributes60_FWD_DEFINED__
#ifdef __cplusplus
typedef class SAXAttributes60 SAXAttributes60;
#else
typedef struct SAXAttributes60 SAXAttributes60;
#endif /* defined __cplusplus */
#endif /* defined __SAXAttributes60_FWD_DEFINED__ */

#ifndef __SAXAttributes_FWD_DEFINED__
#define __SAXAttributes_FWD_DEFINED__
#ifdef __cplusplus
typedef class SAXAttributes SAXAttributes;
#else
typedef struct SAXAttributes SAXAttributes;
#endif /* defined __cplusplus */
#endif /* defined __SAXAttributes_FWD_DEFINED__ */

/* Headers for imported files */

#include <unknwn.h>
#include <objidl.h>
#include <oaidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifdef __ISAXXMLReader_INTERFACE_DEFINED__
#undef __MSXML2_LIBRARY_DEFINED__
#endif
#ifndef __MSXML2_LIBRARY_DEFINED__
#define __MSXML2_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_MSXML2, 0xf5078f18, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifndef __IXMLDOMImplementation_FWD_DEFINED__
#define __IXMLDOMImplementation_FWD_DEFINED__
typedef interface IXMLDOMImplementation IXMLDOMImplementation;
#ifdef __cplusplus
interface IXMLDOMImplementation;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMNode_FWD_DEFINED__
#define __IXMLDOMNode_FWD_DEFINED__
typedef interface IXMLDOMNode IXMLDOMNode;
#ifdef __cplusplus
interface IXMLDOMNode;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMDocumentFragment_FWD_DEFINED__
#define __IXMLDOMDocumentFragment_FWD_DEFINED__
typedef interface IXMLDOMDocumentFragment IXMLDOMDocumentFragment;
#ifdef __cplusplus
interface IXMLDOMDocumentFragment;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMDocument_FWD_DEFINED__
#define __IXMLDOMDocument_FWD_DEFINED__
typedef interface IXMLDOMDocument IXMLDOMDocument;
#ifdef __cplusplus
interface IXMLDOMDocument;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMSchemaCollection_FWD_DEFINED__
#define __IXMLDOMSchemaCollection_FWD_DEFINED__
typedef interface IXMLDOMSchemaCollection IXMLDOMSchemaCollection;
#ifdef __cplusplus
interface IXMLDOMSchemaCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMDocument2_FWD_DEFINED__
#define __IXMLDOMDocument2_FWD_DEFINED__
typedef interface IXMLDOMDocument2 IXMLDOMDocument2;
#ifdef __cplusplus
interface IXMLDOMDocument2;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMNodeList_FWD_DEFINED__
#define __IXMLDOMNodeList_FWD_DEFINED__
typedef interface IXMLDOMNodeList IXMLDOMNodeList;
#ifdef __cplusplus
interface IXMLDOMNodeList;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMNamedNodeMap_FWD_DEFINED__
#define __IXMLDOMNamedNodeMap_FWD_DEFINED__
typedef interface IXMLDOMNamedNodeMap IXMLDOMNamedNodeMap;
#ifdef __cplusplus
interface IXMLDOMNamedNodeMap;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMCharacterData_FWD_DEFINED__
#define __IXMLDOMCharacterData_FWD_DEFINED__
typedef interface IXMLDOMCharacterData IXMLDOMCharacterData;
#ifdef __cplusplus
interface IXMLDOMCharacterData;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMAttribute_FWD_DEFINED__
#define __IXMLDOMAttribute_FWD_DEFINED__
typedef interface IXMLDOMAttribute IXMLDOMAttribute;
#ifdef __cplusplus
interface IXMLDOMAttribute;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMElement_FWD_DEFINED__
#define __IXMLDOMElement_FWD_DEFINED__
typedef interface IXMLDOMElement IXMLDOMElement;
#ifdef __cplusplus
interface IXMLDOMElement;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMText_FWD_DEFINED__
#define __IXMLDOMText_FWD_DEFINED__
typedef interface IXMLDOMText IXMLDOMText;
#ifdef __cplusplus
interface IXMLDOMText;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMComment_FWD_DEFINED__
#define __IXMLDOMComment_FWD_DEFINED__
typedef interface IXMLDOMComment IXMLDOMComment;
#ifdef __cplusplus
interface IXMLDOMComment;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMProcessingInstruction_FWD_DEFINED__
#define __IXMLDOMProcessingInstruction_FWD_DEFINED__
typedef interface IXMLDOMProcessingInstruction IXMLDOMProcessingInstruction;
#ifdef __cplusplus
interface IXMLDOMProcessingInstruction;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMCDATASection_FWD_DEFINED__
#define __IXMLDOMCDATASection_FWD_DEFINED__
typedef interface IXMLDOMCDATASection IXMLDOMCDATASection;
#ifdef __cplusplus
interface IXMLDOMCDATASection;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMDocumentType_FWD_DEFINED__
#define __IXMLDOMDocumentType_FWD_DEFINED__
typedef interface IXMLDOMDocumentType IXMLDOMDocumentType;
#ifdef __cplusplus
interface IXMLDOMDocumentType;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMNotation_FWD_DEFINED__
#define __IXMLDOMNotation_FWD_DEFINED__
typedef interface IXMLDOMNotation IXMLDOMNotation;
#ifdef __cplusplus
interface IXMLDOMNotation;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMEntity_FWD_DEFINED__
#define __IXMLDOMEntity_FWD_DEFINED__
typedef interface IXMLDOMEntity IXMLDOMEntity;
#ifdef __cplusplus
interface IXMLDOMEntity;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMEntityReference_FWD_DEFINED__
#define __IXMLDOMEntityReference_FWD_DEFINED__
typedef interface IXMLDOMEntityReference IXMLDOMEntityReference;
#ifdef __cplusplus
interface IXMLDOMEntityReference;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMParseError_FWD_DEFINED__
#define __IXMLDOMParseError_FWD_DEFINED__
typedef interface IXMLDOMParseError IXMLDOMParseError;
#ifdef __cplusplus
interface IXMLDOMParseError;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMParseErrorCollection_FWD_DEFINED__
#define __IXMLDOMParseErrorCollection_FWD_DEFINED__
typedef interface IXMLDOMParseErrorCollection IXMLDOMParseErrorCollection;
#ifdef __cplusplus
interface IXMLDOMParseErrorCollection;
#endif /* __cplusplus */
#endif

#ifndef __IXTLRuntime_FWD_DEFINED__
#define __IXTLRuntime_FWD_DEFINED__
typedef interface IXTLRuntime IXTLRuntime;
#ifdef __cplusplus
interface IXTLRuntime;
#endif /* __cplusplus */
#endif

#ifndef __IXSLTemplate_FWD_DEFINED__
#define __IXSLTemplate_FWD_DEFINED__
typedef interface IXSLTemplate IXSLTemplate;
#ifdef __cplusplus
interface IXSLTemplate;
#endif /* __cplusplus */
#endif

#ifndef __IXSLProcessor_FWD_DEFINED__
#define __IXSLProcessor_FWD_DEFINED__
typedef interface IXSLProcessor IXSLProcessor;
#ifdef __cplusplus
interface IXSLProcessor;
#endif /* __cplusplus */
#endif

#ifndef __ISAXAttributes_FWD_DEFINED__
#define __ISAXAttributes_FWD_DEFINED__
typedef interface ISAXAttributes ISAXAttributes;
#ifdef __cplusplus
interface ISAXAttributes;
#endif /* __cplusplus */
#endif

#ifndef __ISAXContentHandler_FWD_DEFINED__
#define __ISAXContentHandler_FWD_DEFINED__
typedef interface ISAXContentHandler ISAXContentHandler;
#ifdef __cplusplus
interface ISAXContentHandler;
#endif /* __cplusplus */
#endif

#ifndef __ISAXDeclHandler_FWD_DEFINED__
#define __ISAXDeclHandler_FWD_DEFINED__
typedef interface ISAXDeclHandler ISAXDeclHandler;
#ifdef __cplusplus
interface ISAXDeclHandler;
#endif /* __cplusplus */
#endif

#ifndef __ISAXDTDHandler_FWD_DEFINED__
#define __ISAXDTDHandler_FWD_DEFINED__
typedef interface ISAXDTDHandler ISAXDTDHandler;
#ifdef __cplusplus
interface ISAXDTDHandler;
#endif /* __cplusplus */
#endif

#ifndef __ISAXEntityResolver_FWD_DEFINED__
#define __ISAXEntityResolver_FWD_DEFINED__
typedef interface ISAXEntityResolver ISAXEntityResolver;
#ifdef __cplusplus
interface ISAXEntityResolver;
#endif /* __cplusplus */
#endif

#ifndef __ISAXErrorHandler_FWD_DEFINED__
#define __ISAXErrorHandler_FWD_DEFINED__
typedef interface ISAXErrorHandler ISAXErrorHandler;
#ifdef __cplusplus
interface ISAXErrorHandler;
#endif /* __cplusplus */
#endif

#ifndef __ISAXLexicalHandler_FWD_DEFINED__
#define __ISAXLexicalHandler_FWD_DEFINED__
typedef interface ISAXLexicalHandler ISAXLexicalHandler;
#ifdef __cplusplus
interface ISAXLexicalHandler;
#endif /* __cplusplus */
#endif

#ifndef __ISAXLocator_FWD_DEFINED__
#define __ISAXLocator_FWD_DEFINED__
typedef interface ISAXLocator ISAXLocator;
#ifdef __cplusplus
interface ISAXLocator;
#endif /* __cplusplus */
#endif

#ifndef __ISAXXMLFilter_FWD_DEFINED__
#define __ISAXXMLFilter_FWD_DEFINED__
typedef interface ISAXXMLFilter ISAXXMLFilter;
#ifdef __cplusplus
interface ISAXXMLFilter;
#endif /* __cplusplus */
#endif

#ifndef __ISAXXMLReader_FWD_DEFINED__
#define __ISAXXMLReader_FWD_DEFINED__
typedef interface ISAXXMLReader ISAXXMLReader;
#ifdef __cplusplus
interface ISAXXMLReader;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXAttributes_FWD_DEFINED__
#define __IVBSAXAttributes_FWD_DEFINED__
typedef interface IVBSAXAttributes IVBSAXAttributes;
#ifdef __cplusplus
interface IVBSAXAttributes;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXContentHandler_FWD_DEFINED__
#define __IVBSAXContentHandler_FWD_DEFINED__
typedef interface IVBSAXContentHandler IVBSAXContentHandler;
#ifdef __cplusplus
interface IVBSAXContentHandler;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXDeclHandler_FWD_DEFINED__
#define __IVBSAXDeclHandler_FWD_DEFINED__
typedef interface IVBSAXDeclHandler IVBSAXDeclHandler;
#ifdef __cplusplus
interface IVBSAXDeclHandler;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXDTDHandler_FWD_DEFINED__
#define __IVBSAXDTDHandler_FWD_DEFINED__
typedef interface IVBSAXDTDHandler IVBSAXDTDHandler;
#ifdef __cplusplus
interface IVBSAXDTDHandler;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXEntityResolver_FWD_DEFINED__
#define __IVBSAXEntityResolver_FWD_DEFINED__
typedef interface IVBSAXEntityResolver IVBSAXEntityResolver;
#ifdef __cplusplus
interface IVBSAXEntityResolver;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXErrorHandler_FWD_DEFINED__
#define __IVBSAXErrorHandler_FWD_DEFINED__
typedef interface IVBSAXErrorHandler IVBSAXErrorHandler;
#ifdef __cplusplus
interface IVBSAXErrorHandler;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXLexicalHandler_FWD_DEFINED__
#define __IVBSAXLexicalHandler_FWD_DEFINED__
typedef interface IVBSAXLexicalHandler IVBSAXLexicalHandler;
#ifdef __cplusplus
interface IVBSAXLexicalHandler;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXLocator_FWD_DEFINED__
#define __IVBSAXLocator_FWD_DEFINED__
typedef interface IVBSAXLocator IVBSAXLocator;
#ifdef __cplusplus
interface IVBSAXLocator;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXXMLFilter_FWD_DEFINED__
#define __IVBSAXXMLFilter_FWD_DEFINED__
typedef interface IVBSAXXMLFilter IVBSAXXMLFilter;
#ifdef __cplusplus
interface IVBSAXXMLFilter;
#endif /* __cplusplus */
#endif

#ifndef __IVBSAXXMLReader_FWD_DEFINED__
#define __IVBSAXXMLReader_FWD_DEFINED__
typedef interface IVBSAXXMLReader IVBSAXXMLReader;
#ifdef __cplusplus
interface IVBSAXXMLReader;
#endif /* __cplusplus */
#endif

#ifndef __IMXAttributes_FWD_DEFINED__
#define __IMXAttributes_FWD_DEFINED__
typedef interface IMXAttributes IMXAttributes;
#ifdef __cplusplus
interface IMXAttributes;
#endif /* __cplusplus */
#endif

#ifndef __IMXReaderControl_FWD_DEFINED__
#define __IMXReaderControl_FWD_DEFINED__
typedef interface IMXReaderControl IMXReaderControl;
#ifdef __cplusplus
interface IMXReaderControl;
#endif /* __cplusplus */
#endif

#ifndef __IMXWriter_FWD_DEFINED__
#define __IMXWriter_FWD_DEFINED__
typedef interface IMXWriter IMXWriter;
#ifdef __cplusplus
interface IMXWriter;
#endif /* __cplusplus */
#endif

#ifndef __IXMLDOMSchemaCollection2_FWD_DEFINED__
#define __IXMLDOMSchemaCollection2_FWD_DEFINED__
typedef interface IXMLDOMSchemaCollection2 IXMLDOMSchemaCollection2;
#ifdef __cplusplus
interface IXMLDOMSchemaCollection2;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaStringCollection_FWD_DEFINED__
#define __ISchemaStringCollection_FWD_DEFINED__
typedef interface ISchemaStringCollection ISchemaStringCollection;
#ifdef __cplusplus
interface ISchemaStringCollection;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaItemCollection_FWD_DEFINED__
#define __ISchemaItemCollection_FWD_DEFINED__
typedef interface ISchemaItemCollection ISchemaItemCollection;
#ifdef __cplusplus
interface ISchemaItemCollection;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaItem_FWD_DEFINED__
#define __ISchemaItem_FWD_DEFINED__
typedef interface ISchemaItem ISchemaItem;
#ifdef __cplusplus
interface ISchemaItem;
#endif /* __cplusplus */
#endif

#ifndef __ISchema_FWD_DEFINED__
#define __ISchema_FWD_DEFINED__
typedef interface ISchema ISchema;
#ifdef __cplusplus
interface ISchema;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaParticle_FWD_DEFINED__
#define __ISchemaParticle_FWD_DEFINED__
typedef interface ISchemaParticle ISchemaParticle;
#ifdef __cplusplus
interface ISchemaParticle;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaAttribute_FWD_DEFINED__
#define __ISchemaAttribute_FWD_DEFINED__
typedef interface ISchemaAttribute ISchemaAttribute;
#ifdef __cplusplus
interface ISchemaAttribute;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaElement_FWD_DEFINED__
#define __ISchemaElement_FWD_DEFINED__
typedef interface ISchemaElement ISchemaElement;
#ifdef __cplusplus
interface ISchemaElement;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaType_FWD_DEFINED__
#define __ISchemaType_FWD_DEFINED__
typedef interface ISchemaType ISchemaType;
#ifdef __cplusplus
interface ISchemaType;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaComplexType_FWD_DEFINED__
#define __ISchemaComplexType_FWD_DEFINED__
typedef interface ISchemaComplexType ISchemaComplexType;
#ifdef __cplusplus
interface ISchemaComplexType;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaAttributeGroup_FWD_DEFINED__
#define __ISchemaAttributeGroup_FWD_DEFINED__
typedef interface ISchemaAttributeGroup ISchemaAttributeGroup;
#ifdef __cplusplus
interface ISchemaAttributeGroup;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaModelGroup_FWD_DEFINED__
#define __ISchemaModelGroup_FWD_DEFINED__
typedef interface ISchemaModelGroup ISchemaModelGroup;
#ifdef __cplusplus
interface ISchemaModelGroup;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaAny_FWD_DEFINED__
#define __ISchemaAny_FWD_DEFINED__
typedef interface ISchemaAny ISchemaAny;
#ifdef __cplusplus
interface ISchemaAny;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaIdentityConstraint_FWD_DEFINED__
#define __ISchemaIdentityConstraint_FWD_DEFINED__
typedef interface ISchemaIdentityConstraint ISchemaIdentityConstraint;
#ifdef __cplusplus
interface ISchemaIdentityConstraint;
#endif /* __cplusplus */
#endif

#ifndef __ISchemaNotation_FWD_DEFINED__
#define __ISchemaNotation_FWD_DEFINED__
typedef interface ISchemaNotation ISchemaNotation;
#ifdef __cplusplus
interface ISchemaNotation;
#endif /* __cplusplus */
#endif

#define DOMDocument DOMDocument2
#define CLSID_DOMDocument CLSID_DOMDocument2
#ifndef __MSXML_DOMNODETYPE_DEFINED
#define __MSXML_DOMNODETYPE_DEFINED
typedef enum tagDOMNodeType {
    NODE_INVALID = 0,
    NODE_ELEMENT = 1,
    NODE_ATTRIBUTE = 2,
    NODE_TEXT = 3,
    NODE_CDATA_SECTION = 4,
    NODE_ENTITY_REFERENCE = 5,
    NODE_ENTITY = 6,
    NODE_PROCESSING_INSTRUCTION = 7,
    NODE_COMMENT = 8,
    NODE_DOCUMENT = 9,
    NODE_DOCUMENT_TYPE = 10,
    NODE_DOCUMENT_FRAGMENT = 11,
    NODE_NOTATION = 12
} DOMNodeType;
#endif
#ifndef __msxml_som_enums__
#define __msxml_som_enums__
typedef enum _SOMITEMTYPE {
    SOMITEM_SCHEMA = 0x1000,
    SOMITEM_ATTRIBUTE = 0x1001,
    SOMITEM_ATTRIBUTEGROUP = 0x1002,
    SOMITEM_NOTATION = 0x1003,
    SOMITEM_IDENTITYCONSTRAINT = 0x1100,
    SOMITEM_KEY = 0x1101,
    SOMITEM_KEYREF = 0x1102,
    SOMITEM_UNIQUE = 0x1103,
    SOMITEM_ANYTYPE = 0x2000,
    SOMITEM_DATATYPE = 0x2100,
    SOMITEM_DATATYPE_ANYTYPE = 0x2101,
    SOMITEM_DATATYPE_ANYURI = 0x2102,
    SOMITEM_DATATYPE_BASE64BINARY = 0x2103,
    SOMITEM_DATATYPE_BOOLEAN = 0x2104,
    SOMITEM_DATATYPE_BYTE = 0x2105,
    SOMITEM_DATATYPE_DATE = 0x2106,
    SOMITEM_DATATYPE_DATETIME = 0x2107,
    SOMITEM_DATATYPE_DAY = 0x2108,
    SOMITEM_DATATYPE_DECIMAL = 0x2109,
    SOMITEM_DATATYPE_DOUBLE = 0x210a,
    SOMITEM_DATATYPE_DURATION = 0x210b,
    SOMITEM_DATATYPE_ENTITIES = 0x210c,
    SOMITEM_DATATYPE_ENTITY = 0x210d,
    SOMITEM_DATATYPE_FLOAT = 0x210e,
    SOMITEM_DATATYPE_HEXBINARY = 0x210f,
    SOMITEM_DATATYPE_ID = 0x2110,
    SOMITEM_DATATYPE_IDREF = 0x2111,
    SOMITEM_DATATYPE_IDREFS = 0x2112,
    SOMITEM_DATATYPE_INT = 0x2113,
    SOMITEM_DATATYPE_INTEGER = 0x2114,
    SOMITEM_DATATYPE_LANGUAGE = 0x2115,
    SOMITEM_DATATYPE_LONG = 0x2116,
    SOMITEM_DATATYPE_MONTH = 0x2117,
    SOMITEM_DATATYPE_MONTHDAY = 0x2118,
    SOMITEM_DATATYPE_NAME = 0x2119,
    SOMITEM_DATATYPE_NCNAME = 0x211a,
    SOMITEM_DATATYPE_NEGATIVEINTEGER = 0x211b,
    SOMITEM_DATATYPE_NMTOKEN = 0x211c,
    SOMITEM_DATATYPE_NMTOKENS = 0x211d,
    SOMITEM_DATATYPE_NONNEGATIVEINTEGER = 0x211e,
    SOMITEM_DATATYPE_NONPOSITIVEINTEGER = 0x211f,
    SOMITEM_DATATYPE_NORMALIZEDSTRING = 0x2120,
    SOMITEM_DATATYPE_NOTATION = 0x2121,
    SOMITEM_DATATYPE_POSITIVEINTEGER = 0x2122,
    SOMITEM_DATATYPE_QNAME = 0x2123,
    SOMITEM_DATATYPE_SHORT = 0x2124,
    SOMITEM_DATATYPE_STRING = 0x2125,
    SOMITEM_DATATYPE_TIME = 0x2126,
    SOMITEM_DATATYPE_TOKEN = 0x2127,
    SOMITEM_DATATYPE_UNSIGNEDBYTE = 0x2128,
    SOMITEM_DATATYPE_UNSIGNEDINT = 0x2129,
    SOMITEM_DATATYPE_UNSIGNEDLONG = 0x212a,
    SOMITEM_DATATYPE_UNSIGNEDSHORT = 0x212b,
    SOMITEM_DATATYPE_YEAR = 0x212c,
    SOMITEM_DATATYPE_YEARMONTH = 0x212d,
    SOMITEM_DATATYPE_ANYSIMPLETYPE = 0x21ff,
    SOMITEM_SIMPLETYPE = 0x2200,
    SOMITEM_COMPLEXTYPE = 0x2400,
    SOMITEM_PARTICLE = 0x4000,
    SOMITEM_ANY = 0x4001,
    SOMITEM_ANYATTRIBUTE = 0x4002,
    SOMITEM_ELEMENT = 0x4003,
    SOMITEM_GROUP = 0x4100,
    SOMITEM_ALL = 0x4101,
    SOMITEM_CHOICE = 0x4102,
    SOMITEM_SEQUENCE = 0x4103,
    SOMITEM_EMPTYPARTICLE = 0x4104,
    SOMITEM_NULL = 0x800,
    SOMITEM_NULL_TYPE = 0x2800,
    SOMITEM_NULL_ANY = 0x4801,
    SOMITEM_NULL_ANYATTRIBUTE = 0x4802,
    SOMITEM_NULL_ELEMENT = 0x4803
} SOMITEMTYPE;
typedef enum _SCHEMAUSE {
    SCHEMAUSE_OPTIONAL = 0,
    SCHEMAUSE_PROHIBITED = 1,
    SCHEMAUSE_REQUIRED = 2
} SCHEMAUSE;
typedef enum _SCHEMADERIVATIONMETHOD {
    SCHEMADERIVATIONMETHOD_EMPTY = 0x0,
    SCHEMADERIVATIONMETHOD_SUBSTITUTION = 0x1,
    SCHEMADERIVATIONMETHOD_EXTENSION = 0x2,
    SCHEMADERIVATIONMETHOD_RESTRICTION = 0x4,
    SCHEMADERIVATIONMETHOD_LIST = 0x8,
    SCHEMADERIVATIONMETHOD_UNION = 0x10,
    SCHEMADERIVATIONMETHOD_ALL = 0xff,
    SCHEMADERIVATIONMETHOD_NONE = 0x100
} SCHEMADERIVATIONMETHOD;
typedef enum _SCHEMACONTENTTYPE {
    SCHEMACONTENTTYPE_EMPTY = 0,
    SCHEMACONTENTTYPE_TEXTONLY = 1,
    SCHEMACONTENTTYPE_ELEMENTONLY = 2,
    SCHEMACONTENTTYPE_MIXED = 3
} SCHEMACONTENTTYPE;
typedef enum _SCHEMAPROCESSCONTENTS {
    SCHEMAPROCESSCONTENTS_NONE = 0,
    SCHEMAPROCESSCONTENTS_SKIP = 1,
    SCHEMAPROCESSCONTENTS_LAX = 2,
    SCHEMAPROCESSCONTENTS_STRICT = 3
} SCHEMAPROCESSCONTENTS;
typedef enum _SCHEMAWHITESPACE {
    SCHEMAWHITESPACE_NONE = -1,
    SCHEMAWHITESPACE_PRESERVE = 0,
    SCHEMAWHITESPACE_REPLACE = 1,
    SCHEMAWHITESPACE_COLLAPSE = 2
} SCHEMAWHITESPACE;
typedef enum _SCHEMATYPEVARIETY {
    SCHEMATYPEVARIETY_NONE = -1,
    SCHEMATYPEVARIETY_ATOMIC = 0,
    SCHEMATYPEVARIETY_LIST = 1,
    SCHEMATYPEVARIETY_UNION = 2
} SCHEMATYPEVARIETY;
#endif /* __msxml_som_enums__ */
/*****************************************************************************
 * IXMLElementCollection interface
 */
#ifndef __IXMLElementCollection_INTERFACE_DEFINED__
#define __IXMLElementCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLElementCollection, 0x65725580, 0x9b5d, 0x11d0, 0x9b,0xfe, 0x00,0xc0,0x4f,0xc9,0x9c,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("65725580-9b5d-11d0-9bfe-00c04fc99c8e")
IXMLElementCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_length(
        LONG v) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **ppUnk) = 0;

    virtual HRESULT STDMETHODCALLTYPE item(
        VARIANT var1,
        VARIANT var2,
        IDispatch **ppDisp) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLElementCollection, 0x65725580, 0x9b5d, 0x11d0, 0x9b,0xfe, 0x00,0xc0,0x4f,0xc9,0x9c,0x8e)
#endif
#else
typedef struct IXMLElementCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLElementCollection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLElementCollection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLElementCollection *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLElementCollection *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLElementCollection *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLElementCollection *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLElementCollection *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLElementCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *put_length)(
        IXMLElementCollection *This,
        LONG v);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IXMLElementCollection *This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IXMLElementCollection *This,
        IUnknown **ppUnk);

    HRESULT (STDMETHODCALLTYPE *item)(
        IXMLElementCollection *This,
        VARIANT var1,
        VARIANT var2,
        IDispatch **ppDisp);

    END_INTERFACE
} IXMLElementCollectionVtbl;

interface IXMLElementCollection {
    CONST_VTBL IXMLElementCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLElementCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLElementCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLElementCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLElementCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLElementCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLElementCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLElementCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLElementCollection methods ***/
#define IXMLElementCollection_put_length(This,v) (This)->lpVtbl->put_length(This,v)
#define IXMLElementCollection_get_length(This,p) (This)->lpVtbl->get_length(This,p)
#define IXMLElementCollection_get__newEnum(This,ppUnk) (This)->lpVtbl->get__newEnum(This,ppUnk)
#define IXMLElementCollection_item(This,var1,var2,ppDisp) (This)->lpVtbl->item(This,var1,var2,ppDisp)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLElementCollection_QueryInterface(IXMLElementCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLElementCollection_AddRef(IXMLElementCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLElementCollection_Release(IXMLElementCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLElementCollection_GetTypeInfoCount(IXMLElementCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLElementCollection_GetTypeInfo(IXMLElementCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLElementCollection_GetIDsOfNames(IXMLElementCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLElementCollection_Invoke(IXMLElementCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLElementCollection methods ***/
static __WIDL_INLINE HRESULT IXMLElementCollection_put_length(IXMLElementCollection* This,LONG v) {
    return This->lpVtbl->put_length(This,v);
}
static __WIDL_INLINE HRESULT IXMLElementCollection_get_length(IXMLElementCollection* This,LONG *p) {
    return This->lpVtbl->get_length(This,p);
}
static __WIDL_INLINE HRESULT IXMLElementCollection_get__newEnum(IXMLElementCollection* This,IUnknown **ppUnk) {
    return This->lpVtbl->get__newEnum(This,ppUnk);
}
static __WIDL_INLINE HRESULT IXMLElementCollection_item(IXMLElementCollection* This,VARIANT var1,VARIANT var2,IDispatch **ppDisp) {
    return This->lpVtbl->item(This,var1,var2,ppDisp);
}
#endif
#endif

#endif


#endif  /* __IXMLElementCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLElement interface
 */
#ifndef __IXMLElement_INTERFACE_DEFINED__
#define __IXMLElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLElement, 0x3f7f31ac, 0xe15f, 0x11d0, 0x9c,0x25, 0x00,0xc0,0x4f,0xc9,0x9c,0x8e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3f7f31ac-e15f-11d0-9c25-00c04fc99c8e")
IXMLElement : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_tagName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_tagName(
        BSTR p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parent(
        IXMLElement **parent) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttribute(
        BSTR strPropertyName,
        VARIANT PropertyValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttribute(
        BSTR strPropertyName,
        VARIANT *PropertyValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAttribute(
        BSTR strPropertyName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_children(
        IXMLElementCollection **p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_type(
        LONG *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_text(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_text(
        BSTR p) = 0;

    virtual HRESULT STDMETHODCALLTYPE addChild(
        IXMLElement *pChildElem,
        LONG lIndex,
        LONG lreserved) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeChild(
        IXMLElement *pChildElem) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLElement, 0x3f7f31ac, 0xe15f, 0x11d0, 0x9c,0x25, 0x00,0xc0,0x4f,0xc9,0x9c,0x8e)
#endif
#else
typedef struct IXMLElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLElement *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLElement *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLElement *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLElement *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLElement *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLElement *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLElement *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_tagName)(
        IXMLElement *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_tagName)(
        IXMLElement *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_parent)(
        IXMLElement *This,
        IXMLElement **parent);

    HRESULT (STDMETHODCALLTYPE *setAttribute)(
        IXMLElement *This,
        BSTR strPropertyName,
        VARIANT PropertyValue);

    HRESULT (STDMETHODCALLTYPE *getAttribute)(
        IXMLElement *This,
        BSTR strPropertyName,
        VARIANT *PropertyValue);

    HRESULT (STDMETHODCALLTYPE *removeAttribute)(
        IXMLElement *This,
        BSTR strPropertyName);

    HRESULT (STDMETHODCALLTYPE *get_children)(
        IXMLElement *This,
        IXMLElementCollection **p);

    HRESULT (STDMETHODCALLTYPE *get_type)(
        IXMLElement *This,
        LONG *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLElement *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLElement *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *addChild)(
        IXMLElement *This,
        IXMLElement *pChildElem,
        LONG lIndex,
        LONG lreserved);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLElement *This,
        IXMLElement *pChildElem);

    END_INTERFACE
} IXMLElementVtbl;

interface IXMLElement {
    CONST_VTBL IXMLElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLElement methods ***/
#define IXMLElement_get_tagName(This,p) (This)->lpVtbl->get_tagName(This,p)
#define IXMLElement_put_tagName(This,p) (This)->lpVtbl->put_tagName(This,p)
#define IXMLElement_get_parent(This,parent) (This)->lpVtbl->get_parent(This,parent)
#define IXMLElement_setAttribute(This,strPropertyName,PropertyValue) (This)->lpVtbl->setAttribute(This,strPropertyName,PropertyValue)
#define IXMLElement_getAttribute(This,strPropertyName,PropertyValue) (This)->lpVtbl->getAttribute(This,strPropertyName,PropertyValue)
#define IXMLElement_removeAttribute(This,strPropertyName) (This)->lpVtbl->removeAttribute(This,strPropertyName)
#define IXMLElement_get_children(This,p) (This)->lpVtbl->get_children(This,p)
#define IXMLElement_get_type(This,p) (This)->lpVtbl->get_type(This,p)
#define IXMLElement_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLElement_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLElement_addChild(This,pChildElem,lIndex,lreserved) (This)->lpVtbl->addChild(This,pChildElem,lIndex,lreserved)
#define IXMLElement_removeChild(This,pChildElem) (This)->lpVtbl->removeChild(This,pChildElem)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLElement_QueryInterface(IXMLElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLElement_AddRef(IXMLElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLElement_Release(IXMLElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLElement_GetTypeInfoCount(IXMLElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLElement_GetTypeInfo(IXMLElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLElement_GetIDsOfNames(IXMLElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLElement_Invoke(IXMLElement* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLElement methods ***/
static __WIDL_INLINE HRESULT IXMLElement_get_tagName(IXMLElement* This,BSTR *p) {
    return This->lpVtbl->get_tagName(This,p);
}
static __WIDL_INLINE HRESULT IXMLElement_put_tagName(IXMLElement* This,BSTR p) {
    return This->lpVtbl->put_tagName(This,p);
}
static __WIDL_INLINE HRESULT IXMLElement_get_parent(IXMLElement* This,IXMLElement **parent) {
    return This->lpVtbl->get_parent(This,parent);
}
static __WIDL_INLINE HRESULT IXMLElement_setAttribute(IXMLElement* This,BSTR strPropertyName,VARIANT PropertyValue) {
    return This->lpVtbl->setAttribute(This,strPropertyName,PropertyValue);
}
static __WIDL_INLINE HRESULT IXMLElement_getAttribute(IXMLElement* This,BSTR strPropertyName,VARIANT *PropertyValue) {
    return This->lpVtbl->getAttribute(This,strPropertyName,PropertyValue);
}
static __WIDL_INLINE HRESULT IXMLElement_removeAttribute(IXMLElement* This,BSTR strPropertyName) {
    return This->lpVtbl->removeAttribute(This,strPropertyName);
}
static __WIDL_INLINE HRESULT IXMLElement_get_children(IXMLElement* This,IXMLElementCollection **p) {
    return This->lpVtbl->get_children(This,p);
}
static __WIDL_INLINE HRESULT IXMLElement_get_type(IXMLElement* This,LONG *p) {
    return This->lpVtbl->get_type(This,p);
}
static __WIDL_INLINE HRESULT IXMLElement_get_text(IXMLElement* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLElement_put_text(IXMLElement* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLElement_addChild(IXMLElement* This,IXMLElement *pChildElem,LONG lIndex,LONG lreserved) {
    return This->lpVtbl->addChild(This,pChildElem,lIndex,lreserved);
}
static __WIDL_INLINE HRESULT IXMLElement_removeChild(IXMLElement* This,IXMLElement *pChildElem) {
    return This->lpVtbl->removeChild(This,pChildElem);
}
#endif
#endif

#endif


#endif  /* __IXMLElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMNode interface
 */
#ifndef __IXMLDOMNode_INTERFACE_DEFINED__
#define __IXMLDOMNode_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMNode, 0x2933bf80, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf80-7b36-11d2-b20e-00c04f983e60")
IXMLDOMNode : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_nodeName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nodeValue(
        VARIANT *var1) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_nodeValue(
        VARIANT var1) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nodeType(
        DOMNodeType *domNodeType) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parentNode(
        IXMLDOMNode **parent) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_childNodes(
        IXMLDOMNodeList **outList) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_firstChild(
        IXMLDOMNode **domNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lastChild(
        IXMLDOMNode **domNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_previousSibling(
        IXMLDOMNode **domNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nextSibling(
        IXMLDOMNode **domNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_attributes(
        IXMLDOMNamedNodeMap **attributeMap) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertBefore(
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceChild(
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeChild(
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendChild(
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE hasChildNodes(
        VARIANT_BOOL *pbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ownerDocument(
        IXMLDOMDocument **domDocument) = 0;

    virtual HRESULT STDMETHODCALLTYPE cloneNode(
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nodeTypeString(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_text(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_text(
        BSTR p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_specified(
        VARIANT_BOOL *pbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_definition(
        IXMLDOMNode **domNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_nodeTypedValue(
        VARIANT *var1) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_nodeTypedValue(
        VARIANT var1) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dataType(
        VARIANT *var1) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_dataType(
        BSTR p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_xml(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE transformNode(
        IXMLDOMNode *domNode,
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE selectNodes(
        BSTR p,
        IXMLDOMNodeList **outList) = 0;

    virtual HRESULT STDMETHODCALLTYPE selectSingleNode(
        BSTR p,
        IXMLDOMNode **outNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parsed(
        VARIANT_BOOL *pbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_namespaceURI(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_prefix(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE transformNodeToObject(
        IXMLDOMNode *domNode,
        VARIANT var1) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMNode, 0x2933bf80, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMNodeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMNode *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMNode *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMNode *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMNode *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMNode *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMNode *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMNode *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMNode *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMNode *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMNode *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMNode *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMNode *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMNode *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMNode *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMNode *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMNode *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMNode *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMNode *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMNode *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMNode *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMNode *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMNode *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMNode *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMNode *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMNode *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMNode *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMNode *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMNode *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMNode *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMNode *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMNode *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMNode *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMNode *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMNode *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMNode *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMNode *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMNode *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMNode *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMNode *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMNode *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMNode *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMNode *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMNode *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    END_INTERFACE
} IXMLDOMNodeVtbl;

interface IXMLDOMNode {
    CONST_VTBL IXMLDOMNodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMNode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMNode_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMNode_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMNode_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMNode_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMNode_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMNode_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMNode_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMNode_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMNode_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMNode_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMNode_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMNode_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMNode_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMNode_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMNode_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMNode_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMNode_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMNode_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMNode_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMNode_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMNode_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMNode_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMNode_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMNode_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMNode_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMNode_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMNode_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMNode_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMNode_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMNode_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMNode_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMNode_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMNode_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMNode_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMNode_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMNode_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMNode_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMNode_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMNode_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMNode_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMNode_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMNode_QueryInterface(IXMLDOMNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMNode_AddRef(IXMLDOMNode* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMNode_Release(IXMLDOMNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMNode_GetTypeInfoCount(IXMLDOMNode* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_GetTypeInfo(IXMLDOMNode* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_GetIDsOfNames(IXMLDOMNode* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_Invoke(IXMLDOMNode* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMNode_get_nodeName(IXMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_nodeValue(IXMLDOMNode* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_put_nodeValue(IXMLDOMNode* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_nodeType(IXMLDOMNode* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_parentNode(IXMLDOMNode* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_childNodes(IXMLDOMNode* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_firstChild(IXMLDOMNode* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_lastChild(IXMLDOMNode* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_previousSibling(IXMLDOMNode* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_nextSibling(IXMLDOMNode* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_attributes(IXMLDOMNode* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_insertBefore(IXMLDOMNode* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_replaceChild(IXMLDOMNode* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_removeChild(IXMLDOMNode* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_appendChild(IXMLDOMNode* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_hasChildNodes(IXMLDOMNode* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_ownerDocument(IXMLDOMNode* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_cloneNode(IXMLDOMNode* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_nodeTypeString(IXMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_text(IXMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_put_text(IXMLDOMNode* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_specified(IXMLDOMNode* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_definition(IXMLDOMNode* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_nodeTypedValue(IXMLDOMNode* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_put_nodeTypedValue(IXMLDOMNode* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_dataType(IXMLDOMNode* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_put_dataType(IXMLDOMNode* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_xml(IXMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_transformNode(IXMLDOMNode* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_selectNodes(IXMLDOMNode* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_selectSingleNode(IXMLDOMNode* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_parsed(IXMLDOMNode* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_namespaceURI(IXMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_prefix(IXMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_get_baseName(IXMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNode_transformNodeToObject(IXMLDOMNode* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMNode_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMDocument interface
 */
#ifndef __IXMLDOMDocument_INTERFACE_DEFINED__
#define __IXMLDOMDocument_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMDocument, 0x2933bf81, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf81-7b36-11d2-b20e-00c04f983e60")
IXMLDOMDocument : public IXMLDOMNode
{
    virtual HRESULT STDMETHODCALLTYPE get_doctype(
        IXMLDOMDocumentType **docType) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_implementation(
        IXMLDOMImplementation **impl) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_documentElement(
        IXMLDOMElement **domElement) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_documentElement(
        IXMLDOMElement *domElement) = 0;

    virtual HRESULT STDMETHODCALLTYPE createElement(
        BSTR p,
        IXMLDOMElement **domElement) = 0;

    virtual HRESULT STDMETHODCALLTYPE createDocumentFragment(
        IXMLDOMDocumentFragment **docFrag) = 0;

    virtual HRESULT STDMETHODCALLTYPE createTextNode(
        BSTR p,
        IXMLDOMText **text) = 0;

    virtual HRESULT STDMETHODCALLTYPE createComment(
        BSTR p,
        IXMLDOMComment **comment) = 0;

    virtual HRESULT STDMETHODCALLTYPE createCDATASection(
        BSTR p,
        IXMLDOMCDATASection **cdata) = 0;

    virtual HRESULT STDMETHODCALLTYPE createProcessingInstruction(
        BSTR target,
        BSTR data,
        IXMLDOMProcessingInstruction **pi) = 0;

    virtual HRESULT STDMETHODCALLTYPE createAttribute(
        BSTR p,
        IXMLDOMAttribute **attribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE createEntityReference(
        BSTR p,
        IXMLDOMEntityReference **entityRef) = 0;

    virtual HRESULT STDMETHODCALLTYPE getElementsByTagName(
        BSTR p,
        IXMLDOMNodeList **resultList) = 0;

    virtual HRESULT STDMETHODCALLTYPE createNode(
        VARIANT var,
        BSTR name,
        BSTR uri,
        IXMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE nodeFromID(
        BSTR id,
        IXMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE load(
        VARIANT var1,
        VARIANT_BOOL *pbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        LONG *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_parseError(
        IXMLDOMParseError **err) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_url(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_async(
        VARIANT_BOOL *pbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_async(
        VARIANT_BOOL pbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE abort(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE loadXML(
        BSTR p,
        VARIANT_BOOL *pbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE save(
        VARIANT var1) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_validateOnParse(
        VARIANT_BOOL *pbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_validateOnParse(
        VARIANT_BOOL pbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_resolveExternals(
        VARIANT_BOOL *pbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_resolveExternals(
        VARIANT_BOOL pbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_preserveWhiteSpace(
        VARIANT_BOOL *pbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_preserveWhiteSpace(
        VARIANT_BOOL pbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreadystatechange(
        VARIANT var1) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ondataavailable(
        VARIANT var1) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ontransformnode(
        VARIANT var1) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMDocument, 0x2933bf81, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMDocumentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMDocument *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMDocument *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMDocument *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMDocument *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMDocument *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMDocument *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMDocument *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMDocument *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMDocument *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMDocument *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMDocument *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMDocument *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMDocument *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMDocument *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMDocument *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMDocument *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMDocument *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMDocument *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMDocument *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMDocument *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMDocument *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMDocument *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMDocument *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMDocument *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMDocument *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMDocument *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMDocument *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMDocument *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMDocument *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMDocument *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMDocument *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMDocument *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMDocument *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMDocument *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMDocument *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMDocument *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMDocument *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMDocument *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMDocument *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMDocument *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMDocument *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMDocument *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMDocument *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    /*** IXMLDOMDocument methods ***/
    HRESULT (STDMETHODCALLTYPE *get_doctype)(
        IXMLDOMDocument *This,
        IXMLDOMDocumentType **docType);

    HRESULT (STDMETHODCALLTYPE *get_implementation)(
        IXMLDOMDocument *This,
        IXMLDOMImplementation **impl);

    HRESULT (STDMETHODCALLTYPE *get_documentElement)(
        IXMLDOMDocument *This,
        IXMLDOMElement **domElement);

    HRESULT (STDMETHODCALLTYPE *putref_documentElement)(
        IXMLDOMDocument *This,
        IXMLDOMElement *domElement);

    HRESULT (STDMETHODCALLTYPE *createElement)(
        IXMLDOMDocument *This,
        BSTR p,
        IXMLDOMElement **domElement);

    HRESULT (STDMETHODCALLTYPE *createDocumentFragment)(
        IXMLDOMDocument *This,
        IXMLDOMDocumentFragment **docFrag);

    HRESULT (STDMETHODCALLTYPE *createTextNode)(
        IXMLDOMDocument *This,
        BSTR p,
        IXMLDOMText **text);

    HRESULT (STDMETHODCALLTYPE *createComment)(
        IXMLDOMDocument *This,
        BSTR p,
        IXMLDOMComment **comment);

    HRESULT (STDMETHODCALLTYPE *createCDATASection)(
        IXMLDOMDocument *This,
        BSTR p,
        IXMLDOMCDATASection **cdata);

    HRESULT (STDMETHODCALLTYPE *createProcessingInstruction)(
        IXMLDOMDocument *This,
        BSTR target,
        BSTR data,
        IXMLDOMProcessingInstruction **pi);

    HRESULT (STDMETHODCALLTYPE *createAttribute)(
        IXMLDOMDocument *This,
        BSTR p,
        IXMLDOMAttribute **attribute);

    HRESULT (STDMETHODCALLTYPE *createEntityReference)(
        IXMLDOMDocument *This,
        BSTR p,
        IXMLDOMEntityReference **entityRef);

    HRESULT (STDMETHODCALLTYPE *getElementsByTagName)(
        IXMLDOMDocument *This,
        BSTR p,
        IXMLDOMNodeList **resultList);

    HRESULT (STDMETHODCALLTYPE *createNode)(
        IXMLDOMDocument *This,
        VARIANT var,
        BSTR name,
        BSTR uri,
        IXMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *nodeFromID)(
        IXMLDOMDocument *This,
        BSTR id,
        IXMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *load)(
        IXMLDOMDocument *This,
        VARIANT var1,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IXMLDOMDocument *This,
        LONG *value);

    HRESULT (STDMETHODCALLTYPE *get_parseError)(
        IXMLDOMDocument *This,
        IXMLDOMParseError **err);

    HRESULT (STDMETHODCALLTYPE *get_url)(
        IXMLDOMDocument *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_async)(
        IXMLDOMDocument *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *put_async)(
        IXMLDOMDocument *This,
        VARIANT_BOOL pbool);

    HRESULT (STDMETHODCALLTYPE *abort)(
        IXMLDOMDocument *This);

    HRESULT (STDMETHODCALLTYPE *loadXML)(
        IXMLDOMDocument *This,
        BSTR p,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *save)(
        IXMLDOMDocument *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_validateOnParse)(
        IXMLDOMDocument *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *put_validateOnParse)(
        IXMLDOMDocument *This,
        VARIANT_BOOL pbool);

    HRESULT (STDMETHODCALLTYPE *get_resolveExternals)(
        IXMLDOMDocument *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *put_resolveExternals)(
        IXMLDOMDocument *This,
        VARIANT_BOOL pbool);

    HRESULT (STDMETHODCALLTYPE *get_preserveWhiteSpace)(
        IXMLDOMDocument *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *put_preserveWhiteSpace)(
        IXMLDOMDocument *This,
        VARIANT_BOOL pbool);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IXMLDOMDocument *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *put_ondataavailable)(
        IXMLDOMDocument *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *put_ontransformnode)(
        IXMLDOMDocument *This,
        VARIANT var1);

    END_INTERFACE
} IXMLDOMDocumentVtbl;

interface IXMLDOMDocument {
    CONST_VTBL IXMLDOMDocumentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMDocument_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMDocument_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMDocument_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMDocument_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMDocument_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMDocument_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMDocument_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMDocument_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMDocument_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMDocument_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMDocument_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMDocument_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMDocument_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMDocument_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMDocument_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMDocument_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMDocument_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMDocument_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMDocument_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMDocument_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMDocument_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMDocument_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMDocument_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMDocument_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMDocument_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMDocument_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMDocument_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMDocument_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMDocument_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMDocument_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMDocument_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMDocument_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMDocument_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMDocument_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMDocument_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMDocument_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMDocument_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMDocument_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMDocument_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMDocument_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMDocument_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
/*** IXMLDOMDocument methods ***/
#define IXMLDOMDocument_get_doctype(This,docType) (This)->lpVtbl->get_doctype(This,docType)
#define IXMLDOMDocument_get_implementation(This,impl) (This)->lpVtbl->get_implementation(This,impl)
#define IXMLDOMDocument_get_documentElement(This,domElement) (This)->lpVtbl->get_documentElement(This,domElement)
#define IXMLDOMDocument_putref_documentElement(This,domElement) (This)->lpVtbl->putref_documentElement(This,domElement)
#define IXMLDOMDocument_createElement(This,p,domElement) (This)->lpVtbl->createElement(This,p,domElement)
#define IXMLDOMDocument_createDocumentFragment(This,docFrag) (This)->lpVtbl->createDocumentFragment(This,docFrag)
#define IXMLDOMDocument_createTextNode(This,p,text) (This)->lpVtbl->createTextNode(This,p,text)
#define IXMLDOMDocument_createComment(This,p,comment) (This)->lpVtbl->createComment(This,p,comment)
#define IXMLDOMDocument_createCDATASection(This,p,cdata) (This)->lpVtbl->createCDATASection(This,p,cdata)
#define IXMLDOMDocument_createProcessingInstruction(This,target,data,pi) (This)->lpVtbl->createProcessingInstruction(This,target,data,pi)
#define IXMLDOMDocument_createAttribute(This,p,attribute) (This)->lpVtbl->createAttribute(This,p,attribute)
#define IXMLDOMDocument_createEntityReference(This,p,entityRef) (This)->lpVtbl->createEntityReference(This,p,entityRef)
#define IXMLDOMDocument_getElementsByTagName(This,p,resultList) (This)->lpVtbl->getElementsByTagName(This,p,resultList)
#define IXMLDOMDocument_createNode(This,var,name,uri,node) (This)->lpVtbl->createNode(This,var,name,uri,node)
#define IXMLDOMDocument_nodeFromID(This,id,node) (This)->lpVtbl->nodeFromID(This,id,node)
#define IXMLDOMDocument_load(This,var1,pbool) (This)->lpVtbl->load(This,var1,pbool)
#define IXMLDOMDocument_get_readyState(This,value) (This)->lpVtbl->get_readyState(This,value)
#define IXMLDOMDocument_get_parseError(This,err) (This)->lpVtbl->get_parseError(This,err)
#define IXMLDOMDocument_get_url(This,p) (This)->lpVtbl->get_url(This,p)
#define IXMLDOMDocument_get_async(This,pbool) (This)->lpVtbl->get_async(This,pbool)
#define IXMLDOMDocument_put_async(This,pbool) (This)->lpVtbl->put_async(This,pbool)
#define IXMLDOMDocument_abort(This) (This)->lpVtbl->abort(This)
#define IXMLDOMDocument_loadXML(This,p,pbool) (This)->lpVtbl->loadXML(This,p,pbool)
#define IXMLDOMDocument_save(This,var1) (This)->lpVtbl->save(This,var1)
#define IXMLDOMDocument_get_validateOnParse(This,pbool) (This)->lpVtbl->get_validateOnParse(This,pbool)
#define IXMLDOMDocument_put_validateOnParse(This,pbool) (This)->lpVtbl->put_validateOnParse(This,pbool)
#define IXMLDOMDocument_get_resolveExternals(This,pbool) (This)->lpVtbl->get_resolveExternals(This,pbool)
#define IXMLDOMDocument_put_resolveExternals(This,pbool) (This)->lpVtbl->put_resolveExternals(This,pbool)
#define IXMLDOMDocument_get_preserveWhiteSpace(This,pbool) (This)->lpVtbl->get_preserveWhiteSpace(This,pbool)
#define IXMLDOMDocument_put_preserveWhiteSpace(This,pbool) (This)->lpVtbl->put_preserveWhiteSpace(This,pbool)
#define IXMLDOMDocument_put_onreadystatechange(This,var1) (This)->lpVtbl->put_onreadystatechange(This,var1)
#define IXMLDOMDocument_put_ondataavailable(This,var1) (This)->lpVtbl->put_ondataavailable(This,var1)
#define IXMLDOMDocument_put_ontransformnode(This,var1) (This)->lpVtbl->put_ontransformnode(This,var1)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument_QueryInterface(IXMLDOMDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMDocument_AddRef(IXMLDOMDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMDocument_Release(IXMLDOMDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument_GetTypeInfoCount(IXMLDOMDocument* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_GetTypeInfo(IXMLDOMDocument* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_GetIDsOfNames(IXMLDOMDocument* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_Invoke(IXMLDOMDocument* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_nodeName(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_nodeValue(IXMLDOMDocument* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_put_nodeValue(IXMLDOMDocument* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_nodeType(IXMLDOMDocument* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_parentNode(IXMLDOMDocument* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_childNodes(IXMLDOMDocument* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_firstChild(IXMLDOMDocument* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_lastChild(IXMLDOMDocument* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_previousSibling(IXMLDOMDocument* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_nextSibling(IXMLDOMDocument* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_attributes(IXMLDOMDocument* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_insertBefore(IXMLDOMDocument* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_replaceChild(IXMLDOMDocument* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_removeChild(IXMLDOMDocument* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_appendChild(IXMLDOMDocument* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_hasChildNodes(IXMLDOMDocument* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_ownerDocument(IXMLDOMDocument* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_cloneNode(IXMLDOMDocument* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_nodeTypeString(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_text(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_put_text(IXMLDOMDocument* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_specified(IXMLDOMDocument* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_definition(IXMLDOMDocument* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_nodeTypedValue(IXMLDOMDocument* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_put_nodeTypedValue(IXMLDOMDocument* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_dataType(IXMLDOMDocument* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_put_dataType(IXMLDOMDocument* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_xml(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_transformNode(IXMLDOMDocument* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_selectNodes(IXMLDOMDocument* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_selectSingleNode(IXMLDOMDocument* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_parsed(IXMLDOMDocument* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_namespaceURI(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_prefix(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_baseName(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_transformNodeToObject(IXMLDOMDocument* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMDocument methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_doctype(IXMLDOMDocument* This,IXMLDOMDocumentType **docType) {
    return This->lpVtbl->get_doctype(This,docType);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_implementation(IXMLDOMDocument* This,IXMLDOMImplementation **impl) {
    return This->lpVtbl->get_implementation(This,impl);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_documentElement(IXMLDOMDocument* This,IXMLDOMElement **domElement) {
    return This->lpVtbl->get_documentElement(This,domElement);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_putref_documentElement(IXMLDOMDocument* This,IXMLDOMElement *domElement) {
    return This->lpVtbl->putref_documentElement(This,domElement);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_createElement(IXMLDOMDocument* This,BSTR p,IXMLDOMElement **domElement) {
    return This->lpVtbl->createElement(This,p,domElement);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_createDocumentFragment(IXMLDOMDocument* This,IXMLDOMDocumentFragment **docFrag) {
    return This->lpVtbl->createDocumentFragment(This,docFrag);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_createTextNode(IXMLDOMDocument* This,BSTR p,IXMLDOMText **text) {
    return This->lpVtbl->createTextNode(This,p,text);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_createComment(IXMLDOMDocument* This,BSTR p,IXMLDOMComment **comment) {
    return This->lpVtbl->createComment(This,p,comment);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_createCDATASection(IXMLDOMDocument* This,BSTR p,IXMLDOMCDATASection **cdata) {
    return This->lpVtbl->createCDATASection(This,p,cdata);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_createProcessingInstruction(IXMLDOMDocument* This,BSTR target,BSTR data,IXMLDOMProcessingInstruction **pi) {
    return This->lpVtbl->createProcessingInstruction(This,target,data,pi);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_createAttribute(IXMLDOMDocument* This,BSTR p,IXMLDOMAttribute **attribute) {
    return This->lpVtbl->createAttribute(This,p,attribute);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_createEntityReference(IXMLDOMDocument* This,BSTR p,IXMLDOMEntityReference **entityRef) {
    return This->lpVtbl->createEntityReference(This,p,entityRef);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_getElementsByTagName(IXMLDOMDocument* This,BSTR p,IXMLDOMNodeList **resultList) {
    return This->lpVtbl->getElementsByTagName(This,p,resultList);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_createNode(IXMLDOMDocument* This,VARIANT var,BSTR name,BSTR uri,IXMLDOMNode **node) {
    return This->lpVtbl->createNode(This,var,name,uri,node);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_nodeFromID(IXMLDOMDocument* This,BSTR id,IXMLDOMNode **node) {
    return This->lpVtbl->nodeFromID(This,id,node);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_load(IXMLDOMDocument* This,VARIANT var1,VARIANT_BOOL *pbool) {
    return This->lpVtbl->load(This,var1,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_readyState(IXMLDOMDocument* This,LONG *value) {
    return This->lpVtbl->get_readyState(This,value);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_parseError(IXMLDOMDocument* This,IXMLDOMParseError **err) {
    return This->lpVtbl->get_parseError(This,err);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_url(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_async(IXMLDOMDocument* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_async(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_put_async(IXMLDOMDocument* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_async(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_abort(IXMLDOMDocument* This) {
    return This->lpVtbl->abort(This);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_loadXML(IXMLDOMDocument* This,BSTR p,VARIANT_BOOL *pbool) {
    return This->lpVtbl->loadXML(This,p,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_save(IXMLDOMDocument* This,VARIANT var1) {
    return This->lpVtbl->save(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_validateOnParse(IXMLDOMDocument* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_validateOnParse(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_put_validateOnParse(IXMLDOMDocument* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_validateOnParse(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_resolveExternals(IXMLDOMDocument* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_resolveExternals(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_put_resolveExternals(IXMLDOMDocument* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_resolveExternals(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_get_preserveWhiteSpace(IXMLDOMDocument* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_preserveWhiteSpace(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_put_preserveWhiteSpace(IXMLDOMDocument* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_preserveWhiteSpace(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_put_onreadystatechange(IXMLDOMDocument* This,VARIANT var1) {
    return This->lpVtbl->put_onreadystatechange(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_put_ondataavailable(IXMLDOMDocument* This,VARIANT var1) {
    return This->lpVtbl->put_ondataavailable(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument_put_ontransformnode(IXMLDOMDocument* This,VARIANT var1) {
    return This->lpVtbl->put_ontransformnode(This,var1);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMDocument_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMSchemaCollection interface
 */
#ifndef __IXMLDOMSchemaCollection_INTERFACE_DEFINED__
#define __IXMLDOMSchemaCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMSchemaCollection, 0x373984c8, 0xb845, 0x449b, 0x91,0xe7, 0x45,0xac,0x83,0x03,0x6a,0xde);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("373984c8-b845-449b-91e7-45ac83036ade")
IXMLDOMSchemaCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE add(
        BSTR uri,
        VARIANT var) = 0;

    virtual HRESULT STDMETHODCALLTYPE get(
        BSTR uri,
        IXMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE remove(
        BSTR uri) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_namespaceURI(
        LONG index,
        BSTR *len) = 0;

    virtual HRESULT STDMETHODCALLTYPE addCollection(
        IXMLDOMSchemaCollection *otherCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **ppUnk) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMSchemaCollection, 0x373984c8, 0xb845, 0x449b, 0x91,0xe7, 0x45,0xac,0x83,0x03,0x6a,0xde)
#endif
#else
typedef struct IXMLDOMSchemaCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMSchemaCollection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMSchemaCollection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMSchemaCollection *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMSchemaCollection *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMSchemaCollection *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMSchemaCollection *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMSchemaCollection *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMSchemaCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *add)(
        IXMLDOMSchemaCollection *This,
        BSTR uri,
        VARIANT var);

    HRESULT (STDMETHODCALLTYPE *get)(
        IXMLDOMSchemaCollection *This,
        BSTR uri,
        IXMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *remove)(
        IXMLDOMSchemaCollection *This,
        BSTR uri);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IXMLDOMSchemaCollection *This,
        LONG *length);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMSchemaCollection *This,
        LONG index,
        BSTR *len);

    HRESULT (STDMETHODCALLTYPE *addCollection)(
        IXMLDOMSchemaCollection *This,
        IXMLDOMSchemaCollection *otherCollection);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IXMLDOMSchemaCollection *This,
        IUnknown **ppUnk);

    END_INTERFACE
} IXMLDOMSchemaCollectionVtbl;

interface IXMLDOMSchemaCollection {
    CONST_VTBL IXMLDOMSchemaCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMSchemaCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMSchemaCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMSchemaCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMSchemaCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMSchemaCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMSchemaCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMSchemaCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMSchemaCollection methods ***/
#define IXMLDOMSchemaCollection_add(This,uri,var) (This)->lpVtbl->add(This,uri,var)
#define IXMLDOMSchemaCollection_get(This,uri,node) (This)->lpVtbl->get(This,uri,node)
#define IXMLDOMSchemaCollection_remove(This,uri) (This)->lpVtbl->remove(This,uri)
#define IXMLDOMSchemaCollection_get_length(This,length) (This)->lpVtbl->get_length(This,length)
#define IXMLDOMSchemaCollection_get_namespaceURI(This,index,len) (This)->lpVtbl->get_namespaceURI(This,index,len)
#define IXMLDOMSchemaCollection_addCollection(This,otherCollection) (This)->lpVtbl->addCollection(This,otherCollection)
#define IXMLDOMSchemaCollection_get__newEnum(This,ppUnk) (This)->lpVtbl->get__newEnum(This,ppUnk)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection_QueryInterface(IXMLDOMSchemaCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMSchemaCollection_AddRef(IXMLDOMSchemaCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMSchemaCollection_Release(IXMLDOMSchemaCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection_GetTypeInfoCount(IXMLDOMSchemaCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection_GetTypeInfo(IXMLDOMSchemaCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection_GetIDsOfNames(IXMLDOMSchemaCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection_Invoke(IXMLDOMSchemaCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMSchemaCollection methods ***/
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection_add(IXMLDOMSchemaCollection* This,BSTR uri,VARIANT var) {
    return This->lpVtbl->add(This,uri,var);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection_get(IXMLDOMSchemaCollection* This,BSTR uri,IXMLDOMNode **node) {
    return This->lpVtbl->get(This,uri,node);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection_remove(IXMLDOMSchemaCollection* This,BSTR uri) {
    return This->lpVtbl->remove(This,uri);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection_get_length(IXMLDOMSchemaCollection* This,LONG *length) {
    return This->lpVtbl->get_length(This,length);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection_get_namespaceURI(IXMLDOMSchemaCollection* This,LONG index,BSTR *len) {
    return This->lpVtbl->get_namespaceURI(This,index,len);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection_addCollection(IXMLDOMSchemaCollection* This,IXMLDOMSchemaCollection *otherCollection) {
    return This->lpVtbl->addCollection(This,otherCollection);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection_get__newEnum(IXMLDOMSchemaCollection* This,IUnknown **ppUnk) {
    return This->lpVtbl->get__newEnum(This,ppUnk);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMSchemaCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMSchemaCollection2 interface
 */
#ifndef __IXMLDOMSchemaCollection2_INTERFACE_DEFINED__
#define __IXMLDOMSchemaCollection2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMSchemaCollection2, 0x50ea08b0, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08b0-dd1b-4664-9a50-c2f40f4bd79a")
IXMLDOMSchemaCollection2 : public IXMLDOMSchemaCollection
{
    virtual HRESULT STDMETHODCALLTYPE validate(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_validateOnLoad(
        VARIANT_BOOL validateOnLoad) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_validateOnLoad(
        VARIANT_BOOL *validateOnLoad) = 0;

    virtual HRESULT STDMETHODCALLTYPE getSchema(
        BSTR namespaceURI,
        ISchema **schema) = 0;

    virtual HRESULT STDMETHODCALLTYPE getDeclaration(
        IXMLDOMNode *node,
        ISchemaItem **item) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMSchemaCollection2, 0x50ea08b0, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct IXMLDOMSchemaCollection2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMSchemaCollection2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMSchemaCollection2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMSchemaCollection2 *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMSchemaCollection2 *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMSchemaCollection2 *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMSchemaCollection2 *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMSchemaCollection2 *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMSchemaCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *add)(
        IXMLDOMSchemaCollection2 *This,
        BSTR uri,
        VARIANT var);

    HRESULT (STDMETHODCALLTYPE *get)(
        IXMLDOMSchemaCollection2 *This,
        BSTR uri,
        IXMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *remove)(
        IXMLDOMSchemaCollection2 *This,
        BSTR uri);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IXMLDOMSchemaCollection2 *This,
        LONG *length);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMSchemaCollection2 *This,
        LONG index,
        BSTR *len);

    HRESULT (STDMETHODCALLTYPE *addCollection)(
        IXMLDOMSchemaCollection2 *This,
        IXMLDOMSchemaCollection *otherCollection);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IXMLDOMSchemaCollection2 *This,
        IUnknown **ppUnk);

    /*** IXMLDOMSchemaCollection2 methods ***/
    HRESULT (STDMETHODCALLTYPE *validate)(
        IXMLDOMSchemaCollection2 *This);

    HRESULT (STDMETHODCALLTYPE *put_validateOnLoad)(
        IXMLDOMSchemaCollection2 *This,
        VARIANT_BOOL validateOnLoad);

    HRESULT (STDMETHODCALLTYPE *get_validateOnLoad)(
        IXMLDOMSchemaCollection2 *This,
        VARIANT_BOOL *validateOnLoad);

    HRESULT (STDMETHODCALLTYPE *getSchema)(
        IXMLDOMSchemaCollection2 *This,
        BSTR namespaceURI,
        ISchema **schema);

    HRESULT (STDMETHODCALLTYPE *getDeclaration)(
        IXMLDOMSchemaCollection2 *This,
        IXMLDOMNode *node,
        ISchemaItem **item);

    END_INTERFACE
} IXMLDOMSchemaCollection2Vtbl;

interface IXMLDOMSchemaCollection2 {
    CONST_VTBL IXMLDOMSchemaCollection2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMSchemaCollection2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMSchemaCollection2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMSchemaCollection2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMSchemaCollection2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMSchemaCollection2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMSchemaCollection2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMSchemaCollection2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMSchemaCollection methods ***/
#define IXMLDOMSchemaCollection2_add(This,uri,var) (This)->lpVtbl->add(This,uri,var)
#define IXMLDOMSchemaCollection2_get(This,uri,node) (This)->lpVtbl->get(This,uri,node)
#define IXMLDOMSchemaCollection2_remove(This,uri) (This)->lpVtbl->remove(This,uri)
#define IXMLDOMSchemaCollection2_get_length(This,length) (This)->lpVtbl->get_length(This,length)
#define IXMLDOMSchemaCollection2_get_namespaceURI(This,index,len) (This)->lpVtbl->get_namespaceURI(This,index,len)
#define IXMLDOMSchemaCollection2_addCollection(This,otherCollection) (This)->lpVtbl->addCollection(This,otherCollection)
#define IXMLDOMSchemaCollection2_get__newEnum(This,ppUnk) (This)->lpVtbl->get__newEnum(This,ppUnk)
/*** IXMLDOMSchemaCollection2 methods ***/
#define IXMLDOMSchemaCollection2_validate(This) (This)->lpVtbl->validate(This)
#define IXMLDOMSchemaCollection2_put_validateOnLoad(This,validateOnLoad) (This)->lpVtbl->put_validateOnLoad(This,validateOnLoad)
#define IXMLDOMSchemaCollection2_get_validateOnLoad(This,validateOnLoad) (This)->lpVtbl->get_validateOnLoad(This,validateOnLoad)
#define IXMLDOMSchemaCollection2_getSchema(This,namespaceURI,schema) (This)->lpVtbl->getSchema(This,namespaceURI,schema)
#define IXMLDOMSchemaCollection2_getDeclaration(This,node,item) (This)->lpVtbl->getDeclaration(This,node,item)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_QueryInterface(IXMLDOMSchemaCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMSchemaCollection2_AddRef(IXMLDOMSchemaCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMSchemaCollection2_Release(IXMLDOMSchemaCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_GetTypeInfoCount(IXMLDOMSchemaCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_GetTypeInfo(IXMLDOMSchemaCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_GetIDsOfNames(IXMLDOMSchemaCollection2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_Invoke(IXMLDOMSchemaCollection2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMSchemaCollection methods ***/
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_add(IXMLDOMSchemaCollection2* This,BSTR uri,VARIANT var) {
    return This->lpVtbl->add(This,uri,var);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_get(IXMLDOMSchemaCollection2* This,BSTR uri,IXMLDOMNode **node) {
    return This->lpVtbl->get(This,uri,node);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_remove(IXMLDOMSchemaCollection2* This,BSTR uri) {
    return This->lpVtbl->remove(This,uri);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_get_length(IXMLDOMSchemaCollection2* This,LONG *length) {
    return This->lpVtbl->get_length(This,length);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_get_namespaceURI(IXMLDOMSchemaCollection2* This,LONG index,BSTR *len) {
    return This->lpVtbl->get_namespaceURI(This,index,len);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_addCollection(IXMLDOMSchemaCollection2* This,IXMLDOMSchemaCollection *otherCollection) {
    return This->lpVtbl->addCollection(This,otherCollection);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_get__newEnum(IXMLDOMSchemaCollection2* This,IUnknown **ppUnk) {
    return This->lpVtbl->get__newEnum(This,ppUnk);
}
/*** IXMLDOMSchemaCollection2 methods ***/
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_validate(IXMLDOMSchemaCollection2* This) {
    return This->lpVtbl->validate(This);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_put_validateOnLoad(IXMLDOMSchemaCollection2* This,VARIANT_BOOL validateOnLoad) {
    return This->lpVtbl->put_validateOnLoad(This,validateOnLoad);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_get_validateOnLoad(IXMLDOMSchemaCollection2* This,VARIANT_BOOL *validateOnLoad) {
    return This->lpVtbl->get_validateOnLoad(This,validateOnLoad);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_getSchema(IXMLDOMSchemaCollection2* This,BSTR namespaceURI,ISchema **schema) {
    return This->lpVtbl->getSchema(This,namespaceURI,schema);
}
static __WIDL_INLINE HRESULT IXMLDOMSchemaCollection2_getDeclaration(IXMLDOMSchemaCollection2* This,IXMLDOMNode *node,ISchemaItem **item) {
    return This->lpVtbl->getDeclaration(This,node,item);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMSchemaCollection2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMDocument2 interface
 */
#ifndef __IXMLDOMDocument2_INTERFACE_DEFINED__
#define __IXMLDOMDocument2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMDocument2, 0x2933bf95, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf95-7b36-11d2-b20e-00c04f983e60")
IXMLDOMDocument2 : public IXMLDOMDocument
{
    virtual HRESULT STDMETHODCALLTYPE get_namespaces(
        IXMLDOMSchemaCollection **schemaCollection) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_schemas(
        VARIANT *var1) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_schemas(
        VARIANT var1) = 0;

    virtual HRESULT STDMETHODCALLTYPE validate(
        IXMLDOMParseError **err) = 0;

    virtual HRESULT STDMETHODCALLTYPE setProperty(
        BSTR p,
        VARIANT var) = 0;

    virtual HRESULT STDMETHODCALLTYPE getProperty(
        BSTR p,
        VARIANT *var) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMDocument2, 0x2933bf95, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMDocument2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMDocument2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMDocument2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMDocument2 *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMDocument2 *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMDocument2 *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMDocument2 *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMDocument2 *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMDocument2 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMDocument2 *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMDocument2 *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMDocument2 *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMDocument2 *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMDocument2 *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMDocument2 *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMDocument2 *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMDocument2 *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMDocument2 *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMDocument2 *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMDocument2 *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMDocument2 *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMDocument2 *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMDocument2 *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMDocument2 *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMDocument2 *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMDocument2 *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMDocument2 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMDocument2 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMDocument2 *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMDocument2 *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMDocument2 *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMDocument2 *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMDocument2 *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMDocument2 *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMDocument2 *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMDocument2 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMDocument2 *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMDocument2 *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMDocument2 *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMDocument2 *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMDocument2 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMDocument2 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMDocument2 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMDocument2 *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    /*** IXMLDOMDocument methods ***/
    HRESULT (STDMETHODCALLTYPE *get_doctype)(
        IXMLDOMDocument2 *This,
        IXMLDOMDocumentType **docType);

    HRESULT (STDMETHODCALLTYPE *get_implementation)(
        IXMLDOMDocument2 *This,
        IXMLDOMImplementation **impl);

    HRESULT (STDMETHODCALLTYPE *get_documentElement)(
        IXMLDOMDocument2 *This,
        IXMLDOMElement **domElement);

    HRESULT (STDMETHODCALLTYPE *putref_documentElement)(
        IXMLDOMDocument2 *This,
        IXMLDOMElement *domElement);

    HRESULT (STDMETHODCALLTYPE *createElement)(
        IXMLDOMDocument2 *This,
        BSTR p,
        IXMLDOMElement **domElement);

    HRESULT (STDMETHODCALLTYPE *createDocumentFragment)(
        IXMLDOMDocument2 *This,
        IXMLDOMDocumentFragment **docFrag);

    HRESULT (STDMETHODCALLTYPE *createTextNode)(
        IXMLDOMDocument2 *This,
        BSTR p,
        IXMLDOMText **text);

    HRESULT (STDMETHODCALLTYPE *createComment)(
        IXMLDOMDocument2 *This,
        BSTR p,
        IXMLDOMComment **comment);

    HRESULT (STDMETHODCALLTYPE *createCDATASection)(
        IXMLDOMDocument2 *This,
        BSTR p,
        IXMLDOMCDATASection **cdata);

    HRESULT (STDMETHODCALLTYPE *createProcessingInstruction)(
        IXMLDOMDocument2 *This,
        BSTR target,
        BSTR data,
        IXMLDOMProcessingInstruction **pi);

    HRESULT (STDMETHODCALLTYPE *createAttribute)(
        IXMLDOMDocument2 *This,
        BSTR p,
        IXMLDOMAttribute **attribute);

    HRESULT (STDMETHODCALLTYPE *createEntityReference)(
        IXMLDOMDocument2 *This,
        BSTR p,
        IXMLDOMEntityReference **entityRef);

    HRESULT (STDMETHODCALLTYPE *getElementsByTagName)(
        IXMLDOMDocument2 *This,
        BSTR p,
        IXMLDOMNodeList **resultList);

    HRESULT (STDMETHODCALLTYPE *createNode)(
        IXMLDOMDocument2 *This,
        VARIANT var,
        BSTR name,
        BSTR uri,
        IXMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *nodeFromID)(
        IXMLDOMDocument2 *This,
        BSTR id,
        IXMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *load)(
        IXMLDOMDocument2 *This,
        VARIANT var1,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IXMLDOMDocument2 *This,
        LONG *value);

    HRESULT (STDMETHODCALLTYPE *get_parseError)(
        IXMLDOMDocument2 *This,
        IXMLDOMParseError **err);

    HRESULT (STDMETHODCALLTYPE *get_url)(
        IXMLDOMDocument2 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_async)(
        IXMLDOMDocument2 *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *put_async)(
        IXMLDOMDocument2 *This,
        VARIANT_BOOL pbool);

    HRESULT (STDMETHODCALLTYPE *abort)(
        IXMLDOMDocument2 *This);

    HRESULT (STDMETHODCALLTYPE *loadXML)(
        IXMLDOMDocument2 *This,
        BSTR p,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *save)(
        IXMLDOMDocument2 *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_validateOnParse)(
        IXMLDOMDocument2 *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *put_validateOnParse)(
        IXMLDOMDocument2 *This,
        VARIANT_BOOL pbool);

    HRESULT (STDMETHODCALLTYPE *get_resolveExternals)(
        IXMLDOMDocument2 *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *put_resolveExternals)(
        IXMLDOMDocument2 *This,
        VARIANT_BOOL pbool);

    HRESULT (STDMETHODCALLTYPE *get_preserveWhiteSpace)(
        IXMLDOMDocument2 *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *put_preserveWhiteSpace)(
        IXMLDOMDocument2 *This,
        VARIANT_BOOL pbool);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IXMLDOMDocument2 *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *put_ondataavailable)(
        IXMLDOMDocument2 *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *put_ontransformnode)(
        IXMLDOMDocument2 *This,
        VARIANT var1);

    /*** IXMLDOMDocument2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_namespaces)(
        IXMLDOMDocument2 *This,
        IXMLDOMSchemaCollection **schemaCollection);

    HRESULT (STDMETHODCALLTYPE *get_schemas)(
        IXMLDOMDocument2 *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *putref_schemas)(
        IXMLDOMDocument2 *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *validate)(
        IXMLDOMDocument2 *This,
        IXMLDOMParseError **err);

    HRESULT (STDMETHODCALLTYPE *setProperty)(
        IXMLDOMDocument2 *This,
        BSTR p,
        VARIANT var);

    HRESULT (STDMETHODCALLTYPE *getProperty)(
        IXMLDOMDocument2 *This,
        BSTR p,
        VARIANT *var);

    END_INTERFACE
} IXMLDOMDocument2Vtbl;

interface IXMLDOMDocument2 {
    CONST_VTBL IXMLDOMDocument2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMDocument2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMDocument2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMDocument2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMDocument2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMDocument2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMDocument2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMDocument2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMDocument2_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMDocument2_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMDocument2_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMDocument2_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMDocument2_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMDocument2_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMDocument2_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMDocument2_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMDocument2_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMDocument2_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMDocument2_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMDocument2_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMDocument2_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMDocument2_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMDocument2_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMDocument2_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMDocument2_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMDocument2_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMDocument2_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMDocument2_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMDocument2_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMDocument2_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMDocument2_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMDocument2_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMDocument2_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMDocument2_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMDocument2_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMDocument2_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMDocument2_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMDocument2_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMDocument2_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMDocument2_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMDocument2_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMDocument2_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMDocument2_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMDocument2_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
/*** IXMLDOMDocument methods ***/
#define IXMLDOMDocument2_get_doctype(This,docType) (This)->lpVtbl->get_doctype(This,docType)
#define IXMLDOMDocument2_get_implementation(This,impl) (This)->lpVtbl->get_implementation(This,impl)
#define IXMLDOMDocument2_get_documentElement(This,domElement) (This)->lpVtbl->get_documentElement(This,domElement)
#define IXMLDOMDocument2_putref_documentElement(This,domElement) (This)->lpVtbl->putref_documentElement(This,domElement)
#define IXMLDOMDocument2_createElement(This,p,domElement) (This)->lpVtbl->createElement(This,p,domElement)
#define IXMLDOMDocument2_createDocumentFragment(This,docFrag) (This)->lpVtbl->createDocumentFragment(This,docFrag)
#define IXMLDOMDocument2_createTextNode(This,p,text) (This)->lpVtbl->createTextNode(This,p,text)
#define IXMLDOMDocument2_createComment(This,p,comment) (This)->lpVtbl->createComment(This,p,comment)
#define IXMLDOMDocument2_createCDATASection(This,p,cdata) (This)->lpVtbl->createCDATASection(This,p,cdata)
#define IXMLDOMDocument2_createProcessingInstruction(This,target,data,pi) (This)->lpVtbl->createProcessingInstruction(This,target,data,pi)
#define IXMLDOMDocument2_createAttribute(This,p,attribute) (This)->lpVtbl->createAttribute(This,p,attribute)
#define IXMLDOMDocument2_createEntityReference(This,p,entityRef) (This)->lpVtbl->createEntityReference(This,p,entityRef)
#define IXMLDOMDocument2_getElementsByTagName(This,p,resultList) (This)->lpVtbl->getElementsByTagName(This,p,resultList)
#define IXMLDOMDocument2_createNode(This,var,name,uri,node) (This)->lpVtbl->createNode(This,var,name,uri,node)
#define IXMLDOMDocument2_nodeFromID(This,id,node) (This)->lpVtbl->nodeFromID(This,id,node)
#define IXMLDOMDocument2_load(This,var1,pbool) (This)->lpVtbl->load(This,var1,pbool)
#define IXMLDOMDocument2_get_readyState(This,value) (This)->lpVtbl->get_readyState(This,value)
#define IXMLDOMDocument2_get_parseError(This,err) (This)->lpVtbl->get_parseError(This,err)
#define IXMLDOMDocument2_get_url(This,p) (This)->lpVtbl->get_url(This,p)
#define IXMLDOMDocument2_get_async(This,pbool) (This)->lpVtbl->get_async(This,pbool)
#define IXMLDOMDocument2_put_async(This,pbool) (This)->lpVtbl->put_async(This,pbool)
#define IXMLDOMDocument2_abort(This) (This)->lpVtbl->abort(This)
#define IXMLDOMDocument2_loadXML(This,p,pbool) (This)->lpVtbl->loadXML(This,p,pbool)
#define IXMLDOMDocument2_save(This,var1) (This)->lpVtbl->save(This,var1)
#define IXMLDOMDocument2_get_validateOnParse(This,pbool) (This)->lpVtbl->get_validateOnParse(This,pbool)
#define IXMLDOMDocument2_put_validateOnParse(This,pbool) (This)->lpVtbl->put_validateOnParse(This,pbool)
#define IXMLDOMDocument2_get_resolveExternals(This,pbool) (This)->lpVtbl->get_resolveExternals(This,pbool)
#define IXMLDOMDocument2_put_resolveExternals(This,pbool) (This)->lpVtbl->put_resolveExternals(This,pbool)
#define IXMLDOMDocument2_get_preserveWhiteSpace(This,pbool) (This)->lpVtbl->get_preserveWhiteSpace(This,pbool)
#define IXMLDOMDocument2_put_preserveWhiteSpace(This,pbool) (This)->lpVtbl->put_preserveWhiteSpace(This,pbool)
#define IXMLDOMDocument2_put_onreadystatechange(This,var1) (This)->lpVtbl->put_onreadystatechange(This,var1)
#define IXMLDOMDocument2_put_ondataavailable(This,var1) (This)->lpVtbl->put_ondataavailable(This,var1)
#define IXMLDOMDocument2_put_ontransformnode(This,var1) (This)->lpVtbl->put_ontransformnode(This,var1)
/*** IXMLDOMDocument2 methods ***/
#define IXMLDOMDocument2_get_namespaces(This,schemaCollection) (This)->lpVtbl->get_namespaces(This,schemaCollection)
#define IXMLDOMDocument2_get_schemas(This,var1) (This)->lpVtbl->get_schemas(This,var1)
#define IXMLDOMDocument2_putref_schemas(This,var1) (This)->lpVtbl->putref_schemas(This,var1)
#define IXMLDOMDocument2_validate(This,err) (This)->lpVtbl->validate(This,err)
#define IXMLDOMDocument2_setProperty(This,p,var) (This)->lpVtbl->setProperty(This,p,var)
#define IXMLDOMDocument2_getProperty(This,p,var) (This)->lpVtbl->getProperty(This,p,var)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument2_QueryInterface(IXMLDOMDocument2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMDocument2_AddRef(IXMLDOMDocument2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMDocument2_Release(IXMLDOMDocument2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument2_GetTypeInfoCount(IXMLDOMDocument2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_GetTypeInfo(IXMLDOMDocument2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_GetIDsOfNames(IXMLDOMDocument2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_Invoke(IXMLDOMDocument2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_nodeName(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_nodeValue(IXMLDOMDocument2* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_put_nodeValue(IXMLDOMDocument2* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_nodeType(IXMLDOMDocument2* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_parentNode(IXMLDOMDocument2* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_childNodes(IXMLDOMDocument2* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_firstChild(IXMLDOMDocument2* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_lastChild(IXMLDOMDocument2* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_previousSibling(IXMLDOMDocument2* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_nextSibling(IXMLDOMDocument2* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_attributes(IXMLDOMDocument2* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_insertBefore(IXMLDOMDocument2* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_replaceChild(IXMLDOMDocument2* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_removeChild(IXMLDOMDocument2* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_appendChild(IXMLDOMDocument2* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_hasChildNodes(IXMLDOMDocument2* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_ownerDocument(IXMLDOMDocument2* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_cloneNode(IXMLDOMDocument2* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_nodeTypeString(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_text(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_put_text(IXMLDOMDocument2* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_specified(IXMLDOMDocument2* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_definition(IXMLDOMDocument2* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_nodeTypedValue(IXMLDOMDocument2* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_put_nodeTypedValue(IXMLDOMDocument2* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_dataType(IXMLDOMDocument2* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_put_dataType(IXMLDOMDocument2* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_xml(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_transformNode(IXMLDOMDocument2* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_selectNodes(IXMLDOMDocument2* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_selectSingleNode(IXMLDOMDocument2* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_parsed(IXMLDOMDocument2* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_namespaceURI(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_prefix(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_baseName(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_transformNodeToObject(IXMLDOMDocument2* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMDocument methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_doctype(IXMLDOMDocument2* This,IXMLDOMDocumentType **docType) {
    return This->lpVtbl->get_doctype(This,docType);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_implementation(IXMLDOMDocument2* This,IXMLDOMImplementation **impl) {
    return This->lpVtbl->get_implementation(This,impl);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_documentElement(IXMLDOMDocument2* This,IXMLDOMElement **domElement) {
    return This->lpVtbl->get_documentElement(This,domElement);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_putref_documentElement(IXMLDOMDocument2* This,IXMLDOMElement *domElement) {
    return This->lpVtbl->putref_documentElement(This,domElement);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_createElement(IXMLDOMDocument2* This,BSTR p,IXMLDOMElement **domElement) {
    return This->lpVtbl->createElement(This,p,domElement);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_createDocumentFragment(IXMLDOMDocument2* This,IXMLDOMDocumentFragment **docFrag) {
    return This->lpVtbl->createDocumentFragment(This,docFrag);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_createTextNode(IXMLDOMDocument2* This,BSTR p,IXMLDOMText **text) {
    return This->lpVtbl->createTextNode(This,p,text);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_createComment(IXMLDOMDocument2* This,BSTR p,IXMLDOMComment **comment) {
    return This->lpVtbl->createComment(This,p,comment);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_createCDATASection(IXMLDOMDocument2* This,BSTR p,IXMLDOMCDATASection **cdata) {
    return This->lpVtbl->createCDATASection(This,p,cdata);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_createProcessingInstruction(IXMLDOMDocument2* This,BSTR target,BSTR data,IXMLDOMProcessingInstruction **pi) {
    return This->lpVtbl->createProcessingInstruction(This,target,data,pi);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_createAttribute(IXMLDOMDocument2* This,BSTR p,IXMLDOMAttribute **attribute) {
    return This->lpVtbl->createAttribute(This,p,attribute);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_createEntityReference(IXMLDOMDocument2* This,BSTR p,IXMLDOMEntityReference **entityRef) {
    return This->lpVtbl->createEntityReference(This,p,entityRef);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_getElementsByTagName(IXMLDOMDocument2* This,BSTR p,IXMLDOMNodeList **resultList) {
    return This->lpVtbl->getElementsByTagName(This,p,resultList);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_createNode(IXMLDOMDocument2* This,VARIANT var,BSTR name,BSTR uri,IXMLDOMNode **node) {
    return This->lpVtbl->createNode(This,var,name,uri,node);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_nodeFromID(IXMLDOMDocument2* This,BSTR id,IXMLDOMNode **node) {
    return This->lpVtbl->nodeFromID(This,id,node);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_load(IXMLDOMDocument2* This,VARIANT var1,VARIANT_BOOL *pbool) {
    return This->lpVtbl->load(This,var1,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_readyState(IXMLDOMDocument2* This,LONG *value) {
    return This->lpVtbl->get_readyState(This,value);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_parseError(IXMLDOMDocument2* This,IXMLDOMParseError **err) {
    return This->lpVtbl->get_parseError(This,err);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_url(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_async(IXMLDOMDocument2* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_async(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_put_async(IXMLDOMDocument2* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_async(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_abort(IXMLDOMDocument2* This) {
    return This->lpVtbl->abort(This);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_loadXML(IXMLDOMDocument2* This,BSTR p,VARIANT_BOOL *pbool) {
    return This->lpVtbl->loadXML(This,p,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_save(IXMLDOMDocument2* This,VARIANT var1) {
    return This->lpVtbl->save(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_validateOnParse(IXMLDOMDocument2* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_validateOnParse(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_put_validateOnParse(IXMLDOMDocument2* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_validateOnParse(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_resolveExternals(IXMLDOMDocument2* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_resolveExternals(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_put_resolveExternals(IXMLDOMDocument2* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_resolveExternals(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_preserveWhiteSpace(IXMLDOMDocument2* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_preserveWhiteSpace(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_put_preserveWhiteSpace(IXMLDOMDocument2* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_preserveWhiteSpace(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_put_onreadystatechange(IXMLDOMDocument2* This,VARIANT var1) {
    return This->lpVtbl->put_onreadystatechange(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_put_ondataavailable(IXMLDOMDocument2* This,VARIANT var1) {
    return This->lpVtbl->put_ondataavailable(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_put_ontransformnode(IXMLDOMDocument2* This,VARIANT var1) {
    return This->lpVtbl->put_ontransformnode(This,var1);
}
/*** IXMLDOMDocument2 methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_namespaces(IXMLDOMDocument2* This,IXMLDOMSchemaCollection **schemaCollection) {
    return This->lpVtbl->get_namespaces(This,schemaCollection);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_get_schemas(IXMLDOMDocument2* This,VARIANT *var1) {
    return This->lpVtbl->get_schemas(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_putref_schemas(IXMLDOMDocument2* This,VARIANT var1) {
    return This->lpVtbl->putref_schemas(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_validate(IXMLDOMDocument2* This,IXMLDOMParseError **err) {
    return This->lpVtbl->validate(This,err);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_setProperty(IXMLDOMDocument2* This,BSTR p,VARIANT var) {
    return This->lpVtbl->setProperty(This,p,var);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument2_getProperty(IXMLDOMDocument2* This,BSTR p,VARIANT *var) {
    return This->lpVtbl->getProperty(This,p,var);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMDocument2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMDocument3 interface
 */
#ifndef __IXMLDOMDocument3_INTERFACE_DEFINED__
#define __IXMLDOMDocument3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMDocument3, 0x2933bf96, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf96-7b36-11d2-b20e-00c04f983e60")
IXMLDOMDocument3 : public IXMLDOMDocument2
{
    virtual HRESULT STDMETHODCALLTYPE validateNode(
        IXMLDOMNode *node,
        IXMLDOMParseError **error) = 0;

    virtual HRESULT STDMETHODCALLTYPE importNode(
        IXMLDOMNode *node,
        VARIANT_BOOL deep,
        IXMLDOMNode **clone) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMDocument3, 0x2933bf96, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMDocument3Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMDocument3 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMDocument3 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMDocument3 *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMDocument3 *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMDocument3 *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMDocument3 *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMDocument3 *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMDocument3 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMDocument3 *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMDocument3 *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMDocument3 *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMDocument3 *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMDocument3 *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMDocument3 *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMDocument3 *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMDocument3 *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMDocument3 *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMDocument3 *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMDocument3 *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMDocument3 *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMDocument3 *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMDocument3 *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMDocument3 *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMDocument3 *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMDocument3 *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMDocument3 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMDocument3 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMDocument3 *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMDocument3 *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMDocument3 *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMDocument3 *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMDocument3 *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMDocument3 *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMDocument3 *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMDocument3 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMDocument3 *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMDocument3 *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMDocument3 *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMDocument3 *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMDocument3 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMDocument3 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMDocument3 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMDocument3 *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    /*** IXMLDOMDocument methods ***/
    HRESULT (STDMETHODCALLTYPE *get_doctype)(
        IXMLDOMDocument3 *This,
        IXMLDOMDocumentType **docType);

    HRESULT (STDMETHODCALLTYPE *get_implementation)(
        IXMLDOMDocument3 *This,
        IXMLDOMImplementation **impl);

    HRESULT (STDMETHODCALLTYPE *get_documentElement)(
        IXMLDOMDocument3 *This,
        IXMLDOMElement **domElement);

    HRESULT (STDMETHODCALLTYPE *putref_documentElement)(
        IXMLDOMDocument3 *This,
        IXMLDOMElement *domElement);

    HRESULT (STDMETHODCALLTYPE *createElement)(
        IXMLDOMDocument3 *This,
        BSTR p,
        IXMLDOMElement **domElement);

    HRESULT (STDMETHODCALLTYPE *createDocumentFragment)(
        IXMLDOMDocument3 *This,
        IXMLDOMDocumentFragment **docFrag);

    HRESULT (STDMETHODCALLTYPE *createTextNode)(
        IXMLDOMDocument3 *This,
        BSTR p,
        IXMLDOMText **text);

    HRESULT (STDMETHODCALLTYPE *createComment)(
        IXMLDOMDocument3 *This,
        BSTR p,
        IXMLDOMComment **comment);

    HRESULT (STDMETHODCALLTYPE *createCDATASection)(
        IXMLDOMDocument3 *This,
        BSTR p,
        IXMLDOMCDATASection **cdata);

    HRESULT (STDMETHODCALLTYPE *createProcessingInstruction)(
        IXMLDOMDocument3 *This,
        BSTR target,
        BSTR data,
        IXMLDOMProcessingInstruction **pi);

    HRESULT (STDMETHODCALLTYPE *createAttribute)(
        IXMLDOMDocument3 *This,
        BSTR p,
        IXMLDOMAttribute **attribute);

    HRESULT (STDMETHODCALLTYPE *createEntityReference)(
        IXMLDOMDocument3 *This,
        BSTR p,
        IXMLDOMEntityReference **entityRef);

    HRESULT (STDMETHODCALLTYPE *getElementsByTagName)(
        IXMLDOMDocument3 *This,
        BSTR p,
        IXMLDOMNodeList **resultList);

    HRESULT (STDMETHODCALLTYPE *createNode)(
        IXMLDOMDocument3 *This,
        VARIANT var,
        BSTR name,
        BSTR uri,
        IXMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *nodeFromID)(
        IXMLDOMDocument3 *This,
        BSTR id,
        IXMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *load)(
        IXMLDOMDocument3 *This,
        VARIANT var1,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IXMLDOMDocument3 *This,
        LONG *value);

    HRESULT (STDMETHODCALLTYPE *get_parseError)(
        IXMLDOMDocument3 *This,
        IXMLDOMParseError **err);

    HRESULT (STDMETHODCALLTYPE *get_url)(
        IXMLDOMDocument3 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_async)(
        IXMLDOMDocument3 *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *put_async)(
        IXMLDOMDocument3 *This,
        VARIANT_BOOL pbool);

    HRESULT (STDMETHODCALLTYPE *abort)(
        IXMLDOMDocument3 *This);

    HRESULT (STDMETHODCALLTYPE *loadXML)(
        IXMLDOMDocument3 *This,
        BSTR p,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *save)(
        IXMLDOMDocument3 *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_validateOnParse)(
        IXMLDOMDocument3 *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *put_validateOnParse)(
        IXMLDOMDocument3 *This,
        VARIANT_BOOL pbool);

    HRESULT (STDMETHODCALLTYPE *get_resolveExternals)(
        IXMLDOMDocument3 *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *put_resolveExternals)(
        IXMLDOMDocument3 *This,
        VARIANT_BOOL pbool);

    HRESULT (STDMETHODCALLTYPE *get_preserveWhiteSpace)(
        IXMLDOMDocument3 *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *put_preserveWhiteSpace)(
        IXMLDOMDocument3 *This,
        VARIANT_BOOL pbool);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IXMLDOMDocument3 *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *put_ondataavailable)(
        IXMLDOMDocument3 *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *put_ontransformnode)(
        IXMLDOMDocument3 *This,
        VARIANT var1);

    /*** IXMLDOMDocument2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_namespaces)(
        IXMLDOMDocument3 *This,
        IXMLDOMSchemaCollection **schemaCollection);

    HRESULT (STDMETHODCALLTYPE *get_schemas)(
        IXMLDOMDocument3 *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *putref_schemas)(
        IXMLDOMDocument3 *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *validate)(
        IXMLDOMDocument3 *This,
        IXMLDOMParseError **err);

    HRESULT (STDMETHODCALLTYPE *setProperty)(
        IXMLDOMDocument3 *This,
        BSTR p,
        VARIANT var);

    HRESULT (STDMETHODCALLTYPE *getProperty)(
        IXMLDOMDocument3 *This,
        BSTR p,
        VARIANT *var);

    /*** IXMLDOMDocument3 methods ***/
    HRESULT (STDMETHODCALLTYPE *validateNode)(
        IXMLDOMDocument3 *This,
        IXMLDOMNode *node,
        IXMLDOMParseError **error);

    HRESULT (STDMETHODCALLTYPE *importNode)(
        IXMLDOMDocument3 *This,
        IXMLDOMNode *node,
        VARIANT_BOOL deep,
        IXMLDOMNode **clone);

    END_INTERFACE
} IXMLDOMDocument3Vtbl;

interface IXMLDOMDocument3 {
    CONST_VTBL IXMLDOMDocument3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMDocument3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMDocument3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMDocument3_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMDocument3_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMDocument3_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMDocument3_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMDocument3_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMDocument3_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMDocument3_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMDocument3_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMDocument3_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMDocument3_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMDocument3_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMDocument3_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMDocument3_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMDocument3_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMDocument3_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMDocument3_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMDocument3_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMDocument3_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMDocument3_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMDocument3_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMDocument3_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMDocument3_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMDocument3_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMDocument3_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMDocument3_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMDocument3_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMDocument3_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMDocument3_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMDocument3_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMDocument3_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMDocument3_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMDocument3_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMDocument3_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMDocument3_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMDocument3_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMDocument3_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMDocument3_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMDocument3_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMDocument3_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMDocument3_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMDocument3_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
/*** IXMLDOMDocument methods ***/
#define IXMLDOMDocument3_get_doctype(This,docType) (This)->lpVtbl->get_doctype(This,docType)
#define IXMLDOMDocument3_get_implementation(This,impl) (This)->lpVtbl->get_implementation(This,impl)
#define IXMLDOMDocument3_get_documentElement(This,domElement) (This)->lpVtbl->get_documentElement(This,domElement)
#define IXMLDOMDocument3_putref_documentElement(This,domElement) (This)->lpVtbl->putref_documentElement(This,domElement)
#define IXMLDOMDocument3_createElement(This,p,domElement) (This)->lpVtbl->createElement(This,p,domElement)
#define IXMLDOMDocument3_createDocumentFragment(This,docFrag) (This)->lpVtbl->createDocumentFragment(This,docFrag)
#define IXMLDOMDocument3_createTextNode(This,p,text) (This)->lpVtbl->createTextNode(This,p,text)
#define IXMLDOMDocument3_createComment(This,p,comment) (This)->lpVtbl->createComment(This,p,comment)
#define IXMLDOMDocument3_createCDATASection(This,p,cdata) (This)->lpVtbl->createCDATASection(This,p,cdata)
#define IXMLDOMDocument3_createProcessingInstruction(This,target,data,pi) (This)->lpVtbl->createProcessingInstruction(This,target,data,pi)
#define IXMLDOMDocument3_createAttribute(This,p,attribute) (This)->lpVtbl->createAttribute(This,p,attribute)
#define IXMLDOMDocument3_createEntityReference(This,p,entityRef) (This)->lpVtbl->createEntityReference(This,p,entityRef)
#define IXMLDOMDocument3_getElementsByTagName(This,p,resultList) (This)->lpVtbl->getElementsByTagName(This,p,resultList)
#define IXMLDOMDocument3_createNode(This,var,name,uri,node) (This)->lpVtbl->createNode(This,var,name,uri,node)
#define IXMLDOMDocument3_nodeFromID(This,id,node) (This)->lpVtbl->nodeFromID(This,id,node)
#define IXMLDOMDocument3_load(This,var1,pbool) (This)->lpVtbl->load(This,var1,pbool)
#define IXMLDOMDocument3_get_readyState(This,value) (This)->lpVtbl->get_readyState(This,value)
#define IXMLDOMDocument3_get_parseError(This,err) (This)->lpVtbl->get_parseError(This,err)
#define IXMLDOMDocument3_get_url(This,p) (This)->lpVtbl->get_url(This,p)
#define IXMLDOMDocument3_get_async(This,pbool) (This)->lpVtbl->get_async(This,pbool)
#define IXMLDOMDocument3_put_async(This,pbool) (This)->lpVtbl->put_async(This,pbool)
#define IXMLDOMDocument3_abort(This) (This)->lpVtbl->abort(This)
#define IXMLDOMDocument3_loadXML(This,p,pbool) (This)->lpVtbl->loadXML(This,p,pbool)
#define IXMLDOMDocument3_save(This,var1) (This)->lpVtbl->save(This,var1)
#define IXMLDOMDocument3_get_validateOnParse(This,pbool) (This)->lpVtbl->get_validateOnParse(This,pbool)
#define IXMLDOMDocument3_put_validateOnParse(This,pbool) (This)->lpVtbl->put_validateOnParse(This,pbool)
#define IXMLDOMDocument3_get_resolveExternals(This,pbool) (This)->lpVtbl->get_resolveExternals(This,pbool)
#define IXMLDOMDocument3_put_resolveExternals(This,pbool) (This)->lpVtbl->put_resolveExternals(This,pbool)
#define IXMLDOMDocument3_get_preserveWhiteSpace(This,pbool) (This)->lpVtbl->get_preserveWhiteSpace(This,pbool)
#define IXMLDOMDocument3_put_preserveWhiteSpace(This,pbool) (This)->lpVtbl->put_preserveWhiteSpace(This,pbool)
#define IXMLDOMDocument3_put_onreadystatechange(This,var1) (This)->lpVtbl->put_onreadystatechange(This,var1)
#define IXMLDOMDocument3_put_ondataavailable(This,var1) (This)->lpVtbl->put_ondataavailable(This,var1)
#define IXMLDOMDocument3_put_ontransformnode(This,var1) (This)->lpVtbl->put_ontransformnode(This,var1)
/*** IXMLDOMDocument2 methods ***/
#define IXMLDOMDocument3_get_namespaces(This,schemaCollection) (This)->lpVtbl->get_namespaces(This,schemaCollection)
#define IXMLDOMDocument3_get_schemas(This,var1) (This)->lpVtbl->get_schemas(This,var1)
#define IXMLDOMDocument3_putref_schemas(This,var1) (This)->lpVtbl->putref_schemas(This,var1)
#define IXMLDOMDocument3_validate(This,err) (This)->lpVtbl->validate(This,err)
#define IXMLDOMDocument3_setProperty(This,p,var) (This)->lpVtbl->setProperty(This,p,var)
#define IXMLDOMDocument3_getProperty(This,p,var) (This)->lpVtbl->getProperty(This,p,var)
/*** IXMLDOMDocument3 methods ***/
#define IXMLDOMDocument3_validateNode(This,node,error) (This)->lpVtbl->validateNode(This,node,error)
#define IXMLDOMDocument3_importNode(This,node,deep,clone) (This)->lpVtbl->importNode(This,node,deep,clone)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument3_QueryInterface(IXMLDOMDocument3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMDocument3_AddRef(IXMLDOMDocument3* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMDocument3_Release(IXMLDOMDocument3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument3_GetTypeInfoCount(IXMLDOMDocument3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_GetTypeInfo(IXMLDOMDocument3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_GetIDsOfNames(IXMLDOMDocument3* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_Invoke(IXMLDOMDocument3* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_nodeName(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_nodeValue(IXMLDOMDocument3* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_put_nodeValue(IXMLDOMDocument3* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_nodeType(IXMLDOMDocument3* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_parentNode(IXMLDOMDocument3* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_childNodes(IXMLDOMDocument3* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_firstChild(IXMLDOMDocument3* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_lastChild(IXMLDOMDocument3* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_previousSibling(IXMLDOMDocument3* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_nextSibling(IXMLDOMDocument3* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_attributes(IXMLDOMDocument3* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_insertBefore(IXMLDOMDocument3* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_replaceChild(IXMLDOMDocument3* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_removeChild(IXMLDOMDocument3* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_appendChild(IXMLDOMDocument3* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_hasChildNodes(IXMLDOMDocument3* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_ownerDocument(IXMLDOMDocument3* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_cloneNode(IXMLDOMDocument3* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_nodeTypeString(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_text(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_put_text(IXMLDOMDocument3* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_specified(IXMLDOMDocument3* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_definition(IXMLDOMDocument3* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_nodeTypedValue(IXMLDOMDocument3* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_put_nodeTypedValue(IXMLDOMDocument3* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_dataType(IXMLDOMDocument3* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_put_dataType(IXMLDOMDocument3* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_xml(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_transformNode(IXMLDOMDocument3* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_selectNodes(IXMLDOMDocument3* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_selectSingleNode(IXMLDOMDocument3* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_parsed(IXMLDOMDocument3* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_namespaceURI(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_prefix(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_baseName(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_transformNodeToObject(IXMLDOMDocument3* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMDocument methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_doctype(IXMLDOMDocument3* This,IXMLDOMDocumentType **docType) {
    return This->lpVtbl->get_doctype(This,docType);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_implementation(IXMLDOMDocument3* This,IXMLDOMImplementation **impl) {
    return This->lpVtbl->get_implementation(This,impl);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_documentElement(IXMLDOMDocument3* This,IXMLDOMElement **domElement) {
    return This->lpVtbl->get_documentElement(This,domElement);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_putref_documentElement(IXMLDOMDocument3* This,IXMLDOMElement *domElement) {
    return This->lpVtbl->putref_documentElement(This,domElement);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_createElement(IXMLDOMDocument3* This,BSTR p,IXMLDOMElement **domElement) {
    return This->lpVtbl->createElement(This,p,domElement);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_createDocumentFragment(IXMLDOMDocument3* This,IXMLDOMDocumentFragment **docFrag) {
    return This->lpVtbl->createDocumentFragment(This,docFrag);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_createTextNode(IXMLDOMDocument3* This,BSTR p,IXMLDOMText **text) {
    return This->lpVtbl->createTextNode(This,p,text);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_createComment(IXMLDOMDocument3* This,BSTR p,IXMLDOMComment **comment) {
    return This->lpVtbl->createComment(This,p,comment);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_createCDATASection(IXMLDOMDocument3* This,BSTR p,IXMLDOMCDATASection **cdata) {
    return This->lpVtbl->createCDATASection(This,p,cdata);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_createProcessingInstruction(IXMLDOMDocument3* This,BSTR target,BSTR data,IXMLDOMProcessingInstruction **pi) {
    return This->lpVtbl->createProcessingInstruction(This,target,data,pi);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_createAttribute(IXMLDOMDocument3* This,BSTR p,IXMLDOMAttribute **attribute) {
    return This->lpVtbl->createAttribute(This,p,attribute);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_createEntityReference(IXMLDOMDocument3* This,BSTR p,IXMLDOMEntityReference **entityRef) {
    return This->lpVtbl->createEntityReference(This,p,entityRef);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_getElementsByTagName(IXMLDOMDocument3* This,BSTR p,IXMLDOMNodeList **resultList) {
    return This->lpVtbl->getElementsByTagName(This,p,resultList);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_createNode(IXMLDOMDocument3* This,VARIANT var,BSTR name,BSTR uri,IXMLDOMNode **node) {
    return This->lpVtbl->createNode(This,var,name,uri,node);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_nodeFromID(IXMLDOMDocument3* This,BSTR id,IXMLDOMNode **node) {
    return This->lpVtbl->nodeFromID(This,id,node);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_load(IXMLDOMDocument3* This,VARIANT var1,VARIANT_BOOL *pbool) {
    return This->lpVtbl->load(This,var1,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_readyState(IXMLDOMDocument3* This,LONG *value) {
    return This->lpVtbl->get_readyState(This,value);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_parseError(IXMLDOMDocument3* This,IXMLDOMParseError **err) {
    return This->lpVtbl->get_parseError(This,err);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_url(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_async(IXMLDOMDocument3* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_async(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_put_async(IXMLDOMDocument3* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_async(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_abort(IXMLDOMDocument3* This) {
    return This->lpVtbl->abort(This);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_loadXML(IXMLDOMDocument3* This,BSTR p,VARIANT_BOOL *pbool) {
    return This->lpVtbl->loadXML(This,p,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_save(IXMLDOMDocument3* This,VARIANT var1) {
    return This->lpVtbl->save(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_validateOnParse(IXMLDOMDocument3* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_validateOnParse(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_put_validateOnParse(IXMLDOMDocument3* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_validateOnParse(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_resolveExternals(IXMLDOMDocument3* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_resolveExternals(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_put_resolveExternals(IXMLDOMDocument3* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_resolveExternals(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_preserveWhiteSpace(IXMLDOMDocument3* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_preserveWhiteSpace(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_put_preserveWhiteSpace(IXMLDOMDocument3* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_preserveWhiteSpace(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_put_onreadystatechange(IXMLDOMDocument3* This,VARIANT var1) {
    return This->lpVtbl->put_onreadystatechange(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_put_ondataavailable(IXMLDOMDocument3* This,VARIANT var1) {
    return This->lpVtbl->put_ondataavailable(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_put_ontransformnode(IXMLDOMDocument3* This,VARIANT var1) {
    return This->lpVtbl->put_ontransformnode(This,var1);
}
/*** IXMLDOMDocument2 methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_namespaces(IXMLDOMDocument3* This,IXMLDOMSchemaCollection **schemaCollection) {
    return This->lpVtbl->get_namespaces(This,schemaCollection);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_get_schemas(IXMLDOMDocument3* This,VARIANT *var1) {
    return This->lpVtbl->get_schemas(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_putref_schemas(IXMLDOMDocument3* This,VARIANT var1) {
    return This->lpVtbl->putref_schemas(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_validate(IXMLDOMDocument3* This,IXMLDOMParseError **err) {
    return This->lpVtbl->validate(This,err);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_setProperty(IXMLDOMDocument3* This,BSTR p,VARIANT var) {
    return This->lpVtbl->setProperty(This,p,var);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_getProperty(IXMLDOMDocument3* This,BSTR p,VARIANT *var) {
    return This->lpVtbl->getProperty(This,p,var);
}
/*** IXMLDOMDocument3 methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocument3_validateNode(IXMLDOMDocument3* This,IXMLDOMNode *node,IXMLDOMParseError **error) {
    return This->lpVtbl->validateNode(This,node,error);
}
static __WIDL_INLINE HRESULT IXMLDOMDocument3_importNode(IXMLDOMDocument3* This,IXMLDOMNode *node,VARIANT_BOOL deep,IXMLDOMNode **clone) {
    return This->lpVtbl->importNode(This,node,deep,clone);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMDocument3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMNodeList interface
 */
#ifndef __IXMLDOMNodeList_INTERFACE_DEFINED__
#define __IXMLDOMNodeList_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMNodeList, 0x2933bf82, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf82-7b36-11d2-b20e-00c04f983e60")
IXMLDOMNodeList : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_item(
        LONG lIndex,
        IXMLDOMNode **outNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *lLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE nextNode(
        IXMLDOMNode **outNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **ppUnk) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMNodeList, 0x2933bf82, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMNodeListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMNodeList *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMNodeList *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMNodeList *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMNodeList *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMNodeList *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMNodeList *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMNodeList *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNodeList methods ***/
    HRESULT (STDMETHODCALLTYPE *get_item)(
        IXMLDOMNodeList *This,
        LONG lIndex,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IXMLDOMNodeList *This,
        LONG *lLength);

    HRESULT (STDMETHODCALLTYPE *nextNode)(
        IXMLDOMNodeList *This,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *reset)(
        IXMLDOMNodeList *This);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IXMLDOMNodeList *This,
        IUnknown **ppUnk);

    END_INTERFACE
} IXMLDOMNodeListVtbl;

interface IXMLDOMNodeList {
    CONST_VTBL IXMLDOMNodeListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMNodeList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMNodeList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMNodeList_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMNodeList_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMNodeList_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMNodeList_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMNodeList_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNodeList methods ***/
#define IXMLDOMNodeList_get_item(This,lIndex,outNode) (This)->lpVtbl->get_item(This,lIndex,outNode)
#define IXMLDOMNodeList_get_length(This,lLength) (This)->lpVtbl->get_length(This,lLength)
#define IXMLDOMNodeList_nextNode(This,outNode) (This)->lpVtbl->nextNode(This,outNode)
#define IXMLDOMNodeList_reset(This) (This)->lpVtbl->reset(This)
#define IXMLDOMNodeList_get__newEnum(This,ppUnk) (This)->lpVtbl->get__newEnum(This,ppUnk)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMNodeList_QueryInterface(IXMLDOMNodeList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMNodeList_AddRef(IXMLDOMNodeList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMNodeList_Release(IXMLDOMNodeList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMNodeList_GetTypeInfoCount(IXMLDOMNodeList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMNodeList_GetTypeInfo(IXMLDOMNodeList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMNodeList_GetIDsOfNames(IXMLDOMNodeList* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMNodeList_Invoke(IXMLDOMNodeList* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNodeList methods ***/
static __WIDL_INLINE HRESULT IXMLDOMNodeList_get_item(IXMLDOMNodeList* This,LONG lIndex,IXMLDOMNode **outNode) {
    return This->lpVtbl->get_item(This,lIndex,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNodeList_get_length(IXMLDOMNodeList* This,LONG *lLength) {
    return This->lpVtbl->get_length(This,lLength);
}
static __WIDL_INLINE HRESULT IXMLDOMNodeList_nextNode(IXMLDOMNodeList* This,IXMLDOMNode **outNode) {
    return This->lpVtbl->nextNode(This,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNodeList_reset(IXMLDOMNodeList* This) {
    return This->lpVtbl->reset(This);
}
static __WIDL_INLINE HRESULT IXMLDOMNodeList_get__newEnum(IXMLDOMNodeList* This,IUnknown **ppUnk) {
    return This->lpVtbl->get__newEnum(This,ppUnk);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMNodeList_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMSelection interface
 */
#ifndef __IXMLDOMSelection_INTERFACE_DEFINED__
#define __IXMLDOMSelection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMSelection, 0xaa634fc7, 0x5888, 0x44a7, 0xa2,0x57, 0x3a,0x47,0x15,0x0d,0x3a,0x0e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("aa634fc7-5888-44a7-a257-3a47150d3a0e")
IXMLDOMSelection : public IXMLDOMNodeList
{
    virtual HRESULT STDMETHODCALLTYPE get_expr(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_expr(
        BSTR p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_context(
        IXMLDOMNode **ppNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_context(
        IXMLDOMNode *pNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE peekNode(
        IXMLDOMNode **ppNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE matches(
        IXMLDOMNode *pNode,
        IXMLDOMNode **ppNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeNext(
        IXMLDOMNode **ppNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAll(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE clone(
        IXMLDOMSelection **ppNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE getProperty(
        BSTR p,
        VARIANT *var) = 0;

    virtual HRESULT STDMETHODCALLTYPE setProperty(
        BSTR p,
        VARIANT var) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMSelection, 0xaa634fc7, 0x5888, 0x44a7, 0xa2,0x57, 0x3a,0x47,0x15,0x0d,0x3a,0x0e)
#endif
#else
typedef struct IXMLDOMSelectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMSelection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMSelection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMSelection *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMSelection *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMSelection *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMSelection *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMSelection *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNodeList methods ***/
    HRESULT (STDMETHODCALLTYPE *get_item)(
        IXMLDOMSelection *This,
        LONG lIndex,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IXMLDOMSelection *This,
        LONG *lLength);

    HRESULT (STDMETHODCALLTYPE *nextNode)(
        IXMLDOMSelection *This,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *reset)(
        IXMLDOMSelection *This);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IXMLDOMSelection *This,
        IUnknown **ppUnk);

    /*** IXMLDOMSelection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_expr)(
        IXMLDOMSelection *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_expr)(
        IXMLDOMSelection *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_context)(
        IXMLDOMSelection *This,
        IXMLDOMNode **ppNode);

    HRESULT (STDMETHODCALLTYPE *putref_context)(
        IXMLDOMSelection *This,
        IXMLDOMNode *pNode);

    HRESULT (STDMETHODCALLTYPE *peekNode)(
        IXMLDOMSelection *This,
        IXMLDOMNode **ppNode);

    HRESULT (STDMETHODCALLTYPE *matches)(
        IXMLDOMSelection *This,
        IXMLDOMNode *pNode,
        IXMLDOMNode **ppNode);

    HRESULT (STDMETHODCALLTYPE *removeNext)(
        IXMLDOMSelection *This,
        IXMLDOMNode **ppNode);

    HRESULT (STDMETHODCALLTYPE *removeAll)(
        IXMLDOMSelection *This);

    HRESULT (STDMETHODCALLTYPE *clone)(
        IXMLDOMSelection *This,
        IXMLDOMSelection **ppNode);

    HRESULT (STDMETHODCALLTYPE *getProperty)(
        IXMLDOMSelection *This,
        BSTR p,
        VARIANT *var);

    HRESULT (STDMETHODCALLTYPE *setProperty)(
        IXMLDOMSelection *This,
        BSTR p,
        VARIANT var);

    END_INTERFACE
} IXMLDOMSelectionVtbl;

interface IXMLDOMSelection {
    CONST_VTBL IXMLDOMSelectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMSelection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMSelection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMSelection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMSelection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMSelection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMSelection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMSelection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNodeList methods ***/
#define IXMLDOMSelection_get_item(This,lIndex,outNode) (This)->lpVtbl->get_item(This,lIndex,outNode)
#define IXMLDOMSelection_get_length(This,lLength) (This)->lpVtbl->get_length(This,lLength)
#define IXMLDOMSelection_nextNode(This,outNode) (This)->lpVtbl->nextNode(This,outNode)
#define IXMLDOMSelection_reset(This) (This)->lpVtbl->reset(This)
#define IXMLDOMSelection_get__newEnum(This,ppUnk) (This)->lpVtbl->get__newEnum(This,ppUnk)
/*** IXMLDOMSelection methods ***/
#define IXMLDOMSelection_get_expr(This,p) (This)->lpVtbl->get_expr(This,p)
#define IXMLDOMSelection_put_expr(This,p) (This)->lpVtbl->put_expr(This,p)
#define IXMLDOMSelection_get_context(This,ppNode) (This)->lpVtbl->get_context(This,ppNode)
#define IXMLDOMSelection_putref_context(This,pNode) (This)->lpVtbl->putref_context(This,pNode)
#define IXMLDOMSelection_peekNode(This,ppNode) (This)->lpVtbl->peekNode(This,ppNode)
#define IXMLDOMSelection_matches(This,pNode,ppNode) (This)->lpVtbl->matches(This,pNode,ppNode)
#define IXMLDOMSelection_removeNext(This,ppNode) (This)->lpVtbl->removeNext(This,ppNode)
#define IXMLDOMSelection_removeAll(This) (This)->lpVtbl->removeAll(This)
#define IXMLDOMSelection_clone(This,ppNode) (This)->lpVtbl->clone(This,ppNode)
#define IXMLDOMSelection_getProperty(This,p,var) (This)->lpVtbl->getProperty(This,p,var)
#define IXMLDOMSelection_setProperty(This,p,var) (This)->lpVtbl->setProperty(This,p,var)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMSelection_QueryInterface(IXMLDOMSelection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMSelection_AddRef(IXMLDOMSelection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMSelection_Release(IXMLDOMSelection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMSelection_GetTypeInfoCount(IXMLDOMSelection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_GetTypeInfo(IXMLDOMSelection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_GetIDsOfNames(IXMLDOMSelection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_Invoke(IXMLDOMSelection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNodeList methods ***/
static __WIDL_INLINE HRESULT IXMLDOMSelection_get_item(IXMLDOMSelection* This,LONG lIndex,IXMLDOMNode **outNode) {
    return This->lpVtbl->get_item(This,lIndex,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_get_length(IXMLDOMSelection* This,LONG *lLength) {
    return This->lpVtbl->get_length(This,lLength);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_nextNode(IXMLDOMSelection* This,IXMLDOMNode **outNode) {
    return This->lpVtbl->nextNode(This,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_reset(IXMLDOMSelection* This) {
    return This->lpVtbl->reset(This);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_get__newEnum(IXMLDOMSelection* This,IUnknown **ppUnk) {
    return This->lpVtbl->get__newEnum(This,ppUnk);
}
/*** IXMLDOMSelection methods ***/
static __WIDL_INLINE HRESULT IXMLDOMSelection_get_expr(IXMLDOMSelection* This,BSTR *p) {
    return This->lpVtbl->get_expr(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_put_expr(IXMLDOMSelection* This,BSTR p) {
    return This->lpVtbl->put_expr(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_get_context(IXMLDOMSelection* This,IXMLDOMNode **ppNode) {
    return This->lpVtbl->get_context(This,ppNode);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_putref_context(IXMLDOMSelection* This,IXMLDOMNode *pNode) {
    return This->lpVtbl->putref_context(This,pNode);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_peekNode(IXMLDOMSelection* This,IXMLDOMNode **ppNode) {
    return This->lpVtbl->peekNode(This,ppNode);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_matches(IXMLDOMSelection* This,IXMLDOMNode *pNode,IXMLDOMNode **ppNode) {
    return This->lpVtbl->matches(This,pNode,ppNode);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_removeNext(IXMLDOMSelection* This,IXMLDOMNode **ppNode) {
    return This->lpVtbl->removeNext(This,ppNode);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_removeAll(IXMLDOMSelection* This) {
    return This->lpVtbl->removeAll(This);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_clone(IXMLDOMSelection* This,IXMLDOMSelection **ppNode) {
    return This->lpVtbl->clone(This,ppNode);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_getProperty(IXMLDOMSelection* This,BSTR p,VARIANT *var) {
    return This->lpVtbl->getProperty(This,p,var);
}
static __WIDL_INLINE HRESULT IXMLDOMSelection_setProperty(IXMLDOMSelection* This,BSTR p,VARIANT var) {
    return This->lpVtbl->setProperty(This,p,var);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMSelection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMNamedNodeMap interface
 */
#ifndef __IXMLDOMNamedNodeMap_INTERFACE_DEFINED__
#define __IXMLDOMNamedNodeMap_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMNamedNodeMap, 0x2933bf83, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf83-7b36-11d2-b20e-00c04f983e60")
IXMLDOMNamedNodeMap : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE getNamedItem(
        BSTR p,
        IXMLDOMNode **outNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE setNamedItem(
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeNamedItem(
        BSTR p,
        IXMLDOMNode **outNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_item(
        LONG lIndex,
        IXMLDOMNode **outNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *lLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE getQualifiedItem(
        BSTR name,
        BSTR uri,
        IXMLDOMNode **outNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeQualifiedItem(
        BSTR name,
        BSTR uri,
        IXMLDOMNode **outNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE nextNode(
        IXMLDOMNode **outNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **ppUnk) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMNamedNodeMap, 0x2933bf83, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMNamedNodeMapVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMNamedNodeMap *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMNamedNodeMap *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMNamedNodeMap *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMNamedNodeMap *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMNamedNodeMap *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMNamedNodeMap *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMNamedNodeMap *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNamedNodeMap methods ***/
    HRESULT (STDMETHODCALLTYPE *getNamedItem)(
        IXMLDOMNamedNodeMap *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *setNamedItem)(
        IXMLDOMNamedNodeMap *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *removeNamedItem)(
        IXMLDOMNamedNodeMap *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_item)(
        IXMLDOMNamedNodeMap *This,
        LONG lIndex,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IXMLDOMNamedNodeMap *This,
        LONG *lLength);

    HRESULT (STDMETHODCALLTYPE *getQualifiedItem)(
        IXMLDOMNamedNodeMap *This,
        BSTR name,
        BSTR uri,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *removeQualifiedItem)(
        IXMLDOMNamedNodeMap *This,
        BSTR name,
        BSTR uri,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *nextNode)(
        IXMLDOMNamedNodeMap *This,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *reset)(
        IXMLDOMNamedNodeMap *This);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IXMLDOMNamedNodeMap *This,
        IUnknown **ppUnk);

    END_INTERFACE
} IXMLDOMNamedNodeMapVtbl;

interface IXMLDOMNamedNodeMap {
    CONST_VTBL IXMLDOMNamedNodeMapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMNamedNodeMap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMNamedNodeMap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMNamedNodeMap_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMNamedNodeMap_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMNamedNodeMap_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMNamedNodeMap_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMNamedNodeMap_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNamedNodeMap methods ***/
#define IXMLDOMNamedNodeMap_getNamedItem(This,p,outNode) (This)->lpVtbl->getNamedItem(This,p,outNode)
#define IXMLDOMNamedNodeMap_setNamedItem(This,newNode,outNode) (This)->lpVtbl->setNamedItem(This,newNode,outNode)
#define IXMLDOMNamedNodeMap_removeNamedItem(This,p,outNode) (This)->lpVtbl->removeNamedItem(This,p,outNode)
#define IXMLDOMNamedNodeMap_get_item(This,lIndex,outNode) (This)->lpVtbl->get_item(This,lIndex,outNode)
#define IXMLDOMNamedNodeMap_get_length(This,lLength) (This)->lpVtbl->get_length(This,lLength)
#define IXMLDOMNamedNodeMap_getQualifiedItem(This,name,uri,outNode) (This)->lpVtbl->getQualifiedItem(This,name,uri,outNode)
#define IXMLDOMNamedNodeMap_removeQualifiedItem(This,name,uri,outNode) (This)->lpVtbl->removeQualifiedItem(This,name,uri,outNode)
#define IXMLDOMNamedNodeMap_nextNode(This,outNode) (This)->lpVtbl->nextNode(This,outNode)
#define IXMLDOMNamedNodeMap_reset(This) (This)->lpVtbl->reset(This)
#define IXMLDOMNamedNodeMap_get__newEnum(This,ppUnk) (This)->lpVtbl->get__newEnum(This,ppUnk)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_QueryInterface(IXMLDOMNamedNodeMap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMNamedNodeMap_AddRef(IXMLDOMNamedNodeMap* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMNamedNodeMap_Release(IXMLDOMNamedNodeMap* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_GetTypeInfoCount(IXMLDOMNamedNodeMap* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_GetTypeInfo(IXMLDOMNamedNodeMap* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_GetIDsOfNames(IXMLDOMNamedNodeMap* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_Invoke(IXMLDOMNamedNodeMap* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNamedNodeMap methods ***/
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_getNamedItem(IXMLDOMNamedNodeMap* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->getNamedItem(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_setNamedItem(IXMLDOMNamedNodeMap* This,IXMLDOMNode *newNode,IXMLDOMNode **outNode) {
    return This->lpVtbl->setNamedItem(This,newNode,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_removeNamedItem(IXMLDOMNamedNodeMap* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->removeNamedItem(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_get_item(IXMLDOMNamedNodeMap* This,LONG lIndex,IXMLDOMNode **outNode) {
    return This->lpVtbl->get_item(This,lIndex,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_get_length(IXMLDOMNamedNodeMap* This,LONG *lLength) {
    return This->lpVtbl->get_length(This,lLength);
}
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_getQualifiedItem(IXMLDOMNamedNodeMap* This,BSTR name,BSTR uri,IXMLDOMNode **outNode) {
    return This->lpVtbl->getQualifiedItem(This,name,uri,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_removeQualifiedItem(IXMLDOMNamedNodeMap* This,BSTR name,BSTR uri,IXMLDOMNode **outNode) {
    return This->lpVtbl->removeQualifiedItem(This,name,uri,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_nextNode(IXMLDOMNamedNodeMap* This,IXMLDOMNode **outNode) {
    return This->lpVtbl->nextNode(This,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_reset(IXMLDOMNamedNodeMap* This) {
    return This->lpVtbl->reset(This);
}
static __WIDL_INLINE HRESULT IXMLDOMNamedNodeMap_get__newEnum(IXMLDOMNamedNodeMap* This,IUnknown **ppUnk) {
    return This->lpVtbl->get__newEnum(This,ppUnk);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMNamedNodeMap_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMDocumentFragment interface
 */
#ifndef __IXMLDOMDocumentFragment_INTERFACE_DEFINED__
#define __IXMLDOMDocumentFragment_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMDocumentFragment, 0x3efaa413, 0x272f, 0x11d2, 0x83,0x6f, 0x00,0x00,0xf8,0x7a,0x77,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3efaa413-272f-11d2-836f-0000f87a7782")
IXMLDOMDocumentFragment : public IXMLDOMNode
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMDocumentFragment, 0x3efaa413, 0x272f, 0x11d2, 0x83,0x6f, 0x00,0x00,0xf8,0x7a,0x77,0x82)
#endif
#else
typedef struct IXMLDOMDocumentFragmentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMDocumentFragment *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMDocumentFragment *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMDocumentFragment *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMDocumentFragment *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMDocumentFragment *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMDocumentFragment *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMDocumentFragment *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMDocumentFragment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMDocumentFragment *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMDocumentFragment *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMDocumentFragment *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMDocumentFragment *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMDocumentFragment *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMDocumentFragment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMDocumentFragment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMDocumentFragment *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMDocumentFragment *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMDocumentFragment *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMDocumentFragment *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMDocumentFragment *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMDocumentFragment *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMDocumentFragment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMDocumentFragment *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMDocumentFragment *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMDocumentFragment *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMDocumentFragment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMDocumentFragment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMDocumentFragment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMDocumentFragment *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    END_INTERFACE
} IXMLDOMDocumentFragmentVtbl;

interface IXMLDOMDocumentFragment {
    CONST_VTBL IXMLDOMDocumentFragmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMDocumentFragment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMDocumentFragment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMDocumentFragment_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMDocumentFragment_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMDocumentFragment_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMDocumentFragment_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMDocumentFragment_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMDocumentFragment_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMDocumentFragment_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMDocumentFragment_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMDocumentFragment_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMDocumentFragment_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMDocumentFragment_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMDocumentFragment_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMDocumentFragment_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMDocumentFragment_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMDocumentFragment_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMDocumentFragment_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMDocumentFragment_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMDocumentFragment_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMDocumentFragment_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMDocumentFragment_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMDocumentFragment_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMDocumentFragment_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMDocumentFragment_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMDocumentFragment_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMDocumentFragment_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMDocumentFragment_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMDocumentFragment_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMDocumentFragment_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMDocumentFragment_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMDocumentFragment_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMDocumentFragment_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMDocumentFragment_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMDocumentFragment_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMDocumentFragment_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMDocumentFragment_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMDocumentFragment_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMDocumentFragment_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMDocumentFragment_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMDocumentFragment_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMDocumentFragment_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMDocumentFragment_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_QueryInterface(IXMLDOMDocumentFragment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMDocumentFragment_AddRef(IXMLDOMDocumentFragment* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMDocumentFragment_Release(IXMLDOMDocumentFragment* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_GetTypeInfoCount(IXMLDOMDocumentFragment* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_GetTypeInfo(IXMLDOMDocumentFragment* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_GetIDsOfNames(IXMLDOMDocumentFragment* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_Invoke(IXMLDOMDocumentFragment* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_nodeName(IXMLDOMDocumentFragment* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_nodeValue(IXMLDOMDocumentFragment* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_put_nodeValue(IXMLDOMDocumentFragment* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_nodeType(IXMLDOMDocumentFragment* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_parentNode(IXMLDOMDocumentFragment* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_childNodes(IXMLDOMDocumentFragment* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_firstChild(IXMLDOMDocumentFragment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_lastChild(IXMLDOMDocumentFragment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_previousSibling(IXMLDOMDocumentFragment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_nextSibling(IXMLDOMDocumentFragment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_attributes(IXMLDOMDocumentFragment* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_insertBefore(IXMLDOMDocumentFragment* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_replaceChild(IXMLDOMDocumentFragment* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_removeChild(IXMLDOMDocumentFragment* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_appendChild(IXMLDOMDocumentFragment* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_hasChildNodes(IXMLDOMDocumentFragment* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_ownerDocument(IXMLDOMDocumentFragment* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_cloneNode(IXMLDOMDocumentFragment* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_nodeTypeString(IXMLDOMDocumentFragment* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_text(IXMLDOMDocumentFragment* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_put_text(IXMLDOMDocumentFragment* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_specified(IXMLDOMDocumentFragment* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_definition(IXMLDOMDocumentFragment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_nodeTypedValue(IXMLDOMDocumentFragment* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_put_nodeTypedValue(IXMLDOMDocumentFragment* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_dataType(IXMLDOMDocumentFragment* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_put_dataType(IXMLDOMDocumentFragment* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_xml(IXMLDOMDocumentFragment* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_transformNode(IXMLDOMDocumentFragment* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_selectNodes(IXMLDOMDocumentFragment* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_selectSingleNode(IXMLDOMDocumentFragment* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_parsed(IXMLDOMDocumentFragment* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_namespaceURI(IXMLDOMDocumentFragment* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_prefix(IXMLDOMDocumentFragment* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_get_baseName(IXMLDOMDocumentFragment* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentFragment_transformNodeToObject(IXMLDOMDocumentFragment* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMDocumentFragment_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMCharacterData interface
 */
#ifndef __IXMLDOMCharacterData_INTERFACE_DEFINED__
#define __IXMLDOMCharacterData_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMCharacterData, 0x2933bf84, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf84-7b36-11d2-b20e-00c04f983e60")
IXMLDOMCharacterData : public IXMLDOMNode
{
    virtual HRESULT STDMETHODCALLTYPE get_data(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_data(
        BSTR data) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *len) = 0;

    virtual HRESULT STDMETHODCALLTYPE substringData(
        LONG offset,
        LONG count,
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE appendData(
        BSTR p) = 0;

    virtual HRESULT STDMETHODCALLTYPE insertData(
        LONG offset,
        BSTR p) = 0;

    virtual HRESULT STDMETHODCALLTYPE deleteData(
        LONG offset,
        LONG count) = 0;

    virtual HRESULT STDMETHODCALLTYPE replaceData(
        LONG offset,
        LONG count,
        BSTR p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMCharacterData, 0x2933bf84, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMCharacterDataVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMCharacterData *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMCharacterData *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMCharacterData *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMCharacterData *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMCharacterData *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMCharacterData *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMCharacterData *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMCharacterData *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMCharacterData *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMCharacterData *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMCharacterData *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMCharacterData *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMCharacterData *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMCharacterData *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMCharacterData *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMCharacterData *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMCharacterData *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMCharacterData *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMCharacterData *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMCharacterData *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMCharacterData *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMCharacterData *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMCharacterData *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMCharacterData *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMCharacterData *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMCharacterData *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMCharacterData *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMCharacterData *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMCharacterData *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMCharacterData *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMCharacterData *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMCharacterData *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMCharacterData *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMCharacterData *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMCharacterData *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMCharacterData *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMCharacterData *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMCharacterData *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMCharacterData *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMCharacterData *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMCharacterData *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMCharacterData *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMCharacterData *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    /*** IXMLDOMCharacterData methods ***/
    HRESULT (STDMETHODCALLTYPE *get_data)(
        IXMLDOMCharacterData *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_data)(
        IXMLDOMCharacterData *This,
        BSTR data);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IXMLDOMCharacterData *This,
        LONG *len);

    HRESULT (STDMETHODCALLTYPE *substringData)(
        IXMLDOMCharacterData *This,
        LONG offset,
        LONG count,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *appendData)(
        IXMLDOMCharacterData *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *insertData)(
        IXMLDOMCharacterData *This,
        LONG offset,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *deleteData)(
        IXMLDOMCharacterData *This,
        LONG offset,
        LONG count);

    HRESULT (STDMETHODCALLTYPE *replaceData)(
        IXMLDOMCharacterData *This,
        LONG offset,
        LONG count,
        BSTR p);

    END_INTERFACE
} IXMLDOMCharacterDataVtbl;

interface IXMLDOMCharacterData {
    CONST_VTBL IXMLDOMCharacterDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMCharacterData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMCharacterData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMCharacterData_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMCharacterData_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMCharacterData_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMCharacterData_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMCharacterData_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMCharacterData_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMCharacterData_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMCharacterData_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMCharacterData_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMCharacterData_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMCharacterData_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMCharacterData_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMCharacterData_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMCharacterData_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMCharacterData_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMCharacterData_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMCharacterData_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMCharacterData_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMCharacterData_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMCharacterData_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMCharacterData_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMCharacterData_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMCharacterData_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMCharacterData_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMCharacterData_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMCharacterData_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMCharacterData_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMCharacterData_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMCharacterData_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMCharacterData_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMCharacterData_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMCharacterData_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMCharacterData_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMCharacterData_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMCharacterData_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMCharacterData_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMCharacterData_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMCharacterData_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMCharacterData_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMCharacterData_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMCharacterData_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
/*** IXMLDOMCharacterData methods ***/
#define IXMLDOMCharacterData_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#define IXMLDOMCharacterData_put_data(This,data) (This)->lpVtbl->put_data(This,data)
#define IXMLDOMCharacterData_get_length(This,len) (This)->lpVtbl->get_length(This,len)
#define IXMLDOMCharacterData_substringData(This,offset,count,p) (This)->lpVtbl->substringData(This,offset,count,p)
#define IXMLDOMCharacterData_appendData(This,p) (This)->lpVtbl->appendData(This,p)
#define IXMLDOMCharacterData_insertData(This,offset,p) (This)->lpVtbl->insertData(This,offset,p)
#define IXMLDOMCharacterData_deleteData(This,offset,count) (This)->lpVtbl->deleteData(This,offset,count)
#define IXMLDOMCharacterData_replaceData(This,offset,count,p) (This)->lpVtbl->replaceData(This,offset,count,p)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_QueryInterface(IXMLDOMCharacterData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMCharacterData_AddRef(IXMLDOMCharacterData* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMCharacterData_Release(IXMLDOMCharacterData* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_GetTypeInfoCount(IXMLDOMCharacterData* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_GetTypeInfo(IXMLDOMCharacterData* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_GetIDsOfNames(IXMLDOMCharacterData* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_Invoke(IXMLDOMCharacterData* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_nodeName(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_nodeValue(IXMLDOMCharacterData* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_put_nodeValue(IXMLDOMCharacterData* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_nodeType(IXMLDOMCharacterData* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_parentNode(IXMLDOMCharacterData* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_childNodes(IXMLDOMCharacterData* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_firstChild(IXMLDOMCharacterData* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_lastChild(IXMLDOMCharacterData* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_previousSibling(IXMLDOMCharacterData* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_nextSibling(IXMLDOMCharacterData* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_attributes(IXMLDOMCharacterData* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_insertBefore(IXMLDOMCharacterData* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_replaceChild(IXMLDOMCharacterData* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_removeChild(IXMLDOMCharacterData* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_appendChild(IXMLDOMCharacterData* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_hasChildNodes(IXMLDOMCharacterData* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_ownerDocument(IXMLDOMCharacterData* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_cloneNode(IXMLDOMCharacterData* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_nodeTypeString(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_text(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_put_text(IXMLDOMCharacterData* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_specified(IXMLDOMCharacterData* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_definition(IXMLDOMCharacterData* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_nodeTypedValue(IXMLDOMCharacterData* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_put_nodeTypedValue(IXMLDOMCharacterData* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_dataType(IXMLDOMCharacterData* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_put_dataType(IXMLDOMCharacterData* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_xml(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_transformNode(IXMLDOMCharacterData* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_selectNodes(IXMLDOMCharacterData* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_selectSingleNode(IXMLDOMCharacterData* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_parsed(IXMLDOMCharacterData* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_namespaceURI(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_prefix(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_baseName(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_transformNodeToObject(IXMLDOMCharacterData* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMCharacterData methods ***/
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_data(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_put_data(IXMLDOMCharacterData* This,BSTR data) {
    return This->lpVtbl->put_data(This,data);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_get_length(IXMLDOMCharacterData* This,LONG *len) {
    return This->lpVtbl->get_length(This,len);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_substringData(IXMLDOMCharacterData* This,LONG offset,LONG count,BSTR *p) {
    return This->lpVtbl->substringData(This,offset,count,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_appendData(IXMLDOMCharacterData* This,BSTR p) {
    return This->lpVtbl->appendData(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_insertData(IXMLDOMCharacterData* This,LONG offset,BSTR p) {
    return This->lpVtbl->insertData(This,offset,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_deleteData(IXMLDOMCharacterData* This,LONG offset,LONG count) {
    return This->lpVtbl->deleteData(This,offset,count);
}
static __WIDL_INLINE HRESULT IXMLDOMCharacterData_replaceData(IXMLDOMCharacterData* This,LONG offset,LONG count,BSTR p) {
    return This->lpVtbl->replaceData(This,offset,count,p);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMCharacterData_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMAttribute interface
 */
#ifndef __IXMLDOMAttribute_INTERFACE_DEFINED__
#define __IXMLDOMAttribute_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMAttribute, 0x2933bf85, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf85-7b36-11d2-b20e-00c04f983e60")
IXMLDOMAttribute : public IXMLDOMNode
{
    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_value(
        VARIANT *var1) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_value(
        VARIANT var1) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMAttribute, 0x2933bf85, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMAttributeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMAttribute *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMAttribute *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMAttribute *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMAttribute *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMAttribute *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMAttribute *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMAttribute *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMAttribute *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMAttribute *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMAttribute *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMAttribute *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMAttribute *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMAttribute *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMAttribute *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMAttribute *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMAttribute *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMAttribute *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMAttribute *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMAttribute *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMAttribute *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMAttribute *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMAttribute *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMAttribute *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMAttribute *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMAttribute *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMAttribute *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMAttribute *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMAttribute *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMAttribute *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMAttribute *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMAttribute *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMAttribute *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMAttribute *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMAttribute *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMAttribute *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMAttribute *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMAttribute *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMAttribute *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMAttribute *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMAttribute *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMAttribute *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMAttribute *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMAttribute *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    /*** IXMLDOMAttribute methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        IXMLDOMAttribute *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_value)(
        IXMLDOMAttribute *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_value)(
        IXMLDOMAttribute *This,
        VARIANT var1);

    END_INTERFACE
} IXMLDOMAttributeVtbl;

interface IXMLDOMAttribute {
    CONST_VTBL IXMLDOMAttributeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMAttribute_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMAttribute_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMAttribute_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMAttribute_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMAttribute_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMAttribute_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMAttribute_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMAttribute_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMAttribute_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMAttribute_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMAttribute_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMAttribute_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMAttribute_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMAttribute_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMAttribute_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMAttribute_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMAttribute_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMAttribute_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMAttribute_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMAttribute_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMAttribute_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMAttribute_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMAttribute_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMAttribute_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMAttribute_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMAttribute_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMAttribute_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMAttribute_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMAttribute_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMAttribute_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMAttribute_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMAttribute_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMAttribute_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMAttribute_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMAttribute_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMAttribute_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMAttribute_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMAttribute_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMAttribute_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMAttribute_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMAttribute_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMAttribute_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMAttribute_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
/*** IXMLDOMAttribute methods ***/
#define IXMLDOMAttribute_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IXMLDOMAttribute_get_value(This,var1) (This)->lpVtbl->get_value(This,var1)
#define IXMLDOMAttribute_put_value(This,var1) (This)->lpVtbl->put_value(This,var1)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMAttribute_QueryInterface(IXMLDOMAttribute* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMAttribute_AddRef(IXMLDOMAttribute* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMAttribute_Release(IXMLDOMAttribute* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMAttribute_GetTypeInfoCount(IXMLDOMAttribute* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_GetTypeInfo(IXMLDOMAttribute* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_GetIDsOfNames(IXMLDOMAttribute* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_Invoke(IXMLDOMAttribute* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_nodeName(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_nodeValue(IXMLDOMAttribute* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_put_nodeValue(IXMLDOMAttribute* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_nodeType(IXMLDOMAttribute* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_parentNode(IXMLDOMAttribute* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_childNodes(IXMLDOMAttribute* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_firstChild(IXMLDOMAttribute* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_lastChild(IXMLDOMAttribute* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_previousSibling(IXMLDOMAttribute* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_nextSibling(IXMLDOMAttribute* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_attributes(IXMLDOMAttribute* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_insertBefore(IXMLDOMAttribute* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_replaceChild(IXMLDOMAttribute* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_removeChild(IXMLDOMAttribute* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_appendChild(IXMLDOMAttribute* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_hasChildNodes(IXMLDOMAttribute* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_ownerDocument(IXMLDOMAttribute* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_cloneNode(IXMLDOMAttribute* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_nodeTypeString(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_text(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_put_text(IXMLDOMAttribute* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_specified(IXMLDOMAttribute* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_definition(IXMLDOMAttribute* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_nodeTypedValue(IXMLDOMAttribute* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_put_nodeTypedValue(IXMLDOMAttribute* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_dataType(IXMLDOMAttribute* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_put_dataType(IXMLDOMAttribute* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_xml(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_transformNode(IXMLDOMAttribute* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_selectNodes(IXMLDOMAttribute* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_selectSingleNode(IXMLDOMAttribute* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_parsed(IXMLDOMAttribute* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_namespaceURI(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_prefix(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_baseName(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_transformNodeToObject(IXMLDOMAttribute* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMAttribute methods ***/
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_name(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_get_value(IXMLDOMAttribute* This,VARIANT *var1) {
    return This->lpVtbl->get_value(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMAttribute_put_value(IXMLDOMAttribute* This,VARIANT var1) {
    return This->lpVtbl->put_value(This,var1);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMAttribute_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMElement interface
 */
#ifndef __IXMLDOMElement_INTERFACE_DEFINED__
#define __IXMLDOMElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMElement, 0x2933bf86, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf86-7b36-11d2-b20e-00c04f983e60")
IXMLDOMElement : public IXMLDOMNode
{
    virtual HRESULT STDMETHODCALLTYPE get_tagName(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttribute(
        BSTR p,
        VARIANT *var) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttribute(
        BSTR p,
        VARIANT var) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAttribute(
        BSTR p) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAttributeNode(
        BSTR p,
        IXMLDOMAttribute **attributeNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttributeNode(
        IXMLDOMAttribute *domAttribute,
        IXMLDOMAttribute **attributeNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAttributeNode(
        IXMLDOMAttribute *domAttribute,
        IXMLDOMAttribute **attributeNode) = 0;

    virtual HRESULT STDMETHODCALLTYPE getElementsByTagName(
        BSTR p,
        IXMLDOMNodeList **resultList) = 0;

    virtual HRESULT STDMETHODCALLTYPE normalize(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMElement, 0x2933bf86, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMElement *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMElement *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMElement *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMElement *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMElement *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMElement *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMElement *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMElement *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMElement *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMElement *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMElement *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMElement *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMElement *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMElement *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMElement *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMElement *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMElement *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMElement *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMElement *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMElement *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMElement *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMElement *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMElement *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMElement *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMElement *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMElement *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMElement *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMElement *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMElement *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMElement *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMElement *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMElement *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMElement *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMElement *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMElement *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMElement *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMElement *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMElement *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMElement *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMElement *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMElement *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMElement *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMElement *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    /*** IXMLDOMElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_tagName)(
        IXMLDOMElement *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *getAttribute)(
        IXMLDOMElement *This,
        BSTR p,
        VARIANT *var);

    HRESULT (STDMETHODCALLTYPE *setAttribute)(
        IXMLDOMElement *This,
        BSTR p,
        VARIANT var);

    HRESULT (STDMETHODCALLTYPE *removeAttribute)(
        IXMLDOMElement *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *getAttributeNode)(
        IXMLDOMElement *This,
        BSTR p,
        IXMLDOMAttribute **attributeNode);

    HRESULT (STDMETHODCALLTYPE *setAttributeNode)(
        IXMLDOMElement *This,
        IXMLDOMAttribute *domAttribute,
        IXMLDOMAttribute **attributeNode);

    HRESULT (STDMETHODCALLTYPE *removeAttributeNode)(
        IXMLDOMElement *This,
        IXMLDOMAttribute *domAttribute,
        IXMLDOMAttribute **attributeNode);

    HRESULT (STDMETHODCALLTYPE *getElementsByTagName)(
        IXMLDOMElement *This,
        BSTR p,
        IXMLDOMNodeList **resultList);

    HRESULT (STDMETHODCALLTYPE *normalize)(
        IXMLDOMElement *This);

    END_INTERFACE
} IXMLDOMElementVtbl;

interface IXMLDOMElement {
    CONST_VTBL IXMLDOMElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMElement_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMElement_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMElement_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMElement_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMElement_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMElement_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMElement_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMElement_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMElement_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMElement_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMElement_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMElement_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMElement_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMElement_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMElement_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMElement_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMElement_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMElement_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMElement_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMElement_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMElement_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMElement_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMElement_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMElement_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMElement_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMElement_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMElement_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMElement_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMElement_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMElement_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMElement_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMElement_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMElement_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMElement_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMElement_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMElement_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
/*** IXMLDOMElement methods ***/
#define IXMLDOMElement_get_tagName(This,p) (This)->lpVtbl->get_tagName(This,p)
#define IXMLDOMElement_getAttribute(This,p,var) (This)->lpVtbl->getAttribute(This,p,var)
#define IXMLDOMElement_setAttribute(This,p,var) (This)->lpVtbl->setAttribute(This,p,var)
#define IXMLDOMElement_removeAttribute(This,p) (This)->lpVtbl->removeAttribute(This,p)
#define IXMLDOMElement_getAttributeNode(This,p,attributeNode) (This)->lpVtbl->getAttributeNode(This,p,attributeNode)
#define IXMLDOMElement_setAttributeNode(This,domAttribute,attributeNode) (This)->lpVtbl->setAttributeNode(This,domAttribute,attributeNode)
#define IXMLDOMElement_removeAttributeNode(This,domAttribute,attributeNode) (This)->lpVtbl->removeAttributeNode(This,domAttribute,attributeNode)
#define IXMLDOMElement_getElementsByTagName(This,p,resultList) (This)->lpVtbl->getElementsByTagName(This,p,resultList)
#define IXMLDOMElement_normalize(This) (This)->lpVtbl->normalize(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMElement_QueryInterface(IXMLDOMElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMElement_AddRef(IXMLDOMElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMElement_Release(IXMLDOMElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMElement_GetTypeInfoCount(IXMLDOMElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_GetTypeInfo(IXMLDOMElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_GetIDsOfNames(IXMLDOMElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_Invoke(IXMLDOMElement* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMElement_get_nodeName(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_nodeValue(IXMLDOMElement* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_put_nodeValue(IXMLDOMElement* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_nodeType(IXMLDOMElement* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_parentNode(IXMLDOMElement* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_childNodes(IXMLDOMElement* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_firstChild(IXMLDOMElement* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_lastChild(IXMLDOMElement* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_previousSibling(IXMLDOMElement* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_nextSibling(IXMLDOMElement* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_attributes(IXMLDOMElement* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_insertBefore(IXMLDOMElement* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_replaceChild(IXMLDOMElement* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_removeChild(IXMLDOMElement* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_appendChild(IXMLDOMElement* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_hasChildNodes(IXMLDOMElement* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_ownerDocument(IXMLDOMElement* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_cloneNode(IXMLDOMElement* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_nodeTypeString(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_text(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_put_text(IXMLDOMElement* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_specified(IXMLDOMElement* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_definition(IXMLDOMElement* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_nodeTypedValue(IXMLDOMElement* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_put_nodeTypedValue(IXMLDOMElement* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_dataType(IXMLDOMElement* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_put_dataType(IXMLDOMElement* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_xml(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_transformNode(IXMLDOMElement* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_selectNodes(IXMLDOMElement* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_selectSingleNode(IXMLDOMElement* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_parsed(IXMLDOMElement* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_namespaceURI(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_prefix(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_get_baseName(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_transformNodeToObject(IXMLDOMElement* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMElement methods ***/
static __WIDL_INLINE HRESULT IXMLDOMElement_get_tagName(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_tagName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_getAttribute(IXMLDOMElement* This,BSTR p,VARIANT *var) {
    return This->lpVtbl->getAttribute(This,p,var);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_setAttribute(IXMLDOMElement* This,BSTR p,VARIANT var) {
    return This->lpVtbl->setAttribute(This,p,var);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_removeAttribute(IXMLDOMElement* This,BSTR p) {
    return This->lpVtbl->removeAttribute(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_getAttributeNode(IXMLDOMElement* This,BSTR p,IXMLDOMAttribute **attributeNode) {
    return This->lpVtbl->getAttributeNode(This,p,attributeNode);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_setAttributeNode(IXMLDOMElement* This,IXMLDOMAttribute *domAttribute,IXMLDOMAttribute **attributeNode) {
    return This->lpVtbl->setAttributeNode(This,domAttribute,attributeNode);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_removeAttributeNode(IXMLDOMElement* This,IXMLDOMAttribute *domAttribute,IXMLDOMAttribute **attributeNode) {
    return This->lpVtbl->removeAttributeNode(This,domAttribute,attributeNode);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_getElementsByTagName(IXMLDOMElement* This,BSTR p,IXMLDOMNodeList **resultList) {
    return This->lpVtbl->getElementsByTagName(This,p,resultList);
}
static __WIDL_INLINE HRESULT IXMLDOMElement_normalize(IXMLDOMElement* This) {
    return This->lpVtbl->normalize(This);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMText interface
 */
#ifndef __IXMLDOMText_INTERFACE_DEFINED__
#define __IXMLDOMText_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMText, 0x2933bf87, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf87-7b36-11d2-b20e-00c04f983e60")
IXMLDOMText : public IXMLDOMCharacterData
{
    virtual HRESULT STDMETHODCALLTYPE splitText(
        LONG offset,
        IXMLDOMText **txtNode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMText, 0x2933bf87, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMTextVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMText *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMText *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMText *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMText *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMText *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMText *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMText *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMText *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMText *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMText *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMText *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMText *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMText *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMText *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMText *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMText *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMText *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMText *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMText *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMText *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMText *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMText *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMText *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMText *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMText *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMText *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMText *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMText *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMText *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMText *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMText *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMText *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMText *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMText *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMText *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMText *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMText *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMText *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMText *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMText *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMText *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMText *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMText *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    /*** IXMLDOMCharacterData methods ***/
    HRESULT (STDMETHODCALLTYPE *get_data)(
        IXMLDOMText *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_data)(
        IXMLDOMText *This,
        BSTR data);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IXMLDOMText *This,
        LONG *len);

    HRESULT (STDMETHODCALLTYPE *substringData)(
        IXMLDOMText *This,
        LONG offset,
        LONG count,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *appendData)(
        IXMLDOMText *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *insertData)(
        IXMLDOMText *This,
        LONG offset,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *deleteData)(
        IXMLDOMText *This,
        LONG offset,
        LONG count);

    HRESULT (STDMETHODCALLTYPE *replaceData)(
        IXMLDOMText *This,
        LONG offset,
        LONG count,
        BSTR p);

    /*** IXMLDOMText methods ***/
    HRESULT (STDMETHODCALLTYPE *splitText)(
        IXMLDOMText *This,
        LONG offset,
        IXMLDOMText **txtNode);

    END_INTERFACE
} IXMLDOMTextVtbl;

interface IXMLDOMText {
    CONST_VTBL IXMLDOMTextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMText_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMText_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMText_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMText_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMText_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMText_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMText_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMText_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMText_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMText_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMText_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMText_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMText_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMText_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMText_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMText_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMText_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMText_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMText_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMText_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMText_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMText_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMText_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMText_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMText_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMText_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMText_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMText_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMText_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMText_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMText_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMText_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMText_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMText_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMText_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMText_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMText_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMText_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMText_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMText_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMText_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMText_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
/*** IXMLDOMCharacterData methods ***/
#define IXMLDOMText_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#define IXMLDOMText_put_data(This,data) (This)->lpVtbl->put_data(This,data)
#define IXMLDOMText_get_length(This,len) (This)->lpVtbl->get_length(This,len)
#define IXMLDOMText_substringData(This,offset,count,p) (This)->lpVtbl->substringData(This,offset,count,p)
#define IXMLDOMText_appendData(This,p) (This)->lpVtbl->appendData(This,p)
#define IXMLDOMText_insertData(This,offset,p) (This)->lpVtbl->insertData(This,offset,p)
#define IXMLDOMText_deleteData(This,offset,count) (This)->lpVtbl->deleteData(This,offset,count)
#define IXMLDOMText_replaceData(This,offset,count,p) (This)->lpVtbl->replaceData(This,offset,count,p)
/*** IXMLDOMText methods ***/
#define IXMLDOMText_splitText(This,offset,txtNode) (This)->lpVtbl->splitText(This,offset,txtNode)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMText_QueryInterface(IXMLDOMText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMText_AddRef(IXMLDOMText* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMText_Release(IXMLDOMText* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMText_GetTypeInfoCount(IXMLDOMText* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMText_GetTypeInfo(IXMLDOMText* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMText_GetIDsOfNames(IXMLDOMText* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMText_Invoke(IXMLDOMText* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMText_get_nodeName(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_nodeValue(IXMLDOMText* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMText_put_nodeValue(IXMLDOMText* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_nodeType(IXMLDOMText* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_parentNode(IXMLDOMText* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_childNodes(IXMLDOMText* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_firstChild(IXMLDOMText* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_lastChild(IXMLDOMText* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_previousSibling(IXMLDOMText* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_nextSibling(IXMLDOMText* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_attributes(IXMLDOMText* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMText_insertBefore(IXMLDOMText* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMText_replaceChild(IXMLDOMText* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMText_removeChild(IXMLDOMText* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMText_appendChild(IXMLDOMText* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMText_hasChildNodes(IXMLDOMText* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_ownerDocument(IXMLDOMText* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMText_cloneNode(IXMLDOMText* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_nodeTypeString(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_text(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMText_put_text(IXMLDOMText* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_specified(IXMLDOMText* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_definition(IXMLDOMText* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_nodeTypedValue(IXMLDOMText* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMText_put_nodeTypedValue(IXMLDOMText* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_dataType(IXMLDOMText* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMText_put_dataType(IXMLDOMText* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_xml(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMText_transformNode(IXMLDOMText* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMText_selectNodes(IXMLDOMText* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMText_selectSingleNode(IXMLDOMText* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_parsed(IXMLDOMText* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_namespaceURI(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_prefix(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_baseName(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMText_transformNodeToObject(IXMLDOMText* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMCharacterData methods ***/
static __WIDL_INLINE HRESULT IXMLDOMText_get_data(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMText_put_data(IXMLDOMText* This,BSTR data) {
    return This->lpVtbl->put_data(This,data);
}
static __WIDL_INLINE HRESULT IXMLDOMText_get_length(IXMLDOMText* This,LONG *len) {
    return This->lpVtbl->get_length(This,len);
}
static __WIDL_INLINE HRESULT IXMLDOMText_substringData(IXMLDOMText* This,LONG offset,LONG count,BSTR *p) {
    return This->lpVtbl->substringData(This,offset,count,p);
}
static __WIDL_INLINE HRESULT IXMLDOMText_appendData(IXMLDOMText* This,BSTR p) {
    return This->lpVtbl->appendData(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMText_insertData(IXMLDOMText* This,LONG offset,BSTR p) {
    return This->lpVtbl->insertData(This,offset,p);
}
static __WIDL_INLINE HRESULT IXMLDOMText_deleteData(IXMLDOMText* This,LONG offset,LONG count) {
    return This->lpVtbl->deleteData(This,offset,count);
}
static __WIDL_INLINE HRESULT IXMLDOMText_replaceData(IXMLDOMText* This,LONG offset,LONG count,BSTR p) {
    return This->lpVtbl->replaceData(This,offset,count,p);
}
/*** IXMLDOMText methods ***/
static __WIDL_INLINE HRESULT IXMLDOMText_splitText(IXMLDOMText* This,LONG offset,IXMLDOMText **txtNode) {
    return This->lpVtbl->splitText(This,offset,txtNode);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMText_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMComment interface
 */
#ifndef __IXMLDOMComment_INTERFACE_DEFINED__
#define __IXMLDOMComment_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMComment, 0x2933bf88, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf88-7b36-11d2-b20e-00c04f983e60")
IXMLDOMComment : public IXMLDOMCharacterData
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMComment, 0x2933bf88, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMCommentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMComment *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMComment *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMComment *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMComment *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMComment *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMComment *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMComment *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMComment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMComment *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMComment *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMComment *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMComment *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMComment *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMComment *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMComment *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMComment *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMComment *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMComment *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMComment *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMComment *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMComment *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMComment *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMComment *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMComment *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMComment *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMComment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMComment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMComment *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMComment *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMComment *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMComment *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMComment *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMComment *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMComment *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMComment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMComment *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMComment *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMComment *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMComment *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMComment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMComment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMComment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMComment *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    /*** IXMLDOMCharacterData methods ***/
    HRESULT (STDMETHODCALLTYPE *get_data)(
        IXMLDOMComment *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_data)(
        IXMLDOMComment *This,
        BSTR data);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IXMLDOMComment *This,
        LONG *len);

    HRESULT (STDMETHODCALLTYPE *substringData)(
        IXMLDOMComment *This,
        LONG offset,
        LONG count,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *appendData)(
        IXMLDOMComment *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *insertData)(
        IXMLDOMComment *This,
        LONG offset,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *deleteData)(
        IXMLDOMComment *This,
        LONG offset,
        LONG count);

    HRESULT (STDMETHODCALLTYPE *replaceData)(
        IXMLDOMComment *This,
        LONG offset,
        LONG count,
        BSTR p);

    END_INTERFACE
} IXMLDOMCommentVtbl;

interface IXMLDOMComment {
    CONST_VTBL IXMLDOMCommentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMComment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMComment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMComment_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMComment_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMComment_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMComment_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMComment_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMComment_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMComment_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMComment_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMComment_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMComment_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMComment_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMComment_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMComment_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMComment_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMComment_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMComment_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMComment_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMComment_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMComment_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMComment_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMComment_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMComment_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMComment_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMComment_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMComment_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMComment_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMComment_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMComment_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMComment_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMComment_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMComment_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMComment_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMComment_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMComment_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMComment_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMComment_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMComment_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMComment_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMComment_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMComment_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMComment_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
/*** IXMLDOMCharacterData methods ***/
#define IXMLDOMComment_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#define IXMLDOMComment_put_data(This,data) (This)->lpVtbl->put_data(This,data)
#define IXMLDOMComment_get_length(This,len) (This)->lpVtbl->get_length(This,len)
#define IXMLDOMComment_substringData(This,offset,count,p) (This)->lpVtbl->substringData(This,offset,count,p)
#define IXMLDOMComment_appendData(This,p) (This)->lpVtbl->appendData(This,p)
#define IXMLDOMComment_insertData(This,offset,p) (This)->lpVtbl->insertData(This,offset,p)
#define IXMLDOMComment_deleteData(This,offset,count) (This)->lpVtbl->deleteData(This,offset,count)
#define IXMLDOMComment_replaceData(This,offset,count,p) (This)->lpVtbl->replaceData(This,offset,count,p)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMComment_QueryInterface(IXMLDOMComment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMComment_AddRef(IXMLDOMComment* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMComment_Release(IXMLDOMComment* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMComment_GetTypeInfoCount(IXMLDOMComment* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_GetTypeInfo(IXMLDOMComment* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_GetIDsOfNames(IXMLDOMComment* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_Invoke(IXMLDOMComment* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMComment_get_nodeName(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_nodeValue(IXMLDOMComment* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_put_nodeValue(IXMLDOMComment* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_nodeType(IXMLDOMComment* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_parentNode(IXMLDOMComment* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_childNodes(IXMLDOMComment* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_firstChild(IXMLDOMComment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_lastChild(IXMLDOMComment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_previousSibling(IXMLDOMComment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_nextSibling(IXMLDOMComment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_attributes(IXMLDOMComment* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_insertBefore(IXMLDOMComment* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_replaceChild(IXMLDOMComment* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_removeChild(IXMLDOMComment* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_appendChild(IXMLDOMComment* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_hasChildNodes(IXMLDOMComment* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_ownerDocument(IXMLDOMComment* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_cloneNode(IXMLDOMComment* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_nodeTypeString(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_text(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_put_text(IXMLDOMComment* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_specified(IXMLDOMComment* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_definition(IXMLDOMComment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_nodeTypedValue(IXMLDOMComment* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_put_nodeTypedValue(IXMLDOMComment* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_dataType(IXMLDOMComment* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_put_dataType(IXMLDOMComment* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_xml(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_transformNode(IXMLDOMComment* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_selectNodes(IXMLDOMComment* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_selectSingleNode(IXMLDOMComment* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_parsed(IXMLDOMComment* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_namespaceURI(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_prefix(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_baseName(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_transformNodeToObject(IXMLDOMComment* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMCharacterData methods ***/
static __WIDL_INLINE HRESULT IXMLDOMComment_get_data(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_put_data(IXMLDOMComment* This,BSTR data) {
    return This->lpVtbl->put_data(This,data);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_get_length(IXMLDOMComment* This,LONG *len) {
    return This->lpVtbl->get_length(This,len);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_substringData(IXMLDOMComment* This,LONG offset,LONG count,BSTR *p) {
    return This->lpVtbl->substringData(This,offset,count,p);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_appendData(IXMLDOMComment* This,BSTR p) {
    return This->lpVtbl->appendData(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_insertData(IXMLDOMComment* This,LONG offset,BSTR p) {
    return This->lpVtbl->insertData(This,offset,p);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_deleteData(IXMLDOMComment* This,LONG offset,LONG count) {
    return This->lpVtbl->deleteData(This,offset,count);
}
static __WIDL_INLINE HRESULT IXMLDOMComment_replaceData(IXMLDOMComment* This,LONG offset,LONG count,BSTR p) {
    return This->lpVtbl->replaceData(This,offset,count,p);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMComment_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMProcessingInstruction interface
 */
#ifndef __IXMLDOMProcessingInstruction_INTERFACE_DEFINED__
#define __IXMLDOMProcessingInstruction_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMProcessingInstruction, 0x2933bf89, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf89-7b36-11d2-b20e-00c04f983e60")
IXMLDOMProcessingInstruction : public IXMLDOMNode
{
    virtual HRESULT STDMETHODCALLTYPE get_target(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_data(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_data(
        BSTR p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMProcessingInstruction, 0x2933bf89, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMProcessingInstructionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMProcessingInstruction *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMProcessingInstruction *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMProcessingInstruction *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMProcessingInstruction *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMProcessingInstruction *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMProcessingInstruction *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMProcessingInstruction *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMProcessingInstruction *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMProcessingInstruction *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMProcessingInstruction *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMProcessingInstruction *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMProcessingInstruction *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMProcessingInstruction *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMProcessingInstruction *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMProcessingInstruction *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMProcessingInstruction *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMProcessingInstruction *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMProcessingInstruction *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMProcessingInstruction *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMProcessingInstruction *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMProcessingInstruction *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMProcessingInstruction *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMProcessingInstruction *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMProcessingInstruction *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMProcessingInstruction *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMProcessingInstruction *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMProcessingInstruction *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMProcessingInstruction *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMProcessingInstruction *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    /*** IXMLDOMProcessingInstruction methods ***/
    HRESULT (STDMETHODCALLTYPE *get_target)(
        IXMLDOMProcessingInstruction *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_data)(
        IXMLDOMProcessingInstruction *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_data)(
        IXMLDOMProcessingInstruction *This,
        BSTR p);

    END_INTERFACE
} IXMLDOMProcessingInstructionVtbl;

interface IXMLDOMProcessingInstruction {
    CONST_VTBL IXMLDOMProcessingInstructionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMProcessingInstruction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMProcessingInstruction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMProcessingInstruction_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMProcessingInstruction_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMProcessingInstruction_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMProcessingInstruction_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMProcessingInstruction_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMProcessingInstruction_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMProcessingInstruction_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMProcessingInstruction_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMProcessingInstruction_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMProcessingInstruction_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMProcessingInstruction_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMProcessingInstruction_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMProcessingInstruction_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMProcessingInstruction_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMProcessingInstruction_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMProcessingInstruction_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMProcessingInstruction_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMProcessingInstruction_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMProcessingInstruction_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMProcessingInstruction_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMProcessingInstruction_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMProcessingInstruction_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMProcessingInstruction_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMProcessingInstruction_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMProcessingInstruction_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMProcessingInstruction_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMProcessingInstruction_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMProcessingInstruction_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMProcessingInstruction_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMProcessingInstruction_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMProcessingInstruction_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMProcessingInstruction_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMProcessingInstruction_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMProcessingInstruction_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMProcessingInstruction_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMProcessingInstruction_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMProcessingInstruction_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMProcessingInstruction_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMProcessingInstruction_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMProcessingInstruction_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMProcessingInstruction_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
/*** IXMLDOMProcessingInstruction methods ***/
#define IXMLDOMProcessingInstruction_get_target(This,p) (This)->lpVtbl->get_target(This,p)
#define IXMLDOMProcessingInstruction_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#define IXMLDOMProcessingInstruction_put_data(This,p) (This)->lpVtbl->put_data(This,p)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_QueryInterface(IXMLDOMProcessingInstruction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMProcessingInstruction_AddRef(IXMLDOMProcessingInstruction* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMProcessingInstruction_Release(IXMLDOMProcessingInstruction* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_GetTypeInfoCount(IXMLDOMProcessingInstruction* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_GetTypeInfo(IXMLDOMProcessingInstruction* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_GetIDsOfNames(IXMLDOMProcessingInstruction* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_Invoke(IXMLDOMProcessingInstruction* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_nodeName(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_nodeValue(IXMLDOMProcessingInstruction* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_put_nodeValue(IXMLDOMProcessingInstruction* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_nodeType(IXMLDOMProcessingInstruction* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_parentNode(IXMLDOMProcessingInstruction* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_childNodes(IXMLDOMProcessingInstruction* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_firstChild(IXMLDOMProcessingInstruction* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_lastChild(IXMLDOMProcessingInstruction* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_previousSibling(IXMLDOMProcessingInstruction* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_nextSibling(IXMLDOMProcessingInstruction* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_attributes(IXMLDOMProcessingInstruction* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_insertBefore(IXMLDOMProcessingInstruction* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_replaceChild(IXMLDOMProcessingInstruction* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_removeChild(IXMLDOMProcessingInstruction* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_appendChild(IXMLDOMProcessingInstruction* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_hasChildNodes(IXMLDOMProcessingInstruction* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_ownerDocument(IXMLDOMProcessingInstruction* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_cloneNode(IXMLDOMProcessingInstruction* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_nodeTypeString(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_text(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_put_text(IXMLDOMProcessingInstruction* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_specified(IXMLDOMProcessingInstruction* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_definition(IXMLDOMProcessingInstruction* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_nodeTypedValue(IXMLDOMProcessingInstruction* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_put_nodeTypedValue(IXMLDOMProcessingInstruction* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_dataType(IXMLDOMProcessingInstruction* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_put_dataType(IXMLDOMProcessingInstruction* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_xml(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_transformNode(IXMLDOMProcessingInstruction* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_selectNodes(IXMLDOMProcessingInstruction* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_selectSingleNode(IXMLDOMProcessingInstruction* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_parsed(IXMLDOMProcessingInstruction* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_namespaceURI(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_prefix(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_baseName(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_transformNodeToObject(IXMLDOMProcessingInstruction* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMProcessingInstruction methods ***/
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_target(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_target(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_get_data(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMProcessingInstruction_put_data(IXMLDOMProcessingInstruction* This,BSTR p) {
    return This->lpVtbl->put_data(This,p);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMProcessingInstruction_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMCDATASection interface
 */
#ifndef __IXMLDOMCDATASection_INTERFACE_DEFINED__
#define __IXMLDOMCDATASection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMCDATASection, 0x2933bf8a, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf8a-7b36-11d2-b20e-00c04f983e60")
IXMLDOMCDATASection : public IXMLDOMText
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMCDATASection, 0x2933bf8a, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMCDATASectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMCDATASection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMCDATASection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMCDATASection *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMCDATASection *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMCDATASection *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMCDATASection *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMCDATASection *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMCDATASection *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMCDATASection *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMCDATASection *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMCDATASection *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMCDATASection *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMCDATASection *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMCDATASection *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMCDATASection *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMCDATASection *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMCDATASection *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMCDATASection *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMCDATASection *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMCDATASection *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMCDATASection *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMCDATASection *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMCDATASection *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMCDATASection *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMCDATASection *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMCDATASection *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMCDATASection *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMCDATASection *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMCDATASection *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMCDATASection *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMCDATASection *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMCDATASection *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMCDATASection *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMCDATASection *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMCDATASection *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMCDATASection *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMCDATASection *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMCDATASection *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMCDATASection *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMCDATASection *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMCDATASection *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMCDATASection *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMCDATASection *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    /*** IXMLDOMCharacterData methods ***/
    HRESULT (STDMETHODCALLTYPE *get_data)(
        IXMLDOMCDATASection *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_data)(
        IXMLDOMCDATASection *This,
        BSTR data);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IXMLDOMCDATASection *This,
        LONG *len);

    HRESULT (STDMETHODCALLTYPE *substringData)(
        IXMLDOMCDATASection *This,
        LONG offset,
        LONG count,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *appendData)(
        IXMLDOMCDATASection *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *insertData)(
        IXMLDOMCDATASection *This,
        LONG offset,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *deleteData)(
        IXMLDOMCDATASection *This,
        LONG offset,
        LONG count);

    HRESULT (STDMETHODCALLTYPE *replaceData)(
        IXMLDOMCDATASection *This,
        LONG offset,
        LONG count,
        BSTR p);

    /*** IXMLDOMText methods ***/
    HRESULT (STDMETHODCALLTYPE *splitText)(
        IXMLDOMCDATASection *This,
        LONG offset,
        IXMLDOMText **txtNode);

    END_INTERFACE
} IXMLDOMCDATASectionVtbl;

interface IXMLDOMCDATASection {
    CONST_VTBL IXMLDOMCDATASectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMCDATASection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMCDATASection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMCDATASection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMCDATASection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMCDATASection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMCDATASection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMCDATASection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMCDATASection_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMCDATASection_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMCDATASection_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMCDATASection_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMCDATASection_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMCDATASection_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMCDATASection_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMCDATASection_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMCDATASection_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMCDATASection_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMCDATASection_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMCDATASection_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMCDATASection_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMCDATASection_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMCDATASection_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMCDATASection_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMCDATASection_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMCDATASection_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMCDATASection_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMCDATASection_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMCDATASection_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMCDATASection_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMCDATASection_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMCDATASection_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMCDATASection_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMCDATASection_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMCDATASection_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMCDATASection_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMCDATASection_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMCDATASection_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMCDATASection_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMCDATASection_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMCDATASection_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMCDATASection_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMCDATASection_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMCDATASection_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
/*** IXMLDOMCharacterData methods ***/
#define IXMLDOMCDATASection_get_data(This,p) (This)->lpVtbl->get_data(This,p)
#define IXMLDOMCDATASection_put_data(This,data) (This)->lpVtbl->put_data(This,data)
#define IXMLDOMCDATASection_get_length(This,len) (This)->lpVtbl->get_length(This,len)
#define IXMLDOMCDATASection_substringData(This,offset,count,p) (This)->lpVtbl->substringData(This,offset,count,p)
#define IXMLDOMCDATASection_appendData(This,p) (This)->lpVtbl->appendData(This,p)
#define IXMLDOMCDATASection_insertData(This,offset,p) (This)->lpVtbl->insertData(This,offset,p)
#define IXMLDOMCDATASection_deleteData(This,offset,count) (This)->lpVtbl->deleteData(This,offset,count)
#define IXMLDOMCDATASection_replaceData(This,offset,count,p) (This)->lpVtbl->replaceData(This,offset,count,p)
/*** IXMLDOMText methods ***/
#define IXMLDOMCDATASection_splitText(This,offset,txtNode) (This)->lpVtbl->splitText(This,offset,txtNode)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_QueryInterface(IXMLDOMCDATASection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMCDATASection_AddRef(IXMLDOMCDATASection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMCDATASection_Release(IXMLDOMCDATASection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_GetTypeInfoCount(IXMLDOMCDATASection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_GetTypeInfo(IXMLDOMCDATASection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_GetIDsOfNames(IXMLDOMCDATASection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_Invoke(IXMLDOMCDATASection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_nodeName(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_nodeValue(IXMLDOMCDATASection* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_put_nodeValue(IXMLDOMCDATASection* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_nodeType(IXMLDOMCDATASection* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_parentNode(IXMLDOMCDATASection* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_childNodes(IXMLDOMCDATASection* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_firstChild(IXMLDOMCDATASection* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_lastChild(IXMLDOMCDATASection* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_previousSibling(IXMLDOMCDATASection* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_nextSibling(IXMLDOMCDATASection* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_attributes(IXMLDOMCDATASection* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_insertBefore(IXMLDOMCDATASection* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_replaceChild(IXMLDOMCDATASection* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_removeChild(IXMLDOMCDATASection* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_appendChild(IXMLDOMCDATASection* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_hasChildNodes(IXMLDOMCDATASection* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_ownerDocument(IXMLDOMCDATASection* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_cloneNode(IXMLDOMCDATASection* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_nodeTypeString(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_text(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_put_text(IXMLDOMCDATASection* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_specified(IXMLDOMCDATASection* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_definition(IXMLDOMCDATASection* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_nodeTypedValue(IXMLDOMCDATASection* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_put_nodeTypedValue(IXMLDOMCDATASection* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_dataType(IXMLDOMCDATASection* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_put_dataType(IXMLDOMCDATASection* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_xml(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_transformNode(IXMLDOMCDATASection* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_selectNodes(IXMLDOMCDATASection* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_selectSingleNode(IXMLDOMCDATASection* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_parsed(IXMLDOMCDATASection* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_namespaceURI(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_prefix(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_baseName(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_transformNodeToObject(IXMLDOMCDATASection* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMCharacterData methods ***/
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_data(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_put_data(IXMLDOMCDATASection* This,BSTR data) {
    return This->lpVtbl->put_data(This,data);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_get_length(IXMLDOMCDATASection* This,LONG *len) {
    return This->lpVtbl->get_length(This,len);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_substringData(IXMLDOMCDATASection* This,LONG offset,LONG count,BSTR *p) {
    return This->lpVtbl->substringData(This,offset,count,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_appendData(IXMLDOMCDATASection* This,BSTR p) {
    return This->lpVtbl->appendData(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_insertData(IXMLDOMCDATASection* This,LONG offset,BSTR p) {
    return This->lpVtbl->insertData(This,offset,p);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_deleteData(IXMLDOMCDATASection* This,LONG offset,LONG count) {
    return This->lpVtbl->deleteData(This,offset,count);
}
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_replaceData(IXMLDOMCDATASection* This,LONG offset,LONG count,BSTR p) {
    return This->lpVtbl->replaceData(This,offset,count,p);
}
/*** IXMLDOMText methods ***/
static __WIDL_INLINE HRESULT IXMLDOMCDATASection_splitText(IXMLDOMCDATASection* This,LONG offset,IXMLDOMText **txtNode) {
    return This->lpVtbl->splitText(This,offset,txtNode);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMCDATASection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMDocumentType interface
 */
#ifndef __IXMLDOMDocumentType_INTERFACE_DEFINED__
#define __IXMLDOMDocumentType_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMDocumentType, 0x2933bf8b, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf8b-7b36-11d2-b20e-00c04f983e60")
IXMLDOMDocumentType : public IXMLDOMNode
{
    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_entities(
        IXMLDOMNamedNodeMap **entityMap) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_notations(
        IXMLDOMNamedNodeMap **notationMap) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMDocumentType, 0x2933bf8b, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMDocumentTypeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMDocumentType *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMDocumentType *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMDocumentType *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMDocumentType *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMDocumentType *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMDocumentType *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMDocumentType *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMDocumentType *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMDocumentType *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMDocumentType *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMDocumentType *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMDocumentType *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMDocumentType *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMDocumentType *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMDocumentType *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMDocumentType *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMDocumentType *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMDocumentType *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMDocumentType *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMDocumentType *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMDocumentType *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMDocumentType *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMDocumentType *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMDocumentType *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMDocumentType *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMDocumentType *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMDocumentType *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMDocumentType *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMDocumentType *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMDocumentType *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMDocumentType *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMDocumentType *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMDocumentType *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMDocumentType *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMDocumentType *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMDocumentType *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMDocumentType *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMDocumentType *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMDocumentType *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMDocumentType *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMDocumentType *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMDocumentType *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMDocumentType *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    /*** IXMLDOMDocumentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        IXMLDOMDocumentType *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_entities)(
        IXMLDOMDocumentType *This,
        IXMLDOMNamedNodeMap **entityMap);

    HRESULT (STDMETHODCALLTYPE *get_notations)(
        IXMLDOMDocumentType *This,
        IXMLDOMNamedNodeMap **notationMap);

    END_INTERFACE
} IXMLDOMDocumentTypeVtbl;

interface IXMLDOMDocumentType {
    CONST_VTBL IXMLDOMDocumentTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMDocumentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMDocumentType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMDocumentType_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMDocumentType_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMDocumentType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMDocumentType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMDocumentType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMDocumentType_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMDocumentType_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMDocumentType_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMDocumentType_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMDocumentType_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMDocumentType_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMDocumentType_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMDocumentType_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMDocumentType_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMDocumentType_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMDocumentType_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMDocumentType_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMDocumentType_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMDocumentType_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMDocumentType_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMDocumentType_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMDocumentType_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMDocumentType_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMDocumentType_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMDocumentType_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMDocumentType_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMDocumentType_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMDocumentType_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMDocumentType_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMDocumentType_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMDocumentType_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMDocumentType_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMDocumentType_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMDocumentType_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMDocumentType_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMDocumentType_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMDocumentType_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMDocumentType_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMDocumentType_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMDocumentType_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMDocumentType_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
/*** IXMLDOMDocumentType methods ***/
#define IXMLDOMDocumentType_get_name(This,p) (This)->lpVtbl->get_name(This,p)
#define IXMLDOMDocumentType_get_entities(This,entityMap) (This)->lpVtbl->get_entities(This,entityMap)
#define IXMLDOMDocumentType_get_notations(This,notationMap) (This)->lpVtbl->get_notations(This,notationMap)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_QueryInterface(IXMLDOMDocumentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMDocumentType_AddRef(IXMLDOMDocumentType* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMDocumentType_Release(IXMLDOMDocumentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_GetTypeInfoCount(IXMLDOMDocumentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_GetTypeInfo(IXMLDOMDocumentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_GetIDsOfNames(IXMLDOMDocumentType* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_Invoke(IXMLDOMDocumentType* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_nodeName(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_nodeValue(IXMLDOMDocumentType* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_put_nodeValue(IXMLDOMDocumentType* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_nodeType(IXMLDOMDocumentType* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_parentNode(IXMLDOMDocumentType* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_childNodes(IXMLDOMDocumentType* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_firstChild(IXMLDOMDocumentType* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_lastChild(IXMLDOMDocumentType* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_previousSibling(IXMLDOMDocumentType* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_nextSibling(IXMLDOMDocumentType* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_attributes(IXMLDOMDocumentType* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_insertBefore(IXMLDOMDocumentType* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_replaceChild(IXMLDOMDocumentType* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_removeChild(IXMLDOMDocumentType* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_appendChild(IXMLDOMDocumentType* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_hasChildNodes(IXMLDOMDocumentType* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_ownerDocument(IXMLDOMDocumentType* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_cloneNode(IXMLDOMDocumentType* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_nodeTypeString(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_text(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_put_text(IXMLDOMDocumentType* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_specified(IXMLDOMDocumentType* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_definition(IXMLDOMDocumentType* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_nodeTypedValue(IXMLDOMDocumentType* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_put_nodeTypedValue(IXMLDOMDocumentType* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_dataType(IXMLDOMDocumentType* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_put_dataType(IXMLDOMDocumentType* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_xml(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_transformNode(IXMLDOMDocumentType* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_selectNodes(IXMLDOMDocumentType* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_selectSingleNode(IXMLDOMDocumentType* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_parsed(IXMLDOMDocumentType* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_namespaceURI(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_prefix(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_baseName(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_transformNodeToObject(IXMLDOMDocumentType* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMDocumentType methods ***/
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_name(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_entities(IXMLDOMDocumentType* This,IXMLDOMNamedNodeMap **entityMap) {
    return This->lpVtbl->get_entities(This,entityMap);
}
static __WIDL_INLINE HRESULT IXMLDOMDocumentType_get_notations(IXMLDOMDocumentType* This,IXMLDOMNamedNodeMap **notationMap) {
    return This->lpVtbl->get_notations(This,notationMap);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMDocumentType_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMNotation interface
 */
#ifndef __IXMLDOMNotation_INTERFACE_DEFINED__
#define __IXMLDOMNotation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMNotation, 0x2933bf8c, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf8c-7b36-11d2-b20e-00c04f983e60")
IXMLDOMNotation : public IXMLDOMNode
{
    virtual HRESULT STDMETHODCALLTYPE get_publicId(
        VARIANT *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_systemId(
        VARIANT *id) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMNotation, 0x2933bf8c, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMNotationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMNotation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMNotation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMNotation *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMNotation *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMNotation *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMNotation *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMNotation *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMNotation *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMNotation *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMNotation *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMNotation *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMNotation *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMNotation *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMNotation *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMNotation *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMNotation *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMNotation *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMNotation *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMNotation *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMNotation *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMNotation *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMNotation *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMNotation *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMNotation *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMNotation *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMNotation *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMNotation *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMNotation *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMNotation *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMNotation *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMNotation *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMNotation *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMNotation *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMNotation *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMNotation *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMNotation *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMNotation *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMNotation *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMNotation *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMNotation *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMNotation *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMNotation *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMNotation *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    /*** IXMLDOMNotation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_publicId)(
        IXMLDOMNotation *This,
        VARIANT *id);

    HRESULT (STDMETHODCALLTYPE *get_systemId)(
        IXMLDOMNotation *This,
        VARIANT *id);

    END_INTERFACE
} IXMLDOMNotationVtbl;

interface IXMLDOMNotation {
    CONST_VTBL IXMLDOMNotationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMNotation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMNotation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMNotation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMNotation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMNotation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMNotation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMNotation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMNotation_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMNotation_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMNotation_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMNotation_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMNotation_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMNotation_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMNotation_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMNotation_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMNotation_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMNotation_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMNotation_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMNotation_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMNotation_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMNotation_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMNotation_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMNotation_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMNotation_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMNotation_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMNotation_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMNotation_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMNotation_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMNotation_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMNotation_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMNotation_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMNotation_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMNotation_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMNotation_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMNotation_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMNotation_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMNotation_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMNotation_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMNotation_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMNotation_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMNotation_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMNotation_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMNotation_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
/*** IXMLDOMNotation methods ***/
#define IXMLDOMNotation_get_publicId(This,id) (This)->lpVtbl->get_publicId(This,id)
#define IXMLDOMNotation_get_systemId(This,id) (This)->lpVtbl->get_systemId(This,id)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMNotation_QueryInterface(IXMLDOMNotation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMNotation_AddRef(IXMLDOMNotation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMNotation_Release(IXMLDOMNotation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMNotation_GetTypeInfoCount(IXMLDOMNotation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_GetTypeInfo(IXMLDOMNotation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_GetIDsOfNames(IXMLDOMNotation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_Invoke(IXMLDOMNotation* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_nodeName(IXMLDOMNotation* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_nodeValue(IXMLDOMNotation* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_put_nodeValue(IXMLDOMNotation* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_nodeType(IXMLDOMNotation* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_parentNode(IXMLDOMNotation* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_childNodes(IXMLDOMNotation* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_firstChild(IXMLDOMNotation* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_lastChild(IXMLDOMNotation* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_previousSibling(IXMLDOMNotation* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_nextSibling(IXMLDOMNotation* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_attributes(IXMLDOMNotation* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_insertBefore(IXMLDOMNotation* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_replaceChild(IXMLDOMNotation* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_removeChild(IXMLDOMNotation* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_appendChild(IXMLDOMNotation* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_hasChildNodes(IXMLDOMNotation* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_ownerDocument(IXMLDOMNotation* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_cloneNode(IXMLDOMNotation* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_nodeTypeString(IXMLDOMNotation* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_text(IXMLDOMNotation* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_put_text(IXMLDOMNotation* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_specified(IXMLDOMNotation* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_definition(IXMLDOMNotation* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_nodeTypedValue(IXMLDOMNotation* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_put_nodeTypedValue(IXMLDOMNotation* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_dataType(IXMLDOMNotation* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_put_dataType(IXMLDOMNotation* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_xml(IXMLDOMNotation* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_transformNode(IXMLDOMNotation* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_selectNodes(IXMLDOMNotation* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_selectSingleNode(IXMLDOMNotation* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_parsed(IXMLDOMNotation* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_namespaceURI(IXMLDOMNotation* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_prefix(IXMLDOMNotation* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_baseName(IXMLDOMNotation* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_transformNodeToObject(IXMLDOMNotation* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMNotation methods ***/
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_publicId(IXMLDOMNotation* This,VARIANT *id) {
    return This->lpVtbl->get_publicId(This,id);
}
static __WIDL_INLINE HRESULT IXMLDOMNotation_get_systemId(IXMLDOMNotation* This,VARIANT *id) {
    return This->lpVtbl->get_systemId(This,id);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMNotation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMEntity interface
 */
#ifndef __IXMLDOMEntity_INTERFACE_DEFINED__
#define __IXMLDOMEntity_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMEntity, 0x2933bf8d, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf8d-7b36-11d2-b20e-00c04f983e60")
IXMLDOMEntity : public IXMLDOMNode
{
    virtual HRESULT STDMETHODCALLTYPE get_publicId(
        VARIANT *id1) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_systemId(
        VARIANT *id1) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_notationName(
        BSTR *p) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMEntity, 0x2933bf8d, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMEntityVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMEntity *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMEntity *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMEntity *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMEntity *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMEntity *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMEntity *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMEntity *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMEntity *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMEntity *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMEntity *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMEntity *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMEntity *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMEntity *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMEntity *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMEntity *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMEntity *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMEntity *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMEntity *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMEntity *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMEntity *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMEntity *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMEntity *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMEntity *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMEntity *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMEntity *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMEntity *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMEntity *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMEntity *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMEntity *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMEntity *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMEntity *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMEntity *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMEntity *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMEntity *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMEntity *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMEntity *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMEntity *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMEntity *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMEntity *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMEntity *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMEntity *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMEntity *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMEntity *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    /*** IXMLDOMEntity methods ***/
    HRESULT (STDMETHODCALLTYPE *get_publicId)(
        IXMLDOMEntity *This,
        VARIANT *id1);

    HRESULT (STDMETHODCALLTYPE *get_systemId)(
        IXMLDOMEntity *This,
        VARIANT *id1);

    HRESULT (STDMETHODCALLTYPE *get_notationName)(
        IXMLDOMEntity *This,
        BSTR *p);

    END_INTERFACE
} IXMLDOMEntityVtbl;

interface IXMLDOMEntity {
    CONST_VTBL IXMLDOMEntityVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMEntity_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMEntity_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMEntity_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMEntity_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMEntity_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMEntity_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMEntity_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMEntity_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMEntity_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMEntity_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMEntity_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMEntity_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMEntity_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMEntity_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMEntity_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMEntity_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMEntity_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMEntity_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMEntity_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMEntity_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMEntity_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMEntity_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMEntity_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMEntity_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMEntity_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMEntity_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMEntity_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMEntity_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMEntity_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMEntity_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMEntity_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMEntity_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMEntity_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMEntity_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMEntity_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMEntity_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMEntity_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMEntity_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMEntity_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMEntity_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMEntity_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMEntity_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMEntity_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
/*** IXMLDOMEntity methods ***/
#define IXMLDOMEntity_get_publicId(This,id1) (This)->lpVtbl->get_publicId(This,id1)
#define IXMLDOMEntity_get_systemId(This,id1) (This)->lpVtbl->get_systemId(This,id1)
#define IXMLDOMEntity_get_notationName(This,p) (This)->lpVtbl->get_notationName(This,p)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMEntity_QueryInterface(IXMLDOMEntity* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMEntity_AddRef(IXMLDOMEntity* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMEntity_Release(IXMLDOMEntity* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMEntity_GetTypeInfoCount(IXMLDOMEntity* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_GetTypeInfo(IXMLDOMEntity* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_GetIDsOfNames(IXMLDOMEntity* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_Invoke(IXMLDOMEntity* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_nodeName(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_nodeValue(IXMLDOMEntity* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_put_nodeValue(IXMLDOMEntity* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_nodeType(IXMLDOMEntity* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_parentNode(IXMLDOMEntity* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_childNodes(IXMLDOMEntity* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_firstChild(IXMLDOMEntity* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_lastChild(IXMLDOMEntity* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_previousSibling(IXMLDOMEntity* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_nextSibling(IXMLDOMEntity* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_attributes(IXMLDOMEntity* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_insertBefore(IXMLDOMEntity* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_replaceChild(IXMLDOMEntity* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_removeChild(IXMLDOMEntity* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_appendChild(IXMLDOMEntity* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_hasChildNodes(IXMLDOMEntity* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_ownerDocument(IXMLDOMEntity* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_cloneNode(IXMLDOMEntity* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_nodeTypeString(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_text(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_put_text(IXMLDOMEntity* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_specified(IXMLDOMEntity* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_definition(IXMLDOMEntity* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_nodeTypedValue(IXMLDOMEntity* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_put_nodeTypedValue(IXMLDOMEntity* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_dataType(IXMLDOMEntity* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_put_dataType(IXMLDOMEntity* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_xml(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_transformNode(IXMLDOMEntity* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_selectNodes(IXMLDOMEntity* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_selectSingleNode(IXMLDOMEntity* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_parsed(IXMLDOMEntity* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_namespaceURI(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_prefix(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_baseName(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_transformNodeToObject(IXMLDOMEntity* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMEntity methods ***/
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_publicId(IXMLDOMEntity* This,VARIANT *id1) {
    return This->lpVtbl->get_publicId(This,id1);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_systemId(IXMLDOMEntity* This,VARIANT *id1) {
    return This->lpVtbl->get_systemId(This,id1);
}
static __WIDL_INLINE HRESULT IXMLDOMEntity_get_notationName(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_notationName(This,p);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMEntity_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMEntityReference interface
 */
#ifndef __IXMLDOMEntityReference_INTERFACE_DEFINED__
#define __IXMLDOMEntityReference_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMEntityReference, 0x2933bf8e, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf8e-7b36-11d2-b20e-00c04f983e60")
IXMLDOMEntityReference : public IXMLDOMNode
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMEntityReference, 0x2933bf8e, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMEntityReferenceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMEntityReference *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMEntityReference *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMEntityReference *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMEntityReference *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMEntityReference *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMEntityReference *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMEntityReference *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXMLDOMEntityReference *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXMLDOMEntityReference *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXMLDOMEntityReference *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXMLDOMEntityReference *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXMLDOMEntityReference *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXMLDOMEntityReference *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXMLDOMEntityReference *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXMLDOMEntityReference *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXMLDOMEntityReference *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXMLDOMEntityReference *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXMLDOMEntityReference *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXMLDOMEntityReference *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXMLDOMEntityReference *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXMLDOMEntityReference *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXMLDOMEntityReference *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXMLDOMEntityReference *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXMLDOMEntityReference *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXMLDOMEntityReference *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXMLDOMEntityReference *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXMLDOMEntityReference *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXMLDOMEntityReference *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXMLDOMEntityReference *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXMLDOMEntityReference *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXMLDOMEntityReference *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXMLDOMEntityReference *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXMLDOMEntityReference *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXMLDOMEntityReference *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXMLDOMEntityReference *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXMLDOMEntityReference *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXMLDOMEntityReference *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXMLDOMEntityReference *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXMLDOMEntityReference *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXMLDOMEntityReference *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXMLDOMEntityReference *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXMLDOMEntityReference *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXMLDOMEntityReference *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    END_INTERFACE
} IXMLDOMEntityReferenceVtbl;

interface IXMLDOMEntityReference {
    CONST_VTBL IXMLDOMEntityReferenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMEntityReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMEntityReference_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMEntityReference_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMEntityReference_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMEntityReference_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMEntityReference_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMEntityReference_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXMLDOMEntityReference_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXMLDOMEntityReference_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXMLDOMEntityReference_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXMLDOMEntityReference_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXMLDOMEntityReference_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXMLDOMEntityReference_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXMLDOMEntityReference_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXMLDOMEntityReference_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXMLDOMEntityReference_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXMLDOMEntityReference_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXMLDOMEntityReference_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXMLDOMEntityReference_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXMLDOMEntityReference_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXMLDOMEntityReference_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXMLDOMEntityReference_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXMLDOMEntityReference_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXMLDOMEntityReference_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXMLDOMEntityReference_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXMLDOMEntityReference_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXMLDOMEntityReference_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXMLDOMEntityReference_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXMLDOMEntityReference_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXMLDOMEntityReference_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXMLDOMEntityReference_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXMLDOMEntityReference_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXMLDOMEntityReference_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXMLDOMEntityReference_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXMLDOMEntityReference_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXMLDOMEntityReference_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXMLDOMEntityReference_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXMLDOMEntityReference_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXMLDOMEntityReference_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXMLDOMEntityReference_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXMLDOMEntityReference_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXMLDOMEntityReference_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXMLDOMEntityReference_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_QueryInterface(IXMLDOMEntityReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMEntityReference_AddRef(IXMLDOMEntityReference* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMEntityReference_Release(IXMLDOMEntityReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_GetTypeInfoCount(IXMLDOMEntityReference* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_GetTypeInfo(IXMLDOMEntityReference* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_GetIDsOfNames(IXMLDOMEntityReference* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_Invoke(IXMLDOMEntityReference* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_nodeName(IXMLDOMEntityReference* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_nodeValue(IXMLDOMEntityReference* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_put_nodeValue(IXMLDOMEntityReference* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_nodeType(IXMLDOMEntityReference* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_parentNode(IXMLDOMEntityReference* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_childNodes(IXMLDOMEntityReference* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_firstChild(IXMLDOMEntityReference* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_lastChild(IXMLDOMEntityReference* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_previousSibling(IXMLDOMEntityReference* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_nextSibling(IXMLDOMEntityReference* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_attributes(IXMLDOMEntityReference* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_insertBefore(IXMLDOMEntityReference* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_replaceChild(IXMLDOMEntityReference* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_removeChild(IXMLDOMEntityReference* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_appendChild(IXMLDOMEntityReference* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_hasChildNodes(IXMLDOMEntityReference* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_ownerDocument(IXMLDOMEntityReference* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_cloneNode(IXMLDOMEntityReference* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_nodeTypeString(IXMLDOMEntityReference* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_text(IXMLDOMEntityReference* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_put_text(IXMLDOMEntityReference* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_specified(IXMLDOMEntityReference* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_definition(IXMLDOMEntityReference* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_nodeTypedValue(IXMLDOMEntityReference* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_put_nodeTypedValue(IXMLDOMEntityReference* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_dataType(IXMLDOMEntityReference* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_put_dataType(IXMLDOMEntityReference* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_xml(IXMLDOMEntityReference* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_transformNode(IXMLDOMEntityReference* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_selectNodes(IXMLDOMEntityReference* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_selectSingleNode(IXMLDOMEntityReference* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_parsed(IXMLDOMEntityReference* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_namespaceURI(IXMLDOMEntityReference* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_prefix(IXMLDOMEntityReference* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_get_baseName(IXMLDOMEntityReference* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMEntityReference_transformNodeToObject(IXMLDOMEntityReference* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMEntityReference_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMImplementation interface
 */
#ifndef __IXMLDOMImplementation_INTERFACE_DEFINED__
#define __IXMLDOMImplementation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMImplementation, 0x2933bf8f, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf8f-7b36-11d2-b20e-00c04f983e60")
IXMLDOMImplementation : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE hasFeature(
        BSTR feature,
        BSTR version,
        VARIANT_BOOL *pbool) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMImplementation, 0x2933bf8f, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXMLDOMImplementationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMImplementation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMImplementation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMImplementation *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMImplementation *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMImplementation *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMImplementation *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMImplementation *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMImplementation methods ***/
    HRESULT (STDMETHODCALLTYPE *hasFeature)(
        IXMLDOMImplementation *This,
        BSTR feature,
        BSTR version,
        VARIANT_BOOL *pbool);

    END_INTERFACE
} IXMLDOMImplementationVtbl;

interface IXMLDOMImplementation {
    CONST_VTBL IXMLDOMImplementationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMImplementation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMImplementation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMImplementation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMImplementation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMImplementation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMImplementation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMImplementation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMImplementation methods ***/
#define IXMLDOMImplementation_hasFeature(This,feature,version,pbool) (This)->lpVtbl->hasFeature(This,feature,version,pbool)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMImplementation_QueryInterface(IXMLDOMImplementation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMImplementation_AddRef(IXMLDOMImplementation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMImplementation_Release(IXMLDOMImplementation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMImplementation_GetTypeInfoCount(IXMLDOMImplementation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMImplementation_GetTypeInfo(IXMLDOMImplementation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMImplementation_GetIDsOfNames(IXMLDOMImplementation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMImplementation_Invoke(IXMLDOMImplementation* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMImplementation methods ***/
static __WIDL_INLINE HRESULT IXMLDOMImplementation_hasFeature(IXMLDOMImplementation* This,BSTR feature,BSTR version,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasFeature(This,feature,version,pbool);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMImplementation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXTLRuntime interface
 */
#ifndef __IXTLRuntime_INTERFACE_DEFINED__
#define __IXTLRuntime_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXTLRuntime, 0x3efaa425, 0x272f, 0x11d2, 0x83,0x6f, 0x00,0x00,0xf8,0x7a,0x77,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3efaa425-272f-11d2-836f-0000f87a7782")
IXTLRuntime : public IXMLDOMNode
{
    virtual HRESULT STDMETHODCALLTYPE uniqueID(
        IXMLDOMNode *pNode,
        LONG *pID) = 0;

    virtual HRESULT STDMETHODCALLTYPE depth(
        IXMLDOMNode *pNode,
        LONG *pDepth) = 0;

    virtual HRESULT STDMETHODCALLTYPE childNumber(
        IXMLDOMNode *pNode,
        LONG *pNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE ancestorChildNumber(
        BSTR bstr,
        IXMLDOMNode *pNode,
        LONG *pNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE absoluteChildNumber(
        IXMLDOMNode *pNode,
        LONG *pNumber) = 0;

    virtual HRESULT STDMETHODCALLTYPE formatIndex(
        LONG lIndex,
        BSTR bstr,
        BSTR *pbstr) = 0;

    virtual HRESULT STDMETHODCALLTYPE formatNumber(
        double dblNumber,
        BSTR bstr,
        BSTR *pbstr) = 0;

    virtual HRESULT STDMETHODCALLTYPE formatDate(
        VARIANT var1,
        BSTR bstr,
        VARIANT var2,
        BSTR *pbstr) = 0;

    virtual HRESULT STDMETHODCALLTYPE formatTime(
        VARIANT var1,
        BSTR bstr,
        VARIANT var2,
        BSTR *pbstr) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXTLRuntime, 0x3efaa425, 0x272f, 0x11d2, 0x83,0x6f, 0x00,0x00,0xf8,0x7a,0x77,0x82)
#endif
#else
typedef struct IXTLRuntimeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXTLRuntime *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXTLRuntime *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXTLRuntime *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXTLRuntime *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXTLRuntime *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXTLRuntime *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXTLRuntime *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_nodeName)(
        IXTLRuntime *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_nodeValue)(
        IXTLRuntime *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeValue)(
        IXTLRuntime *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_nodeType)(
        IXTLRuntime *This,
        DOMNodeType *domNodeType);

    HRESULT (STDMETHODCALLTYPE *get_parentNode)(
        IXTLRuntime *This,
        IXMLDOMNode **parent);

    HRESULT (STDMETHODCALLTYPE *get_childNodes)(
        IXTLRuntime *This,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *get_firstChild)(
        IXTLRuntime *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_lastChild)(
        IXTLRuntime *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_previousSibling)(
        IXTLRuntime *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nextSibling)(
        IXTLRuntime *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        IXTLRuntime *This,
        IXMLDOMNamedNodeMap **attributeMap);

    HRESULT (STDMETHODCALLTYPE *insertBefore)(
        IXTLRuntime *This,
        IXMLDOMNode *newNode,
        VARIANT var1,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *replaceChild)(
        IXTLRuntime *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode *oldNode,
        IXMLDOMNode **outOldNode);

    HRESULT (STDMETHODCALLTYPE *removeChild)(
        IXTLRuntime *This,
        IXMLDOMNode *domNode,
        IXMLDOMNode **oldNode);

    HRESULT (STDMETHODCALLTYPE *appendChild)(
        IXTLRuntime *This,
        IXMLDOMNode *newNode,
        IXMLDOMNode **outNewNode);

    HRESULT (STDMETHODCALLTYPE *hasChildNodes)(
        IXTLRuntime *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_ownerDocument)(
        IXTLRuntime *This,
        IXMLDOMDocument **domDocument);

    HRESULT (STDMETHODCALLTYPE *cloneNode)(
        IXTLRuntime *This,
        VARIANT_BOOL pbool,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypeString)(
        IXTLRuntime *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_text)(
        IXTLRuntime *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *put_text)(
        IXTLRuntime *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_specified)(
        IXTLRuntime *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_definition)(
        IXTLRuntime *This,
        IXMLDOMNode **domNode);

    HRESULT (STDMETHODCALLTYPE *get_nodeTypedValue)(
        IXTLRuntime *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_nodeTypedValue)(
        IXTLRuntime *This,
        VARIANT var1);

    HRESULT (STDMETHODCALLTYPE *get_dataType)(
        IXTLRuntime *This,
        VARIANT *var1);

    HRESULT (STDMETHODCALLTYPE *put_dataType)(
        IXTLRuntime *This,
        BSTR p);

    HRESULT (STDMETHODCALLTYPE *get_xml)(
        IXTLRuntime *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNode)(
        IXTLRuntime *This,
        IXMLDOMNode *domNode,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *selectNodes)(
        IXTLRuntime *This,
        BSTR p,
        IXMLDOMNodeList **outList);

    HRESULT (STDMETHODCALLTYPE *selectSingleNode)(
        IXTLRuntime *This,
        BSTR p,
        IXMLDOMNode **outNode);

    HRESULT (STDMETHODCALLTYPE *get_parsed)(
        IXTLRuntime *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        IXTLRuntime *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_prefix)(
        IXTLRuntime *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_baseName)(
        IXTLRuntime *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *transformNodeToObject)(
        IXTLRuntime *This,
        IXMLDOMNode *domNode,
        VARIANT var1);

    /*** IXTLRuntime methods ***/
    HRESULT (STDMETHODCALLTYPE *uniqueID)(
        IXTLRuntime *This,
        IXMLDOMNode *pNode,
        LONG *pID);

    HRESULT (STDMETHODCALLTYPE *depth)(
        IXTLRuntime *This,
        IXMLDOMNode *pNode,
        LONG *pDepth);

    HRESULT (STDMETHODCALLTYPE *childNumber)(
        IXTLRuntime *This,
        IXMLDOMNode *pNode,
        LONG *pNumber);

    HRESULT (STDMETHODCALLTYPE *ancestorChildNumber)(
        IXTLRuntime *This,
        BSTR bstr,
        IXMLDOMNode *pNode,
        LONG *pNumber);

    HRESULT (STDMETHODCALLTYPE *absoluteChildNumber)(
        IXTLRuntime *This,
        IXMLDOMNode *pNode,
        LONG *pNumber);

    HRESULT (STDMETHODCALLTYPE *formatIndex)(
        IXTLRuntime *This,
        LONG lIndex,
        BSTR bstr,
        BSTR *pbstr);

    HRESULT (STDMETHODCALLTYPE *formatNumber)(
        IXTLRuntime *This,
        double dblNumber,
        BSTR bstr,
        BSTR *pbstr);

    HRESULT (STDMETHODCALLTYPE *formatDate)(
        IXTLRuntime *This,
        VARIANT var1,
        BSTR bstr,
        VARIANT var2,
        BSTR *pbstr);

    HRESULT (STDMETHODCALLTYPE *formatTime)(
        IXTLRuntime *This,
        VARIANT var1,
        BSTR bstr,
        VARIANT var2,
        BSTR *pbstr);

    END_INTERFACE
} IXTLRuntimeVtbl;

interface IXTLRuntime {
    CONST_VTBL IXTLRuntimeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXTLRuntime_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXTLRuntime_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXTLRuntime_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXTLRuntime_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXTLRuntime_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXTLRuntime_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXTLRuntime_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMNode methods ***/
#define IXTLRuntime_get_nodeName(This,p) (This)->lpVtbl->get_nodeName(This,p)
#define IXTLRuntime_get_nodeValue(This,var1) (This)->lpVtbl->get_nodeValue(This,var1)
#define IXTLRuntime_put_nodeValue(This,var1) (This)->lpVtbl->put_nodeValue(This,var1)
#define IXTLRuntime_get_nodeType(This,domNodeType) (This)->lpVtbl->get_nodeType(This,domNodeType)
#define IXTLRuntime_get_parentNode(This,parent) (This)->lpVtbl->get_parentNode(This,parent)
#define IXTLRuntime_get_childNodes(This,outList) (This)->lpVtbl->get_childNodes(This,outList)
#define IXTLRuntime_get_firstChild(This,domNode) (This)->lpVtbl->get_firstChild(This,domNode)
#define IXTLRuntime_get_lastChild(This,domNode) (This)->lpVtbl->get_lastChild(This,domNode)
#define IXTLRuntime_get_previousSibling(This,domNode) (This)->lpVtbl->get_previousSibling(This,domNode)
#define IXTLRuntime_get_nextSibling(This,domNode) (This)->lpVtbl->get_nextSibling(This,domNode)
#define IXTLRuntime_get_attributes(This,attributeMap) (This)->lpVtbl->get_attributes(This,attributeMap)
#define IXTLRuntime_insertBefore(This,newNode,var1,outOldNode) (This)->lpVtbl->insertBefore(This,newNode,var1,outOldNode)
#define IXTLRuntime_replaceChild(This,newNode,oldNode,outOldNode) (This)->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode)
#define IXTLRuntime_removeChild(This,domNode,oldNode) (This)->lpVtbl->removeChild(This,domNode,oldNode)
#define IXTLRuntime_appendChild(This,newNode,outNewNode) (This)->lpVtbl->appendChild(This,newNode,outNewNode)
#define IXTLRuntime_hasChildNodes(This,pbool) (This)->lpVtbl->hasChildNodes(This,pbool)
#define IXTLRuntime_get_ownerDocument(This,domDocument) (This)->lpVtbl->get_ownerDocument(This,domDocument)
#define IXTLRuntime_cloneNode(This,pbool,outNode) (This)->lpVtbl->cloneNode(This,pbool,outNode)
#define IXTLRuntime_get_nodeTypeString(This,p) (This)->lpVtbl->get_nodeTypeString(This,p)
#define IXTLRuntime_get_text(This,p) (This)->lpVtbl->get_text(This,p)
#define IXTLRuntime_put_text(This,p) (This)->lpVtbl->put_text(This,p)
#define IXTLRuntime_get_specified(This,pbool) (This)->lpVtbl->get_specified(This,pbool)
#define IXTLRuntime_get_definition(This,domNode) (This)->lpVtbl->get_definition(This,domNode)
#define IXTLRuntime_get_nodeTypedValue(This,var1) (This)->lpVtbl->get_nodeTypedValue(This,var1)
#define IXTLRuntime_put_nodeTypedValue(This,var1) (This)->lpVtbl->put_nodeTypedValue(This,var1)
#define IXTLRuntime_get_dataType(This,var1) (This)->lpVtbl->get_dataType(This,var1)
#define IXTLRuntime_put_dataType(This,p) (This)->lpVtbl->put_dataType(This,p)
#define IXTLRuntime_get_xml(This,p) (This)->lpVtbl->get_xml(This,p)
#define IXTLRuntime_transformNode(This,domNode,p) (This)->lpVtbl->transformNode(This,domNode,p)
#define IXTLRuntime_selectNodes(This,p,outList) (This)->lpVtbl->selectNodes(This,p,outList)
#define IXTLRuntime_selectSingleNode(This,p,outNode) (This)->lpVtbl->selectSingleNode(This,p,outNode)
#define IXTLRuntime_get_parsed(This,pbool) (This)->lpVtbl->get_parsed(This,pbool)
#define IXTLRuntime_get_namespaceURI(This,p) (This)->lpVtbl->get_namespaceURI(This,p)
#define IXTLRuntime_get_prefix(This,p) (This)->lpVtbl->get_prefix(This,p)
#define IXTLRuntime_get_baseName(This,p) (This)->lpVtbl->get_baseName(This,p)
#define IXTLRuntime_transformNodeToObject(This,domNode,var1) (This)->lpVtbl->transformNodeToObject(This,domNode,var1)
/*** IXTLRuntime methods ***/
#define IXTLRuntime_uniqueID(This,pNode,pID) (This)->lpVtbl->uniqueID(This,pNode,pID)
#define IXTLRuntime_depth(This,pNode,pDepth) (This)->lpVtbl->depth(This,pNode,pDepth)
#define IXTLRuntime_childNumber(This,pNode,pNumber) (This)->lpVtbl->childNumber(This,pNode,pNumber)
#define IXTLRuntime_ancestorChildNumber(This,bstr,pNode,pNumber) (This)->lpVtbl->ancestorChildNumber(This,bstr,pNode,pNumber)
#define IXTLRuntime_absoluteChildNumber(This,pNode,pNumber) (This)->lpVtbl->absoluteChildNumber(This,pNode,pNumber)
#define IXTLRuntime_formatIndex(This,lIndex,bstr,pbstr) (This)->lpVtbl->formatIndex(This,lIndex,bstr,pbstr)
#define IXTLRuntime_formatNumber(This,dblNumber,bstr,pbstr) (This)->lpVtbl->formatNumber(This,dblNumber,bstr,pbstr)
#define IXTLRuntime_formatDate(This,var1,bstr,var2,pbstr) (This)->lpVtbl->formatDate(This,var1,bstr,var2,pbstr)
#define IXTLRuntime_formatTime(This,var1,bstr,var2,pbstr) (This)->lpVtbl->formatTime(This,var1,bstr,var2,pbstr)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXTLRuntime_QueryInterface(IXTLRuntime* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXTLRuntime_AddRef(IXTLRuntime* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXTLRuntime_Release(IXTLRuntime* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXTLRuntime_GetTypeInfoCount(IXTLRuntime* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXTLRuntime_GetTypeInfo(IXTLRuntime* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXTLRuntime_GetIDsOfNames(IXTLRuntime* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXTLRuntime_Invoke(IXTLRuntime* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMNode methods ***/
static __WIDL_INLINE HRESULT IXTLRuntime_get_nodeName(IXTLRuntime* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_nodeValue(IXTLRuntime* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXTLRuntime_put_nodeValue(IXTLRuntime* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_nodeType(IXTLRuntime* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_parentNode(IXTLRuntime* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_childNodes(IXTLRuntime* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_firstChild(IXTLRuntime* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_lastChild(IXTLRuntime* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_previousSibling(IXTLRuntime* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_nextSibling(IXTLRuntime* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_attributes(IXTLRuntime* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static __WIDL_INLINE HRESULT IXTLRuntime_insertBefore(IXTLRuntime* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static __WIDL_INLINE HRESULT IXTLRuntime_replaceChild(IXTLRuntime* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static __WIDL_INLINE HRESULT IXTLRuntime_removeChild(IXTLRuntime* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static __WIDL_INLINE HRESULT IXTLRuntime_appendChild(IXTLRuntime* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static __WIDL_INLINE HRESULT IXTLRuntime_hasChildNodes(IXTLRuntime* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_ownerDocument(IXTLRuntime* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static __WIDL_INLINE HRESULT IXTLRuntime_cloneNode(IXTLRuntime* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_nodeTypeString(IXTLRuntime* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_text(IXTLRuntime* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static __WIDL_INLINE HRESULT IXTLRuntime_put_text(IXTLRuntime* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_specified(IXTLRuntime* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_definition(IXTLRuntime* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_nodeTypedValue(IXTLRuntime* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXTLRuntime_put_nodeTypedValue(IXTLRuntime* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_dataType(IXTLRuntime* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static __WIDL_INLINE HRESULT IXTLRuntime_put_dataType(IXTLRuntime* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_xml(IXTLRuntime* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static __WIDL_INLINE HRESULT IXTLRuntime_transformNode(IXTLRuntime* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static __WIDL_INLINE HRESULT IXTLRuntime_selectNodes(IXTLRuntime* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static __WIDL_INLINE HRESULT IXTLRuntime_selectSingleNode(IXTLRuntime* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_parsed(IXTLRuntime* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_namespaceURI(IXTLRuntime* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_prefix(IXTLRuntime* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static __WIDL_INLINE HRESULT IXTLRuntime_get_baseName(IXTLRuntime* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static __WIDL_INLINE HRESULT IXTLRuntime_transformNodeToObject(IXTLRuntime* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXTLRuntime methods ***/
static __WIDL_INLINE HRESULT IXTLRuntime_uniqueID(IXTLRuntime* This,IXMLDOMNode *pNode,LONG *pID) {
    return This->lpVtbl->uniqueID(This,pNode,pID);
}
static __WIDL_INLINE HRESULT IXTLRuntime_depth(IXTLRuntime* This,IXMLDOMNode *pNode,LONG *pDepth) {
    return This->lpVtbl->depth(This,pNode,pDepth);
}
static __WIDL_INLINE HRESULT IXTLRuntime_childNumber(IXTLRuntime* This,IXMLDOMNode *pNode,LONG *pNumber) {
    return This->lpVtbl->childNumber(This,pNode,pNumber);
}
static __WIDL_INLINE HRESULT IXTLRuntime_ancestorChildNumber(IXTLRuntime* This,BSTR bstr,IXMLDOMNode *pNode,LONG *pNumber) {
    return This->lpVtbl->ancestorChildNumber(This,bstr,pNode,pNumber);
}
static __WIDL_INLINE HRESULT IXTLRuntime_absoluteChildNumber(IXTLRuntime* This,IXMLDOMNode *pNode,LONG *pNumber) {
    return This->lpVtbl->absoluteChildNumber(This,pNode,pNumber);
}
static __WIDL_INLINE HRESULT IXTLRuntime_formatIndex(IXTLRuntime* This,LONG lIndex,BSTR bstr,BSTR *pbstr) {
    return This->lpVtbl->formatIndex(This,lIndex,bstr,pbstr);
}
static __WIDL_INLINE HRESULT IXTLRuntime_formatNumber(IXTLRuntime* This,double dblNumber,BSTR bstr,BSTR *pbstr) {
    return This->lpVtbl->formatNumber(This,dblNumber,bstr,pbstr);
}
static __WIDL_INLINE HRESULT IXTLRuntime_formatDate(IXTLRuntime* This,VARIANT var1,BSTR bstr,VARIANT var2,BSTR *pbstr) {
    return This->lpVtbl->formatDate(This,var1,bstr,var2,pbstr);
}
static __WIDL_INLINE HRESULT IXTLRuntime_formatTime(IXTLRuntime* This,VARIANT var1,BSTR bstr,VARIANT var2,BSTR *pbstr) {
    return This->lpVtbl->formatTime(This,var1,bstr,var2,pbstr);
}
#endif
#endif

#endif


#endif  /* __IXTLRuntime_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDSOControl interface
 */
#ifndef __IDSOControl_INTERFACE_DEFINED__
#define __IDSOControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDSOControl, 0x310afa62, 0x0575, 0x11d2, 0x9c,0xa9, 0x00,0x60,0xb0,0xec,0x3d,0x39);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("310afa62-0575-11d2-9ca9-0060b0ec3d39")
IDSOControl : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_XMLDocument(
        IXMLDOMDocument **ppDoc) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_XMLDocument(
        IXMLDOMDocument *ppDoc) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_JavaDSOCompatible(
        WINBOOL *fJavaDSOCompatible) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_JavaDSOCompatible(
        WINBOOL fJavaDSOCompatible) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        LONG *state) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDSOControl, 0x310afa62, 0x0575, 0x11d2, 0x9c,0xa9, 0x00,0x60,0xb0,0xec,0x3d,0x39)
#endif
#else
typedef struct IDSOControlVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IDSOControl *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IDSOControl *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IDSOControl *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IDSOControl *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IDSOControl *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IDSOControl *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IDSOControl *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IDSOControl methods ***/
    HRESULT (STDMETHODCALLTYPE *get_XMLDocument)(
        IDSOControl *This,
        IXMLDOMDocument **ppDoc);

    HRESULT (STDMETHODCALLTYPE *put_XMLDocument)(
        IDSOControl *This,
        IXMLDOMDocument *ppDoc);

    HRESULT (STDMETHODCALLTYPE *get_JavaDSOCompatible)(
        IDSOControl *This,
        WINBOOL *fJavaDSOCompatible);

    HRESULT (STDMETHODCALLTYPE *put_JavaDSOCompatible)(
        IDSOControl *This,
        WINBOOL fJavaDSOCompatible);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IDSOControl *This,
        LONG *state);

    END_INTERFACE
} IDSOControlVtbl;

interface IDSOControl {
    CONST_VTBL IDSOControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDSOControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDSOControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDSOControl_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDSOControl_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDSOControl_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDSOControl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDSOControl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDSOControl methods ***/
#define IDSOControl_get_XMLDocument(This,ppDoc) (This)->lpVtbl->get_XMLDocument(This,ppDoc)
#define IDSOControl_put_XMLDocument(This,ppDoc) (This)->lpVtbl->put_XMLDocument(This,ppDoc)
#define IDSOControl_get_JavaDSOCompatible(This,fJavaDSOCompatible) (This)->lpVtbl->get_JavaDSOCompatible(This,fJavaDSOCompatible)
#define IDSOControl_put_JavaDSOCompatible(This,fJavaDSOCompatible) (This)->lpVtbl->put_JavaDSOCompatible(This,fJavaDSOCompatible)
#define IDSOControl_get_readyState(This,state) (This)->lpVtbl->get_readyState(This,state)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IDSOControl_QueryInterface(IDSOControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IDSOControl_AddRef(IDSOControl* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IDSOControl_Release(IDSOControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IDSOControl_GetTypeInfoCount(IDSOControl* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IDSOControl_GetTypeInfo(IDSOControl* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IDSOControl_GetIDsOfNames(IDSOControl* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IDSOControl_Invoke(IDSOControl* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IDSOControl methods ***/
static __WIDL_INLINE HRESULT IDSOControl_get_XMLDocument(IDSOControl* This,IXMLDOMDocument **ppDoc) {
    return This->lpVtbl->get_XMLDocument(This,ppDoc);
}
static __WIDL_INLINE HRESULT IDSOControl_put_XMLDocument(IDSOControl* This,IXMLDOMDocument *ppDoc) {
    return This->lpVtbl->put_XMLDocument(This,ppDoc);
}
static __WIDL_INLINE HRESULT IDSOControl_get_JavaDSOCompatible(IDSOControl* This,WINBOOL *fJavaDSOCompatible) {
    return This->lpVtbl->get_JavaDSOCompatible(This,fJavaDSOCompatible);
}
static __WIDL_INLINE HRESULT IDSOControl_put_JavaDSOCompatible(IDSOControl* This,WINBOOL fJavaDSOCompatible) {
    return This->lpVtbl->put_JavaDSOCompatible(This,fJavaDSOCompatible);
}
static __WIDL_INLINE HRESULT IDSOControl_get_readyState(IDSOControl* This,LONG *state) {
    return This->lpVtbl->get_readyState(This,state);
}
#endif
#endif

#endif


#endif  /* __IDSOControl_INTERFACE_DEFINED__ */

/*****************************************************************************
 * XMLDOMDocumentEvents dispinterface
 */
#ifndef __XMLDOMDocumentEvents_DISPINTERFACE_DEFINED__
#define __XMLDOMDocumentEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_XMLDOMDocumentEvents, 0x3efaa427, 0x272f, 0x11d2, 0x83,0x6f, 0x00,0x00,0xf8,0x7a,0x77,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3efaa427-272f-11d2-836f-0000f87a7782")
XMLDOMDocumentEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLDOMDocumentEvents, 0x3efaa427, 0x272f, 0x11d2, 0x83,0x6f, 0x00,0x00,0xf8,0x7a,0x77,0x82)
#endif
#else
typedef struct XMLDOMDocumentEventsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        XMLDOMDocumentEvents *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        XMLDOMDocumentEvents *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        XMLDOMDocumentEvents *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        XMLDOMDocumentEvents *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        XMLDOMDocumentEvents *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        XMLDOMDocumentEvents *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        XMLDOMDocumentEvents *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    END_INTERFACE
} XMLDOMDocumentEventsVtbl;

interface XMLDOMDocumentEvents {
    CONST_VTBL XMLDOMDocumentEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define XMLDOMDocumentEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define XMLDOMDocumentEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define XMLDOMDocumentEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define XMLDOMDocumentEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define XMLDOMDocumentEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define XMLDOMDocumentEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define XMLDOMDocumentEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT XMLDOMDocumentEvents_QueryInterface(XMLDOMDocumentEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG XMLDOMDocumentEvents_AddRef(XMLDOMDocumentEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG XMLDOMDocumentEvents_Release(XMLDOMDocumentEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT XMLDOMDocumentEvents_GetTypeInfoCount(XMLDOMDocumentEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT XMLDOMDocumentEvents_GetTypeInfo(XMLDOMDocumentEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT XMLDOMDocumentEvents_GetIDsOfNames(XMLDOMDocumentEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT XMLDOMDocumentEvents_Invoke(XMLDOMDocumentEvents* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
#endif
#endif

#endif

#endif  /* __XMLDOMDocumentEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * IXSLProcessor interface
 */
#ifndef __IXSLProcessor_INTERFACE_DEFINED__
#define __IXSLProcessor_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXSLProcessor, 0x2933bf92, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf92-7b36-11d2-b20e-00c04f983e60")
IXSLProcessor : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_input(
        VARIANT var) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_input(
        VARIANT *var) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ownerTemplate(
        IXSLTemplate **ppTemplate) = 0;

    virtual HRESULT STDMETHODCALLTYPE setStartMode(
        BSTR p,
        BSTR uri = L"") = 0;

    virtual HRESULT STDMETHODCALLTYPE get_startMode(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_startModeURI(
        BSTR *uri) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_output(
        VARIANT var) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_output(
        VARIANT *var) = 0;

    virtual HRESULT STDMETHODCALLTYPE transform(
        VARIANT_BOOL *pbool) = 0;

    virtual HRESULT STDMETHODCALLTYPE reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        LONG *pstate) = 0;

    virtual HRESULT STDMETHODCALLTYPE addParameter(
        BSTR p,
        VARIANT var,
        BSTR uri = L"") = 0;

    virtual HRESULT STDMETHODCALLTYPE addObject(
        IDispatch *obj,
        BSTR uri) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_stylesheet(
        IXMLDOMNode **node) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXSLProcessor, 0x2933bf92, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXSLProcessorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXSLProcessor *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXSLProcessor *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXSLProcessor *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXSLProcessor *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXSLProcessor *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXSLProcessor *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXSLProcessor *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXSLProcessor methods ***/
    HRESULT (STDMETHODCALLTYPE *put_input)(
        IXSLProcessor *This,
        VARIANT var);

    HRESULT (STDMETHODCALLTYPE *get_input)(
        IXSLProcessor *This,
        VARIANT *var);

    HRESULT (STDMETHODCALLTYPE *get_ownerTemplate)(
        IXSLProcessor *This,
        IXSLTemplate **ppTemplate);

    HRESULT (STDMETHODCALLTYPE *setStartMode)(
        IXSLProcessor *This,
        BSTR p,
        BSTR uri);

    HRESULT (STDMETHODCALLTYPE *get_startMode)(
        IXSLProcessor *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_startModeURI)(
        IXSLProcessor *This,
        BSTR *uri);

    HRESULT (STDMETHODCALLTYPE *put_output)(
        IXSLProcessor *This,
        VARIANT var);

    HRESULT (STDMETHODCALLTYPE *get_output)(
        IXSLProcessor *This,
        VARIANT *var);

    HRESULT (STDMETHODCALLTYPE *transform)(
        IXSLProcessor *This,
        VARIANT_BOOL *pbool);

    HRESULT (STDMETHODCALLTYPE *reset)(
        IXSLProcessor *This);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IXSLProcessor *This,
        LONG *pstate);

    HRESULT (STDMETHODCALLTYPE *addParameter)(
        IXSLProcessor *This,
        BSTR p,
        VARIANT var,
        BSTR uri);

    HRESULT (STDMETHODCALLTYPE *addObject)(
        IXSLProcessor *This,
        IDispatch *obj,
        BSTR uri);

    HRESULT (STDMETHODCALLTYPE *get_stylesheet)(
        IXSLProcessor *This,
        IXMLDOMNode **node);

    END_INTERFACE
} IXSLProcessorVtbl;

interface IXSLProcessor {
    CONST_VTBL IXSLProcessorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXSLProcessor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXSLProcessor_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXSLProcessor_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXSLProcessor_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXSLProcessor_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXSLProcessor_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXSLProcessor_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXSLProcessor methods ***/
#define IXSLProcessor_put_input(This,var) (This)->lpVtbl->put_input(This,var)
#define IXSLProcessor_get_input(This,var) (This)->lpVtbl->get_input(This,var)
#define IXSLProcessor_get_ownerTemplate(This,ppTemplate) (This)->lpVtbl->get_ownerTemplate(This,ppTemplate)
#define IXSLProcessor_setStartMode(This,p,uri) (This)->lpVtbl->setStartMode(This,p,uri)
#define IXSLProcessor_get_startMode(This,p) (This)->lpVtbl->get_startMode(This,p)
#define IXSLProcessor_get_startModeURI(This,uri) (This)->lpVtbl->get_startModeURI(This,uri)
#define IXSLProcessor_put_output(This,var) (This)->lpVtbl->put_output(This,var)
#define IXSLProcessor_get_output(This,var) (This)->lpVtbl->get_output(This,var)
#define IXSLProcessor_transform(This,pbool) (This)->lpVtbl->transform(This,pbool)
#define IXSLProcessor_reset(This) (This)->lpVtbl->reset(This)
#define IXSLProcessor_get_readyState(This,pstate) (This)->lpVtbl->get_readyState(This,pstate)
#define IXSLProcessor_addParameter(This,p,var,uri) (This)->lpVtbl->addParameter(This,p,var,uri)
#define IXSLProcessor_addObject(This,obj,uri) (This)->lpVtbl->addObject(This,obj,uri)
#define IXSLProcessor_get_stylesheet(This,node) (This)->lpVtbl->get_stylesheet(This,node)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXSLProcessor_QueryInterface(IXSLProcessor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXSLProcessor_AddRef(IXSLProcessor* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXSLProcessor_Release(IXSLProcessor* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXSLProcessor_GetTypeInfoCount(IXSLProcessor* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXSLProcessor_GetTypeInfo(IXSLProcessor* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXSLProcessor_GetIDsOfNames(IXSLProcessor* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXSLProcessor_Invoke(IXSLProcessor* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXSLProcessor methods ***/
static __WIDL_INLINE HRESULT IXSLProcessor_put_input(IXSLProcessor* This,VARIANT var) {
    return This->lpVtbl->put_input(This,var);
}
static __WIDL_INLINE HRESULT IXSLProcessor_get_input(IXSLProcessor* This,VARIANT *var) {
    return This->lpVtbl->get_input(This,var);
}
static __WIDL_INLINE HRESULT IXSLProcessor_get_ownerTemplate(IXSLProcessor* This,IXSLTemplate **ppTemplate) {
    return This->lpVtbl->get_ownerTemplate(This,ppTemplate);
}
static __WIDL_INLINE HRESULT IXSLProcessor_setStartMode(IXSLProcessor* This,BSTR p,BSTR uri) {
    return This->lpVtbl->setStartMode(This,p,uri);
}
static __WIDL_INLINE HRESULT IXSLProcessor_get_startMode(IXSLProcessor* This,BSTR *p) {
    return This->lpVtbl->get_startMode(This,p);
}
static __WIDL_INLINE HRESULT IXSLProcessor_get_startModeURI(IXSLProcessor* This,BSTR *uri) {
    return This->lpVtbl->get_startModeURI(This,uri);
}
static __WIDL_INLINE HRESULT IXSLProcessor_put_output(IXSLProcessor* This,VARIANT var) {
    return This->lpVtbl->put_output(This,var);
}
static __WIDL_INLINE HRESULT IXSLProcessor_get_output(IXSLProcessor* This,VARIANT *var) {
    return This->lpVtbl->get_output(This,var);
}
static __WIDL_INLINE HRESULT IXSLProcessor_transform(IXSLProcessor* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->transform(This,pbool);
}
static __WIDL_INLINE HRESULT IXSLProcessor_reset(IXSLProcessor* This) {
    return This->lpVtbl->reset(This);
}
static __WIDL_INLINE HRESULT IXSLProcessor_get_readyState(IXSLProcessor* This,LONG *pstate) {
    return This->lpVtbl->get_readyState(This,pstate);
}
static __WIDL_INLINE HRESULT IXSLProcessor_addParameter(IXSLProcessor* This,BSTR p,VARIANT var,BSTR uri) {
    return This->lpVtbl->addParameter(This,p,var,uri);
}
static __WIDL_INLINE HRESULT IXSLProcessor_addObject(IXSLProcessor* This,IDispatch *obj,BSTR uri) {
    return This->lpVtbl->addObject(This,obj,uri);
}
static __WIDL_INLINE HRESULT IXSLProcessor_get_stylesheet(IXSLProcessor* This,IXMLDOMNode **node) {
    return This->lpVtbl->get_stylesheet(This,node);
}
#endif
#endif

#endif


#endif  /* __IXSLProcessor_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXSLTemplate interface
 */
#ifndef __IXSLTemplate_INTERFACE_DEFINED__
#define __IXSLTemplate_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXSLTemplate, 0x2933bf93, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2933bf93-7b36-11d2-b20e-00c04f983e60")
IXSLTemplate : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_stylesheet(
        IXMLDOMNode *node) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_stylesheet(
        IXMLDOMNode **node) = 0;

    virtual HRESULT STDMETHODCALLTYPE createProcessor(
        IXSLProcessor **ppProcessor) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXSLTemplate, 0x2933bf93, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#else
typedef struct IXSLTemplateVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXSLTemplate *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXSLTemplate *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXSLTemplate *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXSLTemplate *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXSLTemplate *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXSLTemplate *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXSLTemplate *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXSLTemplate methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_stylesheet)(
        IXSLTemplate *This,
        IXMLDOMNode *node);

    HRESULT (STDMETHODCALLTYPE *get_stylesheet)(
        IXSLTemplate *This,
        IXMLDOMNode **node);

    HRESULT (STDMETHODCALLTYPE *createProcessor)(
        IXSLTemplate *This,
        IXSLProcessor **ppProcessor);

    END_INTERFACE
} IXSLTemplateVtbl;

interface IXSLTemplate {
    CONST_VTBL IXSLTemplateVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXSLTemplate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXSLTemplate_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXSLTemplate_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXSLTemplate_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXSLTemplate_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXSLTemplate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXSLTemplate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXSLTemplate methods ***/
#define IXSLTemplate_putref_stylesheet(This,node) (This)->lpVtbl->putref_stylesheet(This,node)
#define IXSLTemplate_get_stylesheet(This,node) (This)->lpVtbl->get_stylesheet(This,node)
#define IXSLTemplate_createProcessor(This,ppProcessor) (This)->lpVtbl->createProcessor(This,ppProcessor)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXSLTemplate_QueryInterface(IXSLTemplate* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXSLTemplate_AddRef(IXSLTemplate* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXSLTemplate_Release(IXSLTemplate* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXSLTemplate_GetTypeInfoCount(IXSLTemplate* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXSLTemplate_GetTypeInfo(IXSLTemplate* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXSLTemplate_GetIDsOfNames(IXSLTemplate* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXSLTemplate_Invoke(IXSLTemplate* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXSLTemplate methods ***/
static __WIDL_INLINE HRESULT IXSLTemplate_putref_stylesheet(IXSLTemplate* This,IXMLDOMNode *node) {
    return This->lpVtbl->putref_stylesheet(This,node);
}
static __WIDL_INLINE HRESULT IXSLTemplate_get_stylesheet(IXSLTemplate* This,IXMLDOMNode **node) {
    return This->lpVtbl->get_stylesheet(This,node);
}
static __WIDL_INLINE HRESULT IXSLTemplate_createProcessor(IXSLTemplate* This,IXSLProcessor **ppProcessor) {
    return This->lpVtbl->createProcessor(This,ppProcessor);
}
#endif
#endif

#endif


#endif  /* __IXSLTemplate_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLHTTPRequest interface
 */
#ifndef __IXMLHTTPRequest_INTERFACE_DEFINED__
#define __IXMLHTTPRequest_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLHTTPRequest, 0xed8c108d, 0x4349, 0x11d2, 0x91,0xa4, 0x00,0xc0,0x4f,0x79,0x69,0xe8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ed8c108d-4349-11d2-91a4-00c04f7969e8")
IXMLHTTPRequest : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE open(
        BSTR bstrMethod,
        BSTR bstrUrl,
        VARIANT varAsync,
        VARIANT username,
        VARIANT password) = 0;

    virtual HRESULT STDMETHODCALLTYPE setRequestHeader(
        BSTR bstrHeader,
        BSTR bstrValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE getResponseHeader(
        BSTR bstrHeader,
        BSTR *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAllResponseHeaders(
        BSTR *pbstrHeaders) = 0;

    virtual HRESULT STDMETHODCALLTYPE send(
        VARIANT body) = 0;

    virtual HRESULT STDMETHODCALLTYPE abort(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_status(
        LONG *pStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_statusText(
        BSTR *pStatus) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_responseXML(
        IDispatch **pBody) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_responseText(
        BSTR *pBody) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_responseBody(
        VARIANT *pBody) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_responseStream(
        VARIANT *pBody) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_readyState(
        LONG *pState) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_onreadystatechange(
        IDispatch *pReadyStateSink) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLHTTPRequest, 0xed8c108d, 0x4349, 0x11d2, 0x91,0xa4, 0x00,0xc0,0x4f,0x79,0x69,0xe8)
#endif
#else
typedef struct IXMLHTTPRequestVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLHTTPRequest *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLHTTPRequest *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLHTTPRequest *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLHTTPRequest *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLHTTPRequest *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLHTTPRequest *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLHTTPRequest *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLHTTPRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *open)(
        IXMLHTTPRequest *This,
        BSTR bstrMethod,
        BSTR bstrUrl,
        VARIANT varAsync,
        VARIANT username,
        VARIANT password);

    HRESULT (STDMETHODCALLTYPE *setRequestHeader)(
        IXMLHTTPRequest *This,
        BSTR bstrHeader,
        BSTR bstrValue);

    HRESULT (STDMETHODCALLTYPE *getResponseHeader)(
        IXMLHTTPRequest *This,
        BSTR bstrHeader,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *getAllResponseHeaders)(
        IXMLHTTPRequest *This,
        BSTR *pbstrHeaders);

    HRESULT (STDMETHODCALLTYPE *send)(
        IXMLHTTPRequest *This,
        VARIANT body);

    HRESULT (STDMETHODCALLTYPE *abort)(
        IXMLHTTPRequest *This);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IXMLHTTPRequest *This,
        LONG *pStatus);

    HRESULT (STDMETHODCALLTYPE *get_statusText)(
        IXMLHTTPRequest *This,
        BSTR *pStatus);

    HRESULT (STDMETHODCALLTYPE *get_responseXML)(
        IXMLHTTPRequest *This,
        IDispatch **pBody);

    HRESULT (STDMETHODCALLTYPE *get_responseText)(
        IXMLHTTPRequest *This,
        BSTR *pBody);

    HRESULT (STDMETHODCALLTYPE *get_responseBody)(
        IXMLHTTPRequest *This,
        VARIANT *pBody);

    HRESULT (STDMETHODCALLTYPE *get_responseStream)(
        IXMLHTTPRequest *This,
        VARIANT *pBody);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IXMLHTTPRequest *This,
        LONG *pState);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IXMLHTTPRequest *This,
        IDispatch *pReadyStateSink);

    END_INTERFACE
} IXMLHTTPRequestVtbl;

interface IXMLHTTPRequest {
    CONST_VTBL IXMLHTTPRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLHTTPRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLHTTPRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLHTTPRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLHTTPRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLHTTPRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLHTTPRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLHTTPRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLHTTPRequest methods ***/
#define IXMLHTTPRequest_open(This,bstrMethod,bstrUrl,varAsync,username,password) (This)->lpVtbl->open(This,bstrMethod,bstrUrl,varAsync,username,password)
#define IXMLHTTPRequest_setRequestHeader(This,bstrHeader,bstrValue) (This)->lpVtbl->setRequestHeader(This,bstrHeader,bstrValue)
#define IXMLHTTPRequest_getResponseHeader(This,bstrHeader,value) (This)->lpVtbl->getResponseHeader(This,bstrHeader,value)
#define IXMLHTTPRequest_getAllResponseHeaders(This,pbstrHeaders) (This)->lpVtbl->getAllResponseHeaders(This,pbstrHeaders)
#define IXMLHTTPRequest_send(This,body) (This)->lpVtbl->send(This,body)
#define IXMLHTTPRequest_abort(This) (This)->lpVtbl->abort(This)
#define IXMLHTTPRequest_get_status(This,pStatus) (This)->lpVtbl->get_status(This,pStatus)
#define IXMLHTTPRequest_get_statusText(This,pStatus) (This)->lpVtbl->get_statusText(This,pStatus)
#define IXMLHTTPRequest_get_responseXML(This,pBody) (This)->lpVtbl->get_responseXML(This,pBody)
#define IXMLHTTPRequest_get_responseText(This,pBody) (This)->lpVtbl->get_responseText(This,pBody)
#define IXMLHTTPRequest_get_responseBody(This,pBody) (This)->lpVtbl->get_responseBody(This,pBody)
#define IXMLHTTPRequest_get_responseStream(This,pBody) (This)->lpVtbl->get_responseStream(This,pBody)
#define IXMLHTTPRequest_get_readyState(This,pState) (This)->lpVtbl->get_readyState(This,pState)
#define IXMLHTTPRequest_put_onreadystatechange(This,pReadyStateSink) (This)->lpVtbl->put_onreadystatechange(This,pReadyStateSink)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLHTTPRequest_QueryInterface(IXMLHTTPRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLHTTPRequest_AddRef(IXMLHTTPRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLHTTPRequest_Release(IXMLHTTPRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLHTTPRequest_GetTypeInfoCount(IXMLHTTPRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_GetTypeInfo(IXMLHTTPRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_GetIDsOfNames(IXMLHTTPRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_Invoke(IXMLHTTPRequest* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLHTTPRequest methods ***/
static __WIDL_INLINE HRESULT IXMLHTTPRequest_open(IXMLHTTPRequest* This,BSTR bstrMethod,BSTR bstrUrl,VARIANT varAsync,VARIANT username,VARIANT password) {
    return This->lpVtbl->open(This,bstrMethod,bstrUrl,varAsync,username,password);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_setRequestHeader(IXMLHTTPRequest* This,BSTR bstrHeader,BSTR bstrValue) {
    return This->lpVtbl->setRequestHeader(This,bstrHeader,bstrValue);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_getResponseHeader(IXMLHTTPRequest* This,BSTR bstrHeader,BSTR *value) {
    return This->lpVtbl->getResponseHeader(This,bstrHeader,value);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_getAllResponseHeaders(IXMLHTTPRequest* This,BSTR *pbstrHeaders) {
    return This->lpVtbl->getAllResponseHeaders(This,pbstrHeaders);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_send(IXMLHTTPRequest* This,VARIANT body) {
    return This->lpVtbl->send(This,body);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_abort(IXMLHTTPRequest* This) {
    return This->lpVtbl->abort(This);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_get_status(IXMLHTTPRequest* This,LONG *pStatus) {
    return This->lpVtbl->get_status(This,pStatus);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_get_statusText(IXMLHTTPRequest* This,BSTR *pStatus) {
    return This->lpVtbl->get_statusText(This,pStatus);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_get_responseXML(IXMLHTTPRequest* This,IDispatch **pBody) {
    return This->lpVtbl->get_responseXML(This,pBody);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_get_responseText(IXMLHTTPRequest* This,BSTR *pBody) {
    return This->lpVtbl->get_responseText(This,pBody);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_get_responseBody(IXMLHTTPRequest* This,VARIANT *pBody) {
    return This->lpVtbl->get_responseBody(This,pBody);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_get_responseStream(IXMLHTTPRequest* This,VARIANT *pBody) {
    return This->lpVtbl->get_responseStream(This,pBody);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_get_readyState(IXMLHTTPRequest* This,LONG *pState) {
    return This->lpVtbl->get_readyState(This,pState);
}
static __WIDL_INLINE HRESULT IXMLHTTPRequest_put_onreadystatechange(IXMLHTTPRequest* This,IDispatch *pReadyStateSink) {
    return This->lpVtbl->put_onreadystatechange(This,pReadyStateSink);
}
#endif
#endif

#endif


#endif  /* __IXMLHTTPRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IServerXMLHTTPRequest interface
 */
#ifndef __IServerXMLHTTPRequest_INTERFACE_DEFINED__
#define __IServerXMLHTTPRequest_INTERFACE_DEFINED__

typedef enum _SERVERXMLHTTP_OPTION {
    SXH_OPTION_URL = -1,
    SXH_OPTION_URL_CODEPAGE = 0,
    SXH_OPTION_ESCAPE_PERCENT_IN_URL = 1,
    SXH_OPTION_IGNORE_SERVER_SSL_CERT_ERROR_FLAGS = 2,
    SXH_OPTION_SELECT_CLIENT_SSL_CERT = 3
} SERVERXMLHTTP_OPTION;
DEFINE_GUID(IID_IServerXMLHTTPRequest, 0x2e9196bf, 0x13ba, 0x4dd4, 0x91,0xca, 0x6c,0x57,0x1f,0x28,0x14,0x95);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2e9196bf-13ba-4dd4-91ca-6c571f281495")
IServerXMLHTTPRequest : public IXMLHTTPRequest
{
    virtual HRESULT STDMETHODCALLTYPE setTimeouts(
        LONG resolveTimeout,
        LONG connectTimeout,
        LONG sendTimeout,
        LONG receiveTimeout) = 0;

    virtual HRESULT STDMETHODCALLTYPE waitForResponse(
        VARIANT timeoutInSeconds,
        VARIANT_BOOL *isSuccessful) = 0;

    virtual HRESULT STDMETHODCALLTYPE getOption(
        SERVERXMLHTTP_OPTION option,
        VARIANT *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE setOption(
        SERVERXMLHTTP_OPTION option,
        VARIANT value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IServerXMLHTTPRequest, 0x2e9196bf, 0x13ba, 0x4dd4, 0x91,0xca, 0x6c,0x57,0x1f,0x28,0x14,0x95)
#endif
#else
typedef struct IServerXMLHTTPRequestVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IServerXMLHTTPRequest *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IServerXMLHTTPRequest *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IServerXMLHTTPRequest *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IServerXMLHTTPRequest *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IServerXMLHTTPRequest *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IServerXMLHTTPRequest *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IServerXMLHTTPRequest *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLHTTPRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *open)(
        IServerXMLHTTPRequest *This,
        BSTR bstrMethod,
        BSTR bstrUrl,
        VARIANT varAsync,
        VARIANT username,
        VARIANT password);

    HRESULT (STDMETHODCALLTYPE *setRequestHeader)(
        IServerXMLHTTPRequest *This,
        BSTR bstrHeader,
        BSTR bstrValue);

    HRESULT (STDMETHODCALLTYPE *getResponseHeader)(
        IServerXMLHTTPRequest *This,
        BSTR bstrHeader,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *getAllResponseHeaders)(
        IServerXMLHTTPRequest *This,
        BSTR *pbstrHeaders);

    HRESULT (STDMETHODCALLTYPE *send)(
        IServerXMLHTTPRequest *This,
        VARIANT body);

    HRESULT (STDMETHODCALLTYPE *abort)(
        IServerXMLHTTPRequest *This);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IServerXMLHTTPRequest *This,
        LONG *pStatus);

    HRESULT (STDMETHODCALLTYPE *get_statusText)(
        IServerXMLHTTPRequest *This,
        BSTR *pStatus);

    HRESULT (STDMETHODCALLTYPE *get_responseXML)(
        IServerXMLHTTPRequest *This,
        IDispatch **pBody);

    HRESULT (STDMETHODCALLTYPE *get_responseText)(
        IServerXMLHTTPRequest *This,
        BSTR *pBody);

    HRESULT (STDMETHODCALLTYPE *get_responseBody)(
        IServerXMLHTTPRequest *This,
        VARIANT *pBody);

    HRESULT (STDMETHODCALLTYPE *get_responseStream)(
        IServerXMLHTTPRequest *This,
        VARIANT *pBody);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IServerXMLHTTPRequest *This,
        LONG *pState);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IServerXMLHTTPRequest *This,
        IDispatch *pReadyStateSink);

    /*** IServerXMLHTTPRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *setTimeouts)(
        IServerXMLHTTPRequest *This,
        LONG resolveTimeout,
        LONG connectTimeout,
        LONG sendTimeout,
        LONG receiveTimeout);

    HRESULT (STDMETHODCALLTYPE *waitForResponse)(
        IServerXMLHTTPRequest *This,
        VARIANT timeoutInSeconds,
        VARIANT_BOOL *isSuccessful);

    HRESULT (STDMETHODCALLTYPE *getOption)(
        IServerXMLHTTPRequest *This,
        SERVERXMLHTTP_OPTION option,
        VARIANT *value);

    HRESULT (STDMETHODCALLTYPE *setOption)(
        IServerXMLHTTPRequest *This,
        SERVERXMLHTTP_OPTION option,
        VARIANT value);

    END_INTERFACE
} IServerXMLHTTPRequestVtbl;

interface IServerXMLHTTPRequest {
    CONST_VTBL IServerXMLHTTPRequestVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IServerXMLHTTPRequest_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServerXMLHTTPRequest_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServerXMLHTTPRequest_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IServerXMLHTTPRequest_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IServerXMLHTTPRequest_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IServerXMLHTTPRequest_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IServerXMLHTTPRequest_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLHTTPRequest methods ***/
#define IServerXMLHTTPRequest_open(This,bstrMethod,bstrUrl,varAsync,username,password) (This)->lpVtbl->open(This,bstrMethod,bstrUrl,varAsync,username,password)
#define IServerXMLHTTPRequest_setRequestHeader(This,bstrHeader,bstrValue) (This)->lpVtbl->setRequestHeader(This,bstrHeader,bstrValue)
#define IServerXMLHTTPRequest_getResponseHeader(This,bstrHeader,value) (This)->lpVtbl->getResponseHeader(This,bstrHeader,value)
#define IServerXMLHTTPRequest_getAllResponseHeaders(This,pbstrHeaders) (This)->lpVtbl->getAllResponseHeaders(This,pbstrHeaders)
#define IServerXMLHTTPRequest_send(This,body) (This)->lpVtbl->send(This,body)
#define IServerXMLHTTPRequest_abort(This) (This)->lpVtbl->abort(This)
#define IServerXMLHTTPRequest_get_status(This,pStatus) (This)->lpVtbl->get_status(This,pStatus)
#define IServerXMLHTTPRequest_get_statusText(This,pStatus) (This)->lpVtbl->get_statusText(This,pStatus)
#define IServerXMLHTTPRequest_get_responseXML(This,pBody) (This)->lpVtbl->get_responseXML(This,pBody)
#define IServerXMLHTTPRequest_get_responseText(This,pBody) (This)->lpVtbl->get_responseText(This,pBody)
#define IServerXMLHTTPRequest_get_responseBody(This,pBody) (This)->lpVtbl->get_responseBody(This,pBody)
#define IServerXMLHTTPRequest_get_responseStream(This,pBody) (This)->lpVtbl->get_responseStream(This,pBody)
#define IServerXMLHTTPRequest_get_readyState(This,pState) (This)->lpVtbl->get_readyState(This,pState)
#define IServerXMLHTTPRequest_put_onreadystatechange(This,pReadyStateSink) (This)->lpVtbl->put_onreadystatechange(This,pReadyStateSink)
/*** IServerXMLHTTPRequest methods ***/
#define IServerXMLHTTPRequest_setTimeouts(This,resolveTimeout,connectTimeout,sendTimeout,receiveTimeout) (This)->lpVtbl->setTimeouts(This,resolveTimeout,connectTimeout,sendTimeout,receiveTimeout)
#define IServerXMLHTTPRequest_waitForResponse(This,timeoutInSeconds,isSuccessful) (This)->lpVtbl->waitForResponse(This,timeoutInSeconds,isSuccessful)
#define IServerXMLHTTPRequest_getOption(This,option,value) (This)->lpVtbl->getOption(This,option,value)
#define IServerXMLHTTPRequest_setOption(This,option,value) (This)->lpVtbl->setOption(This,option,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_QueryInterface(IServerXMLHTTPRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IServerXMLHTTPRequest_AddRef(IServerXMLHTTPRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IServerXMLHTTPRequest_Release(IServerXMLHTTPRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_GetTypeInfoCount(IServerXMLHTTPRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_GetTypeInfo(IServerXMLHTTPRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_GetIDsOfNames(IServerXMLHTTPRequest* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_Invoke(IServerXMLHTTPRequest* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLHTTPRequest methods ***/
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_open(IServerXMLHTTPRequest* This,BSTR bstrMethod,BSTR bstrUrl,VARIANT varAsync,VARIANT username,VARIANT password) {
    return This->lpVtbl->open(This,bstrMethod,bstrUrl,varAsync,username,password);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_setRequestHeader(IServerXMLHTTPRequest* This,BSTR bstrHeader,BSTR bstrValue) {
    return This->lpVtbl->setRequestHeader(This,bstrHeader,bstrValue);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_getResponseHeader(IServerXMLHTTPRequest* This,BSTR bstrHeader,BSTR *value) {
    return This->lpVtbl->getResponseHeader(This,bstrHeader,value);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_getAllResponseHeaders(IServerXMLHTTPRequest* This,BSTR *pbstrHeaders) {
    return This->lpVtbl->getAllResponseHeaders(This,pbstrHeaders);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_send(IServerXMLHTTPRequest* This,VARIANT body) {
    return This->lpVtbl->send(This,body);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_abort(IServerXMLHTTPRequest* This) {
    return This->lpVtbl->abort(This);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_get_status(IServerXMLHTTPRequest* This,LONG *pStatus) {
    return This->lpVtbl->get_status(This,pStatus);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_get_statusText(IServerXMLHTTPRequest* This,BSTR *pStatus) {
    return This->lpVtbl->get_statusText(This,pStatus);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_get_responseXML(IServerXMLHTTPRequest* This,IDispatch **pBody) {
    return This->lpVtbl->get_responseXML(This,pBody);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_get_responseText(IServerXMLHTTPRequest* This,BSTR *pBody) {
    return This->lpVtbl->get_responseText(This,pBody);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_get_responseBody(IServerXMLHTTPRequest* This,VARIANT *pBody) {
    return This->lpVtbl->get_responseBody(This,pBody);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_get_responseStream(IServerXMLHTTPRequest* This,VARIANT *pBody) {
    return This->lpVtbl->get_responseStream(This,pBody);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_get_readyState(IServerXMLHTTPRequest* This,LONG *pState) {
    return This->lpVtbl->get_readyState(This,pState);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_put_onreadystatechange(IServerXMLHTTPRequest* This,IDispatch *pReadyStateSink) {
    return This->lpVtbl->put_onreadystatechange(This,pReadyStateSink);
}
/*** IServerXMLHTTPRequest methods ***/
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_setTimeouts(IServerXMLHTTPRequest* This,LONG resolveTimeout,LONG connectTimeout,LONG sendTimeout,LONG receiveTimeout) {
    return This->lpVtbl->setTimeouts(This,resolveTimeout,connectTimeout,sendTimeout,receiveTimeout);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_waitForResponse(IServerXMLHTTPRequest* This,VARIANT timeoutInSeconds,VARIANT_BOOL *isSuccessful) {
    return This->lpVtbl->waitForResponse(This,timeoutInSeconds,isSuccessful);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_getOption(IServerXMLHTTPRequest* This,SERVERXMLHTTP_OPTION option,VARIANT *value) {
    return This->lpVtbl->getOption(This,option,value);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest_setOption(IServerXMLHTTPRequest* This,SERVERXMLHTTP_OPTION option,VARIANT value) {
    return This->lpVtbl->setOption(This,option,value);
}
#endif
#endif

#endif


#endif  /* __IServerXMLHTTPRequest_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IServerXMLHTTPRequest2 interface
 */
#ifndef __IServerXMLHTTPRequest2_INTERFACE_DEFINED__
#define __IServerXMLHTTPRequest2_INTERFACE_DEFINED__

typedef enum _SXH_PROXY_SETTING {
    SXH_PROXY_SET_DEFAULT = 0,
    SXH_PROXY_SET_PRECONFIG = 0,
    SXH_PROXY_SET_DIRECT = 1,
    SXH_PROXY_SET_PROXY = 2
} SXH_PROXY_SETTING;
DEFINE_GUID(IID_IServerXMLHTTPRequest2, 0x2e01311b, 0xc322, 0x4b0a, 0xbd,0x77, 0xb9,0x0c,0xfd,0xc8,0xdc,0xe7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2e01311b-c322-4b0a-bd77-b90cfdc8dce7")
IServerXMLHTTPRequest2 : public IServerXMLHTTPRequest
{
    virtual HRESULT STDMETHODCALLTYPE setProxy(
        SXH_PROXY_SETTING proxySetting,
        VARIANT varProxyServer,
        VARIANT varBypassList) = 0;

    virtual HRESULT STDMETHODCALLTYPE setProxyCredentials(
        BSTR bstrUserName,
        BSTR bstrPassword) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IServerXMLHTTPRequest2, 0x2e01311b, 0xc322, 0x4b0a, 0xbd,0x77, 0xb9,0x0c,0xfd,0xc8,0xdc,0xe7)
#endif
#else
typedef struct IServerXMLHTTPRequest2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IServerXMLHTTPRequest2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IServerXMLHTTPRequest2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IServerXMLHTTPRequest2 *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IServerXMLHTTPRequest2 *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IServerXMLHTTPRequest2 *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IServerXMLHTTPRequest2 *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IServerXMLHTTPRequest2 *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLHTTPRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *open)(
        IServerXMLHTTPRequest2 *This,
        BSTR bstrMethod,
        BSTR bstrUrl,
        VARIANT varAsync,
        VARIANT username,
        VARIANT password);

    HRESULT (STDMETHODCALLTYPE *setRequestHeader)(
        IServerXMLHTTPRequest2 *This,
        BSTR bstrHeader,
        BSTR bstrValue);

    HRESULT (STDMETHODCALLTYPE *getResponseHeader)(
        IServerXMLHTTPRequest2 *This,
        BSTR bstrHeader,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *getAllResponseHeaders)(
        IServerXMLHTTPRequest2 *This,
        BSTR *pbstrHeaders);

    HRESULT (STDMETHODCALLTYPE *send)(
        IServerXMLHTTPRequest2 *This,
        VARIANT body);

    HRESULT (STDMETHODCALLTYPE *abort)(
        IServerXMLHTTPRequest2 *This);

    HRESULT (STDMETHODCALLTYPE *get_status)(
        IServerXMLHTTPRequest2 *This,
        LONG *pStatus);

    HRESULT (STDMETHODCALLTYPE *get_statusText)(
        IServerXMLHTTPRequest2 *This,
        BSTR *pStatus);

    HRESULT (STDMETHODCALLTYPE *get_responseXML)(
        IServerXMLHTTPRequest2 *This,
        IDispatch **pBody);

    HRESULT (STDMETHODCALLTYPE *get_responseText)(
        IServerXMLHTTPRequest2 *This,
        BSTR *pBody);

    HRESULT (STDMETHODCALLTYPE *get_responseBody)(
        IServerXMLHTTPRequest2 *This,
        VARIANT *pBody);

    HRESULT (STDMETHODCALLTYPE *get_responseStream)(
        IServerXMLHTTPRequest2 *This,
        VARIANT *pBody);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IServerXMLHTTPRequest2 *This,
        LONG *pState);

    HRESULT (STDMETHODCALLTYPE *put_onreadystatechange)(
        IServerXMLHTTPRequest2 *This,
        IDispatch *pReadyStateSink);

    /*** IServerXMLHTTPRequest methods ***/
    HRESULT (STDMETHODCALLTYPE *setTimeouts)(
        IServerXMLHTTPRequest2 *This,
        LONG resolveTimeout,
        LONG connectTimeout,
        LONG sendTimeout,
        LONG receiveTimeout);

    HRESULT (STDMETHODCALLTYPE *waitForResponse)(
        IServerXMLHTTPRequest2 *This,
        VARIANT timeoutInSeconds,
        VARIANT_BOOL *isSuccessful);

    HRESULT (STDMETHODCALLTYPE *getOption)(
        IServerXMLHTTPRequest2 *This,
        SERVERXMLHTTP_OPTION option,
        VARIANT *value);

    HRESULT (STDMETHODCALLTYPE *setOption)(
        IServerXMLHTTPRequest2 *This,
        SERVERXMLHTTP_OPTION option,
        VARIANT value);

    /*** IServerXMLHTTPRequest2 methods ***/
    HRESULT (STDMETHODCALLTYPE *setProxy)(
        IServerXMLHTTPRequest2 *This,
        SXH_PROXY_SETTING proxySetting,
        VARIANT varProxyServer,
        VARIANT varBypassList);

    HRESULT (STDMETHODCALLTYPE *setProxyCredentials)(
        IServerXMLHTTPRequest2 *This,
        BSTR bstrUserName,
        BSTR bstrPassword);

    END_INTERFACE
} IServerXMLHTTPRequest2Vtbl;

interface IServerXMLHTTPRequest2 {
    CONST_VTBL IServerXMLHTTPRequest2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IServerXMLHTTPRequest2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IServerXMLHTTPRequest2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IServerXMLHTTPRequest2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IServerXMLHTTPRequest2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IServerXMLHTTPRequest2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IServerXMLHTTPRequest2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IServerXMLHTTPRequest2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLHTTPRequest methods ***/
#define IServerXMLHTTPRequest2_open(This,bstrMethod,bstrUrl,varAsync,username,password) (This)->lpVtbl->open(This,bstrMethod,bstrUrl,varAsync,username,password)
#define IServerXMLHTTPRequest2_setRequestHeader(This,bstrHeader,bstrValue) (This)->lpVtbl->setRequestHeader(This,bstrHeader,bstrValue)
#define IServerXMLHTTPRequest2_getResponseHeader(This,bstrHeader,value) (This)->lpVtbl->getResponseHeader(This,bstrHeader,value)
#define IServerXMLHTTPRequest2_getAllResponseHeaders(This,pbstrHeaders) (This)->lpVtbl->getAllResponseHeaders(This,pbstrHeaders)
#define IServerXMLHTTPRequest2_send(This,body) (This)->lpVtbl->send(This,body)
#define IServerXMLHTTPRequest2_abort(This) (This)->lpVtbl->abort(This)
#define IServerXMLHTTPRequest2_get_status(This,pStatus) (This)->lpVtbl->get_status(This,pStatus)
#define IServerXMLHTTPRequest2_get_statusText(This,pStatus) (This)->lpVtbl->get_statusText(This,pStatus)
#define IServerXMLHTTPRequest2_get_responseXML(This,pBody) (This)->lpVtbl->get_responseXML(This,pBody)
#define IServerXMLHTTPRequest2_get_responseText(This,pBody) (This)->lpVtbl->get_responseText(This,pBody)
#define IServerXMLHTTPRequest2_get_responseBody(This,pBody) (This)->lpVtbl->get_responseBody(This,pBody)
#define IServerXMLHTTPRequest2_get_responseStream(This,pBody) (This)->lpVtbl->get_responseStream(This,pBody)
#define IServerXMLHTTPRequest2_get_readyState(This,pState) (This)->lpVtbl->get_readyState(This,pState)
#define IServerXMLHTTPRequest2_put_onreadystatechange(This,pReadyStateSink) (This)->lpVtbl->put_onreadystatechange(This,pReadyStateSink)
/*** IServerXMLHTTPRequest methods ***/
#define IServerXMLHTTPRequest2_setTimeouts(This,resolveTimeout,connectTimeout,sendTimeout,receiveTimeout) (This)->lpVtbl->setTimeouts(This,resolveTimeout,connectTimeout,sendTimeout,receiveTimeout)
#define IServerXMLHTTPRequest2_waitForResponse(This,timeoutInSeconds,isSuccessful) (This)->lpVtbl->waitForResponse(This,timeoutInSeconds,isSuccessful)
#define IServerXMLHTTPRequest2_getOption(This,option,value) (This)->lpVtbl->getOption(This,option,value)
#define IServerXMLHTTPRequest2_setOption(This,option,value) (This)->lpVtbl->setOption(This,option,value)
/*** IServerXMLHTTPRequest2 methods ***/
#define IServerXMLHTTPRequest2_setProxy(This,proxySetting,varProxyServer,varBypassList) (This)->lpVtbl->setProxy(This,proxySetting,varProxyServer,varBypassList)
#define IServerXMLHTTPRequest2_setProxyCredentials(This,bstrUserName,bstrPassword) (This)->lpVtbl->setProxyCredentials(This,bstrUserName,bstrPassword)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_QueryInterface(IServerXMLHTTPRequest2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IServerXMLHTTPRequest2_AddRef(IServerXMLHTTPRequest2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IServerXMLHTTPRequest2_Release(IServerXMLHTTPRequest2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_GetTypeInfoCount(IServerXMLHTTPRequest2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_GetTypeInfo(IServerXMLHTTPRequest2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_GetIDsOfNames(IServerXMLHTTPRequest2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_Invoke(IServerXMLHTTPRequest2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLHTTPRequest methods ***/
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_open(IServerXMLHTTPRequest2* This,BSTR bstrMethod,BSTR bstrUrl,VARIANT varAsync,VARIANT username,VARIANT password) {
    return This->lpVtbl->open(This,bstrMethod,bstrUrl,varAsync,username,password);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_setRequestHeader(IServerXMLHTTPRequest2* This,BSTR bstrHeader,BSTR bstrValue) {
    return This->lpVtbl->setRequestHeader(This,bstrHeader,bstrValue);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_getResponseHeader(IServerXMLHTTPRequest2* This,BSTR bstrHeader,BSTR *value) {
    return This->lpVtbl->getResponseHeader(This,bstrHeader,value);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_getAllResponseHeaders(IServerXMLHTTPRequest2* This,BSTR *pbstrHeaders) {
    return This->lpVtbl->getAllResponseHeaders(This,pbstrHeaders);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_send(IServerXMLHTTPRequest2* This,VARIANT body) {
    return This->lpVtbl->send(This,body);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_abort(IServerXMLHTTPRequest2* This) {
    return This->lpVtbl->abort(This);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_get_status(IServerXMLHTTPRequest2* This,LONG *pStatus) {
    return This->lpVtbl->get_status(This,pStatus);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_get_statusText(IServerXMLHTTPRequest2* This,BSTR *pStatus) {
    return This->lpVtbl->get_statusText(This,pStatus);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_get_responseXML(IServerXMLHTTPRequest2* This,IDispatch **pBody) {
    return This->lpVtbl->get_responseXML(This,pBody);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_get_responseText(IServerXMLHTTPRequest2* This,BSTR *pBody) {
    return This->lpVtbl->get_responseText(This,pBody);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_get_responseBody(IServerXMLHTTPRequest2* This,VARIANT *pBody) {
    return This->lpVtbl->get_responseBody(This,pBody);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_get_responseStream(IServerXMLHTTPRequest2* This,VARIANT *pBody) {
    return This->lpVtbl->get_responseStream(This,pBody);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_get_readyState(IServerXMLHTTPRequest2* This,LONG *pState) {
    return This->lpVtbl->get_readyState(This,pState);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_put_onreadystatechange(IServerXMLHTTPRequest2* This,IDispatch *pReadyStateSink) {
    return This->lpVtbl->put_onreadystatechange(This,pReadyStateSink);
}
/*** IServerXMLHTTPRequest methods ***/
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_setTimeouts(IServerXMLHTTPRequest2* This,LONG resolveTimeout,LONG connectTimeout,LONG sendTimeout,LONG receiveTimeout) {
    return This->lpVtbl->setTimeouts(This,resolveTimeout,connectTimeout,sendTimeout,receiveTimeout);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_waitForResponse(IServerXMLHTTPRequest2* This,VARIANT timeoutInSeconds,VARIANT_BOOL *isSuccessful) {
    return This->lpVtbl->waitForResponse(This,timeoutInSeconds,isSuccessful);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_getOption(IServerXMLHTTPRequest2* This,SERVERXMLHTTP_OPTION option,VARIANT *value) {
    return This->lpVtbl->getOption(This,option,value);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_setOption(IServerXMLHTTPRequest2* This,SERVERXMLHTTP_OPTION option,VARIANT value) {
    return This->lpVtbl->setOption(This,option,value);
}
/*** IServerXMLHTTPRequest2 methods ***/
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_setProxy(IServerXMLHTTPRequest2* This,SXH_PROXY_SETTING proxySetting,VARIANT varProxyServer,VARIANT varBypassList) {
    return This->lpVtbl->setProxy(This,proxySetting,varProxyServer,varBypassList);
}
static __WIDL_INLINE HRESULT IServerXMLHTTPRequest2_setProxyCredentials(IServerXMLHTTPRequest2* This,BSTR bstrUserName,BSTR bstrPassword) {
    return This->lpVtbl->setProxyCredentials(This,bstrUserName,bstrPassword);
}
#endif
#endif

#endif


#endif  /* __IServerXMLHTTPRequest2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMParseError interface
 */
#ifndef __IXMLDOMParseError_INTERFACE_DEFINED__
#define __IXMLDOMParseError_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMParseError, 0x3efaa426, 0x272f, 0x11d2, 0x83,0x6f, 0x00,0x00,0xf8,0x7a,0x77,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3efaa426-272f-11d2-836f-0000f87a7782")
IXMLDOMParseError : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_errorCode(
        LONG *errCode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_url(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_reason(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_srcText(
        BSTR *p) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_line(
        LONG *lineNo) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_linepos(
        LONG *linePos) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_filepos(
        LONG *filePos) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMParseError, 0x3efaa426, 0x272f, 0x11d2, 0x83,0x6f, 0x00,0x00,0xf8,0x7a,0x77,0x82)
#endif
#else
typedef struct IXMLDOMParseErrorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMParseError *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMParseError *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMParseError *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMParseError *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMParseError *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMParseError *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMParseError *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMParseError methods ***/
    HRESULT (STDMETHODCALLTYPE *get_errorCode)(
        IXMLDOMParseError *This,
        LONG *errCode);

    HRESULT (STDMETHODCALLTYPE *get_url)(
        IXMLDOMParseError *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_reason)(
        IXMLDOMParseError *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_srcText)(
        IXMLDOMParseError *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_line)(
        IXMLDOMParseError *This,
        LONG *lineNo);

    HRESULT (STDMETHODCALLTYPE *get_linepos)(
        IXMLDOMParseError *This,
        LONG *linePos);

    HRESULT (STDMETHODCALLTYPE *get_filepos)(
        IXMLDOMParseError *This,
        LONG *filePos);

    END_INTERFACE
} IXMLDOMParseErrorVtbl;

interface IXMLDOMParseError {
    CONST_VTBL IXMLDOMParseErrorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMParseError_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMParseError_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMParseError_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMParseError_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMParseError_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMParseError_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMParseError_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMParseError methods ***/
#define IXMLDOMParseError_get_errorCode(This,errCode) (This)->lpVtbl->get_errorCode(This,errCode)
#define IXMLDOMParseError_get_url(This,p) (This)->lpVtbl->get_url(This,p)
#define IXMLDOMParseError_get_reason(This,p) (This)->lpVtbl->get_reason(This,p)
#define IXMLDOMParseError_get_srcText(This,p) (This)->lpVtbl->get_srcText(This,p)
#define IXMLDOMParseError_get_line(This,lineNo) (This)->lpVtbl->get_line(This,lineNo)
#define IXMLDOMParseError_get_linepos(This,linePos) (This)->lpVtbl->get_linepos(This,linePos)
#define IXMLDOMParseError_get_filepos(This,filePos) (This)->lpVtbl->get_filepos(This,filePos)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMParseError_QueryInterface(IXMLDOMParseError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMParseError_AddRef(IXMLDOMParseError* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMParseError_Release(IXMLDOMParseError* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMParseError_GetTypeInfoCount(IXMLDOMParseError* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError_GetTypeInfo(IXMLDOMParseError* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError_GetIDsOfNames(IXMLDOMParseError* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError_Invoke(IXMLDOMParseError* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMParseError methods ***/
static __WIDL_INLINE HRESULT IXMLDOMParseError_get_errorCode(IXMLDOMParseError* This,LONG *errCode) {
    return This->lpVtbl->get_errorCode(This,errCode);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError_get_url(IXMLDOMParseError* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError_get_reason(IXMLDOMParseError* This,BSTR *p) {
    return This->lpVtbl->get_reason(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError_get_srcText(IXMLDOMParseError* This,BSTR *p) {
    return This->lpVtbl->get_srcText(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError_get_line(IXMLDOMParseError* This,LONG *lineNo) {
    return This->lpVtbl->get_line(This,lineNo);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError_get_linepos(IXMLDOMParseError* This,LONG *linePos) {
    return This->lpVtbl->get_linepos(This,linePos);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError_get_filepos(IXMLDOMParseError* This,LONG *filePos) {
    return This->lpVtbl->get_filepos(This,filePos);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMParseError_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMParseError2 interface
 */
#ifndef __IXMLDOMParseError2_INTERFACE_DEFINED__
#define __IXMLDOMParseError2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMParseError2, 0x3efaa428, 0x272f, 0x11d2, 0x83,0x6f, 0x00,0x00,0xf8,0x7a,0x77,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3efaa428-272f-11d2-836f-0000f87a7782")
IXMLDOMParseError2 : public IXMLDOMParseError
{
    virtual HRESULT STDMETHODCALLTYPE get_errorXPath(
        BSTR *xpathexpr) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_allErrors(
        IXMLDOMParseErrorCollection **allErrors) = 0;

    virtual HRESULT STDMETHODCALLTYPE errorParameters(
        LONG index,
        BSTR *param) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_errorParametersCount(
        LONG *count) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMParseError2, 0x3efaa428, 0x272f, 0x11d2, 0x83,0x6f, 0x00,0x00,0xf8,0x7a,0x77,0x82)
#endif
#else
typedef struct IXMLDOMParseError2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMParseError2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMParseError2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMParseError2 *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMParseError2 *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMParseError2 *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMParseError2 *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMParseError2 *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMParseError methods ***/
    HRESULT (STDMETHODCALLTYPE *get_errorCode)(
        IXMLDOMParseError2 *This,
        LONG *errCode);

    HRESULT (STDMETHODCALLTYPE *get_url)(
        IXMLDOMParseError2 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_reason)(
        IXMLDOMParseError2 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_srcText)(
        IXMLDOMParseError2 *This,
        BSTR *p);

    HRESULT (STDMETHODCALLTYPE *get_line)(
        IXMLDOMParseError2 *This,
        LONG *lineNo);

    HRESULT (STDMETHODCALLTYPE *get_linepos)(
        IXMLDOMParseError2 *This,
        LONG *linePos);

    HRESULT (STDMETHODCALLTYPE *get_filepos)(
        IXMLDOMParseError2 *This,
        LONG *filePos);

    /*** IXMLDOMParseError2 methods ***/
    HRESULT (STDMETHODCALLTYPE *get_errorXPath)(
        IXMLDOMParseError2 *This,
        BSTR *xpathexpr);

    HRESULT (STDMETHODCALLTYPE *get_allErrors)(
        IXMLDOMParseError2 *This,
        IXMLDOMParseErrorCollection **allErrors);

    HRESULT (STDMETHODCALLTYPE *errorParameters)(
        IXMLDOMParseError2 *This,
        LONG index,
        BSTR *param);

    HRESULT (STDMETHODCALLTYPE *get_errorParametersCount)(
        IXMLDOMParseError2 *This,
        LONG *count);

    END_INTERFACE
} IXMLDOMParseError2Vtbl;

interface IXMLDOMParseError2 {
    CONST_VTBL IXMLDOMParseError2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMParseError2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMParseError2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMParseError2_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMParseError2_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMParseError2_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMParseError2_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMParseError2_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMParseError methods ***/
#define IXMLDOMParseError2_get_errorCode(This,errCode) (This)->lpVtbl->get_errorCode(This,errCode)
#define IXMLDOMParseError2_get_url(This,p) (This)->lpVtbl->get_url(This,p)
#define IXMLDOMParseError2_get_reason(This,p) (This)->lpVtbl->get_reason(This,p)
#define IXMLDOMParseError2_get_srcText(This,p) (This)->lpVtbl->get_srcText(This,p)
#define IXMLDOMParseError2_get_line(This,lineNo) (This)->lpVtbl->get_line(This,lineNo)
#define IXMLDOMParseError2_get_linepos(This,linePos) (This)->lpVtbl->get_linepos(This,linePos)
#define IXMLDOMParseError2_get_filepos(This,filePos) (This)->lpVtbl->get_filepos(This,filePos)
/*** IXMLDOMParseError2 methods ***/
#define IXMLDOMParseError2_get_errorXPath(This,xpathexpr) (This)->lpVtbl->get_errorXPath(This,xpathexpr)
#define IXMLDOMParseError2_get_allErrors(This,allErrors) (This)->lpVtbl->get_allErrors(This,allErrors)
#define IXMLDOMParseError2_errorParameters(This,index,param) (This)->lpVtbl->errorParameters(This,index,param)
#define IXMLDOMParseError2_get_errorParametersCount(This,count) (This)->lpVtbl->get_errorParametersCount(This,count)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMParseError2_QueryInterface(IXMLDOMParseError2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMParseError2_AddRef(IXMLDOMParseError2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMParseError2_Release(IXMLDOMParseError2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMParseError2_GetTypeInfoCount(IXMLDOMParseError2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError2_GetTypeInfo(IXMLDOMParseError2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError2_GetIDsOfNames(IXMLDOMParseError2* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError2_Invoke(IXMLDOMParseError2* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMParseError methods ***/
static __WIDL_INLINE HRESULT IXMLDOMParseError2_get_errorCode(IXMLDOMParseError2* This,LONG *errCode) {
    return This->lpVtbl->get_errorCode(This,errCode);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError2_get_url(IXMLDOMParseError2* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError2_get_reason(IXMLDOMParseError2* This,BSTR *p) {
    return This->lpVtbl->get_reason(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError2_get_srcText(IXMLDOMParseError2* This,BSTR *p) {
    return This->lpVtbl->get_srcText(This,p);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError2_get_line(IXMLDOMParseError2* This,LONG *lineNo) {
    return This->lpVtbl->get_line(This,lineNo);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError2_get_linepos(IXMLDOMParseError2* This,LONG *linePos) {
    return This->lpVtbl->get_linepos(This,linePos);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError2_get_filepos(IXMLDOMParseError2* This,LONG *filePos) {
    return This->lpVtbl->get_filepos(This,filePos);
}
/*** IXMLDOMParseError2 methods ***/
static __WIDL_INLINE HRESULT IXMLDOMParseError2_get_errorXPath(IXMLDOMParseError2* This,BSTR *xpathexpr) {
    return This->lpVtbl->get_errorXPath(This,xpathexpr);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError2_get_allErrors(IXMLDOMParseError2* This,IXMLDOMParseErrorCollection **allErrors) {
    return This->lpVtbl->get_allErrors(This,allErrors);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError2_errorParameters(IXMLDOMParseError2* This,LONG index,BSTR *param) {
    return This->lpVtbl->errorParameters(This,index,param);
}
static __WIDL_INLINE HRESULT IXMLDOMParseError2_get_errorParametersCount(IXMLDOMParseError2* This,LONG *count) {
    return This->lpVtbl->get_errorParametersCount(This,count);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMParseError2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLDOMParseErrorCollection interface
 */
#ifndef __IXMLDOMParseErrorCollection_INTERFACE_DEFINED__
#define __IXMLDOMParseErrorCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLDOMParseErrorCollection, 0x3efaa429, 0x272f, 0x11d2, 0x83,0x6f, 0x00,0x00,0xf8,0x7a,0x77,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3efaa429-272f-11d2-836f-0000f87a7782")
IXMLDOMParseErrorCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_item(
        LONG index,
        IXMLDOMParseError2 **error) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_next(
        IXMLDOMParseError2 **error) = 0;

    virtual HRESULT STDMETHODCALLTYPE reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **ppunk) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLDOMParseErrorCollection, 0x3efaa429, 0x272f, 0x11d2, 0x83,0x6f, 0x00,0x00,0xf8,0x7a,0x77,0x82)
#endif
#else
typedef struct IXMLDOMParseErrorCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IXMLDOMParseErrorCollection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IXMLDOMParseErrorCollection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IXMLDOMParseErrorCollection *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IXMLDOMParseErrorCollection *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IXMLDOMParseErrorCollection *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IXMLDOMParseErrorCollection *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IXMLDOMParseErrorCollection *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IXMLDOMParseErrorCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_item)(
        IXMLDOMParseErrorCollection *This,
        LONG index,
        IXMLDOMParseError2 **error);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IXMLDOMParseErrorCollection *This,
        LONG *length);

    HRESULT (STDMETHODCALLTYPE *get_next)(
        IXMLDOMParseErrorCollection *This,
        IXMLDOMParseError2 **error);

    HRESULT (STDMETHODCALLTYPE *reset)(
        IXMLDOMParseErrorCollection *This);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IXMLDOMParseErrorCollection *This,
        IUnknown **ppunk);

    END_INTERFACE
} IXMLDOMParseErrorCollectionVtbl;

interface IXMLDOMParseErrorCollection {
    CONST_VTBL IXMLDOMParseErrorCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLDOMParseErrorCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLDOMParseErrorCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLDOMParseErrorCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IXMLDOMParseErrorCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IXMLDOMParseErrorCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IXMLDOMParseErrorCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IXMLDOMParseErrorCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IXMLDOMParseErrorCollection methods ***/
#define IXMLDOMParseErrorCollection_get_item(This,index,error) (This)->lpVtbl->get_item(This,index,error)
#define IXMLDOMParseErrorCollection_get_length(This,length) (This)->lpVtbl->get_length(This,length)
#define IXMLDOMParseErrorCollection_get_next(This,error) (This)->lpVtbl->get_next(This,error)
#define IXMLDOMParseErrorCollection_reset(This) (This)->lpVtbl->reset(This)
#define IXMLDOMParseErrorCollection_get__newEnum(This,ppunk) (This)->lpVtbl->get__newEnum(This,ppunk)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IXMLDOMParseErrorCollection_QueryInterface(IXMLDOMParseErrorCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IXMLDOMParseErrorCollection_AddRef(IXMLDOMParseErrorCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IXMLDOMParseErrorCollection_Release(IXMLDOMParseErrorCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IXMLDOMParseErrorCollection_GetTypeInfoCount(IXMLDOMParseErrorCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IXMLDOMParseErrorCollection_GetTypeInfo(IXMLDOMParseErrorCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IXMLDOMParseErrorCollection_GetIDsOfNames(IXMLDOMParseErrorCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IXMLDOMParseErrorCollection_Invoke(IXMLDOMParseErrorCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IXMLDOMParseErrorCollection methods ***/
static __WIDL_INLINE HRESULT IXMLDOMParseErrorCollection_get_item(IXMLDOMParseErrorCollection* This,LONG index,IXMLDOMParseError2 **error) {
    return This->lpVtbl->get_item(This,index,error);
}
static __WIDL_INLINE HRESULT IXMLDOMParseErrorCollection_get_length(IXMLDOMParseErrorCollection* This,LONG *length) {
    return This->lpVtbl->get_length(This,length);
}
static __WIDL_INLINE HRESULT IXMLDOMParseErrorCollection_get_next(IXMLDOMParseErrorCollection* This,IXMLDOMParseError2 **error) {
    return This->lpVtbl->get_next(This,error);
}
static __WIDL_INLINE HRESULT IXMLDOMParseErrorCollection_reset(IXMLDOMParseErrorCollection* This) {
    return This->lpVtbl->reset(This);
}
static __WIDL_INLINE HRESULT IXMLDOMParseErrorCollection_get__newEnum(IXMLDOMParseErrorCollection* This,IUnknown **ppunk) {
    return This->lpVtbl->get__newEnum(This,ppunk);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMParseErrorCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * DOMDocument26 coclass
 */

DEFINE_GUID(CLSID_DOMDocument26, 0xf5078f1b, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f1b-c551-11d3-89b9-0000f81fe221") DOMDocument26;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMDocument26, 0xf5078f1b, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * DOMDocument30 coclass
 */

DEFINE_GUID(CLSID_DOMDocument30, 0xf5078f32, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f32-c551-11d3-89b9-0000f81fe221") DOMDocument30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMDocument30, 0xf5078f32, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * DOMDocument40 coclass
 */

DEFINE_GUID(CLSID_DOMDocument40, 0x88d969c0, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d969c0-f192-11d4-a65f-0040963251e5") DOMDocument40;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMDocument40, 0x88d969c0, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * DOMDocument60 coclass
 */

DEFINE_GUID(CLSID_DOMDocument60, 0x88d96a05, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d96a05-f192-11d4-a65f-0040963251e5") DOMDocument60;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMDocument60, 0x88d96a05, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * DOMDocument coclass
 */

DEFINE_GUID(CLSID_DOMDocument, 0xf6d90f11, 0x9c73, 0x11d3, 0xb3,0x2e, 0x00,0xc0,0x4f,0x99,0x0b,0xb4);

#ifdef __cplusplus
class DECLSPEC_UUID("f6d90f11-9c73-11d3-b32e-00c04f990bb4") DOMDocument;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMDocument, 0xf6d90f11, 0x9c73, 0x11d3, 0xb3,0x2e, 0x00,0xc0,0x4f,0x99,0x0b,0xb4)
#endif
#endif

/*****************************************************************************
 * FreeThreadedDOMDocument26 coclass
 */

DEFINE_GUID(CLSID_FreeThreadedDOMDocument26, 0xf5078f1c, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f1c-c551-11d3-89b9-0000f81fe221") FreeThreadedDOMDocument26;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FreeThreadedDOMDocument26, 0xf5078f1c, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * FreeThreadedDOMDocument30 coclass
 */

DEFINE_GUID(CLSID_FreeThreadedDOMDocument30, 0xf5078f33, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f33-c551-11d3-89b9-0000f81fe221") FreeThreadedDOMDocument30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FreeThreadedDOMDocument30, 0xf5078f33, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * FreeThreadedDOMDocument40 coclass
 */

DEFINE_GUID(CLSID_FreeThreadedDOMDocument40, 0x88d969c1, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d969c1-f192-11d4-a65f-0040963251e5") FreeThreadedDOMDocument40;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FreeThreadedDOMDocument40, 0x88d969c1, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * FreeThreadedDOMDocument60 coclass
 */

DEFINE_GUID(CLSID_FreeThreadedDOMDocument60, 0x88d96a06, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d96a06-f192-11d4-a65f-0040963251e5") FreeThreadedDOMDocument60;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FreeThreadedDOMDocument60, 0x88d96a06, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * FreeThreadedDOMDocument coclass
 */

DEFINE_GUID(CLSID_FreeThreadedDOMDocument, 0xf6d90f12, 0x9c73, 0x11d3, 0xb3,0x2e, 0x00,0xc0,0x4f,0x99,0x0b,0xb4);

#ifdef __cplusplus
class DECLSPEC_UUID("f6d90f12-9c73-11d3-b32e-00c04f990bb4") FreeThreadedDOMDocument;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FreeThreadedDOMDocument, 0xf6d90f12, 0x9c73, 0x11d3, 0xb3,0x2e, 0x00,0xc0,0x4f,0x99,0x0b,0xb4)
#endif
#endif

/*****************************************************************************
 * XMLHTTP26 coclass
 */

DEFINE_GUID(CLSID_XMLHTTP26, 0xf5078f1e, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f1e-c551-11d3-89b9-0000f81fe221") XMLHTTP26;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLHTTP26, 0xf5078f1e, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * XMLHTTP30 coclass
 */

DEFINE_GUID(CLSID_XMLHTTP30, 0xf5078f35, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f35-c551-11d3-89b9-0000f81fe221") XMLHTTP30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLHTTP30, 0xf5078f35, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * XMLHTTP40 coclass
 */

DEFINE_GUID(CLSID_XMLHTTP40, 0x88d969c5, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d969c5-f192-11d4-a65f-0040963251e5") XMLHTTP40;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLHTTP40, 0x88d969c5, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * XMLHTTP60 coclass
 */

DEFINE_GUID(CLSID_XMLHTTP60, 0x88d96a0a, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d96a0a-f192-11d4-a65f-0040963251e5") XMLHTTP60;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLHTTP60, 0x88d96a0a, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * XMLHTTP coclass
 */

DEFINE_GUID(CLSID_XMLHTTP, 0xf6d90f16, 0x9c73, 0x11d3, 0xb3,0x2e, 0x00,0xc0,0x4f,0x99,0x0b,0xb4);

#ifdef __cplusplus
class DECLSPEC_UUID("f6d90f16-9c73-11d3-b32e-00c04f990bb4") XMLHTTP;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLHTTP, 0xf6d90f16, 0x9c73, 0x11d3, 0xb3,0x2e, 0x00,0xc0,0x4f,0x99,0x0b,0xb4)
#endif
#endif

/*****************************************************************************
 * ServerXMLHTTP30 coclass
 */

DEFINE_GUID(CLSID_ServerXMLHTTP30, 0xafb40ffd, 0xb609, 0x40a3, 0x98,0x28, 0xf8,0x8b,0xbe,0x11,0xe4,0xe3);

#ifdef __cplusplus
class DECLSPEC_UUID("afb40ffd-b609-40a3-9828-f88bbe11e4e3") ServerXMLHTTP30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ServerXMLHTTP30, 0xafb40ffd, 0xb609, 0x40a3, 0x98,0x28, 0xf8,0x8b,0xbe,0x11,0xe4,0xe3)
#endif
#endif

/*****************************************************************************
 * ServerXMLHTTP40 coclass
 */

DEFINE_GUID(CLSID_ServerXMLHTTP40, 0x88d969c6, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d969c6-f192-11d4-a65f-0040963251e5") ServerXMLHTTP40;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ServerXMLHTTP40, 0x88d969c6, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * ServerXMLHTTP60 coclass
 */

DEFINE_GUID(CLSID_ServerXMLHTTP60, 0x88d96a0b, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d96a0b-f192-11d4-a65f-0040963251e5") ServerXMLHTTP60;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ServerXMLHTTP60, 0x88d96a0b, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * ServerXMLHTTP coclass
 */

DEFINE_GUID(CLSID_ServerXMLHTTP, 0xafba6b42, 0x5692, 0x48ea, 0x81,0x41, 0xdc,0x51,0x7d,0xcf,0x0e,0xf1);

#ifdef __cplusplus
class DECLSPEC_UUID("afba6b42-5692-48ea-8141-dc517dcf0ef1") ServerXMLHTTP;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ServerXMLHTTP, 0xafba6b42, 0x5692, 0x48ea, 0x81,0x41, 0xdc,0x51,0x7d,0xcf,0x0e,0xf1)
#endif
#endif

/*****************************************************************************
 * XMLSchemaCache26 coclass
 */

DEFINE_GUID(CLSID_XMLSchemaCache26, 0xf5078f1d, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f1d-c551-11d3-89b9-0000f81fe221") XMLSchemaCache26;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLSchemaCache26, 0xf5078f1d, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * XMLSchemaCache30 coclass
 */

DEFINE_GUID(CLSID_XMLSchemaCache30, 0xf5078f34, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f34-c551-11d3-89b9-0000f81fe221") XMLSchemaCache30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLSchemaCache30, 0xf5078f34, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * XMLSchemaCache40 coclass
 */

DEFINE_GUID(CLSID_XMLSchemaCache40, 0x88d969c2, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d969c2-f192-11d4-a65f-0040963251e5") XMLSchemaCache40;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLSchemaCache40, 0x88d969c2, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * XMLSchemaCache60 coclass
 */

DEFINE_GUID(CLSID_XMLSchemaCache60, 0x88d96a07, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d96a07-f192-11d4-a65f-0040963251e5") XMLSchemaCache60;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLSchemaCache60, 0x88d96a07, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * XMLSchemaCache coclass
 */

DEFINE_GUID(CLSID_XMLSchemaCache, 0x373984c9, 0xb845, 0x449b, 0x91,0xe7, 0x45,0xac,0x83,0x03,0x6a,0xde);

#ifdef __cplusplus
class DECLSPEC_UUID("373984c9-b845-449b-91e7-45ac83036ade") XMLSchemaCache;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLSchemaCache, 0x373984c9, 0xb845, 0x449b, 0x91,0xe7, 0x45,0xac,0x83,0x03,0x6a,0xde)
#endif
#endif

/*****************************************************************************
 * XSLTemplate26 coclass
 */

DEFINE_GUID(CLSID_XSLTemplate26, 0xf5078f21, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f21-c551-11d3-89b9-0000f81fe221") XSLTemplate26;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XSLTemplate26, 0xf5078f21, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * XSLTemplate30 coclass
 */

DEFINE_GUID(CLSID_XSLTemplate30, 0xf5078f36, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f36-c551-11d3-89b9-0000f81fe221") XSLTemplate30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XSLTemplate30, 0xf5078f36, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * XSLTemplate40 coclass
 */

DEFINE_GUID(CLSID_XSLTemplate40, 0x88d969c3, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d969c3-f192-11d4-a65f-0040963251e5") XSLTemplate40;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XSLTemplate40, 0x88d969c3, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * XSLTemplate60 coclass
 */

DEFINE_GUID(CLSID_XSLTemplate60, 0x88d96a08, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d96a08-f192-11d4-a65f-0040963251e5") XSLTemplate60;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XSLTemplate60, 0x88d96a08, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * XSLTemplate coclass
 */

DEFINE_GUID(CLSID_XSLTemplate, 0x2933bf94, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);

#ifdef __cplusplus
class DECLSPEC_UUID("2933bf94-7b36-11d2-b20e-00c04f983e60") XSLTemplate;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XSLTemplate, 0x2933bf94, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#endif

/*****************************************************************************
 * ISAXAttributes interface
 */
#ifndef __ISAXAttributes_INTERFACE_DEFINED__
#define __ISAXAttributes_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISAXAttributes, 0xf078abe1, 0x45d2, 0x4832, 0x91,0xea, 0x44,0x66,0xce,0x2f,0x25,0xc9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f078abe1-45d2-4832-91ea-4466ce2f25c9")
ISAXAttributes : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE getLength(
        int *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE getURI(
        int nIndex,
        const WCHAR **pUrl,
        int *pUriSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE getLocalName(
        int nIndex,
        const WCHAR **pLocalName,
        int *pLocalNameLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE getQName(
        int nIndex,
        const WCHAR **pQName,
        int *pQNameLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE getName(
        int nIndex,
        const WCHAR **pUri,
        int *pUriLength,
        const WCHAR **pLocalName,
        int *pLocalNameSize,
        const WCHAR **pQName,
        int *pQNameLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE getIndexFromName(
        const WCHAR *pUri,
        int cUriLength,
        const WCHAR *pLocalName,
        int cocalNameLength,
        int *index) = 0;

    virtual HRESULT STDMETHODCALLTYPE getIndexFromQName(
        const WCHAR *pQName,
        int nQNameLength,
        int *index) = 0;

    virtual HRESULT STDMETHODCALLTYPE getType(
        int nIndex,
        const WCHAR **pType,
        int *pTypeLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE getTypeFromName(
        const WCHAR *pUri,
        int nUri,
        const WCHAR *pLocalName,
        int nLocalName,
        const WCHAR **pType,
        int *nType) = 0;

    virtual HRESULT STDMETHODCALLTYPE getTypeFromQName(
        const WCHAR *pQName,
        int nQName,
        const WCHAR **pType,
        int *nType) = 0;

    virtual HRESULT STDMETHODCALLTYPE getValue(
        int nIndex,
        const WCHAR **pValue,
        int *nValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE getValueFromName(
        const WCHAR *pUri,
        int nUri,
        const WCHAR *pLocalName,
        int nLocalName,
        const WCHAR **pValue,
        int *nValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE getValueFromQName(
        const WCHAR *pQName,
        int nQName,
        const WCHAR **pValue,
        int *nValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISAXAttributes, 0xf078abe1, 0x45d2, 0x4832, 0x91,0xea, 0x44,0x66,0xce,0x2f,0x25,0xc9)
#endif
#else
typedef struct ISAXAttributesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISAXAttributes *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISAXAttributes *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISAXAttributes *This);

    /*** ISAXAttributes methods ***/
    HRESULT (STDMETHODCALLTYPE *getLength)(
        ISAXAttributes *This,
        int *length);

    HRESULT (STDMETHODCALLTYPE *getURI)(
        ISAXAttributes *This,
        int nIndex,
        const WCHAR **pUrl,
        int *pUriSize);

    HRESULT (STDMETHODCALLTYPE *getLocalName)(
        ISAXAttributes *This,
        int nIndex,
        const WCHAR **pLocalName,
        int *pLocalNameLength);

    HRESULT (STDMETHODCALLTYPE *getQName)(
        ISAXAttributes *This,
        int nIndex,
        const WCHAR **pQName,
        int *pQNameLength);

    HRESULT (STDMETHODCALLTYPE *getName)(
        ISAXAttributes *This,
        int nIndex,
        const WCHAR **pUri,
        int *pUriLength,
        const WCHAR **pLocalName,
        int *pLocalNameSize,
        const WCHAR **pQName,
        int *pQNameLength);

    HRESULT (STDMETHODCALLTYPE *getIndexFromName)(
        ISAXAttributes *This,
        const WCHAR *pUri,
        int cUriLength,
        const WCHAR *pLocalName,
        int cocalNameLength,
        int *index);

    HRESULT (STDMETHODCALLTYPE *getIndexFromQName)(
        ISAXAttributes *This,
        const WCHAR *pQName,
        int nQNameLength,
        int *index);

    HRESULT (STDMETHODCALLTYPE *getType)(
        ISAXAttributes *This,
        int nIndex,
        const WCHAR **pType,
        int *pTypeLength);

    HRESULT (STDMETHODCALLTYPE *getTypeFromName)(
        ISAXAttributes *This,
        const WCHAR *pUri,
        int nUri,
        const WCHAR *pLocalName,
        int nLocalName,
        const WCHAR **pType,
        int *nType);

    HRESULT (STDMETHODCALLTYPE *getTypeFromQName)(
        ISAXAttributes *This,
        const WCHAR *pQName,
        int nQName,
        const WCHAR **pType,
        int *nType);

    HRESULT (STDMETHODCALLTYPE *getValue)(
        ISAXAttributes *This,
        int nIndex,
        const WCHAR **pValue,
        int *nValue);

    HRESULT (STDMETHODCALLTYPE *getValueFromName)(
        ISAXAttributes *This,
        const WCHAR *pUri,
        int nUri,
        const WCHAR *pLocalName,
        int nLocalName,
        const WCHAR **pValue,
        int *nValue);

    HRESULT (STDMETHODCALLTYPE *getValueFromQName)(
        ISAXAttributes *This,
        const WCHAR *pQName,
        int nQName,
        const WCHAR **pValue,
        int *nValue);

    END_INTERFACE
} ISAXAttributesVtbl;

interface ISAXAttributes {
    CONST_VTBL ISAXAttributesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISAXAttributes_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISAXAttributes_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISAXAttributes_Release(This) (This)->lpVtbl->Release(This)
/*** ISAXAttributes methods ***/
#define ISAXAttributes_getLength(This,length) (This)->lpVtbl->getLength(This,length)
#define ISAXAttributes_getURI(This,nIndex,pUrl,pUriSize) (This)->lpVtbl->getURI(This,nIndex,pUrl,pUriSize)
#define ISAXAttributes_getLocalName(This,nIndex,pLocalName,pLocalNameLength) (This)->lpVtbl->getLocalName(This,nIndex,pLocalName,pLocalNameLength)
#define ISAXAttributes_getQName(This,nIndex,pQName,pQNameLength) (This)->lpVtbl->getQName(This,nIndex,pQName,pQNameLength)
#define ISAXAttributes_getName(This,nIndex,pUri,pUriLength,pLocalName,pLocalNameSize,pQName,pQNameLength) (This)->lpVtbl->getName(This,nIndex,pUri,pUriLength,pLocalName,pLocalNameSize,pQName,pQNameLength)
#define ISAXAttributes_getIndexFromName(This,pUri,cUriLength,pLocalName,cocalNameLength,index) (This)->lpVtbl->getIndexFromName(This,pUri,cUriLength,pLocalName,cocalNameLength,index)
#define ISAXAttributes_getIndexFromQName(This,pQName,nQNameLength,index) (This)->lpVtbl->getIndexFromQName(This,pQName,nQNameLength,index)
#define ISAXAttributes_getType(This,nIndex,pType,pTypeLength) (This)->lpVtbl->getType(This,nIndex,pType,pTypeLength)
#define ISAXAttributes_getTypeFromName(This,pUri,nUri,pLocalName,nLocalName,pType,nType) (This)->lpVtbl->getTypeFromName(This,pUri,nUri,pLocalName,nLocalName,pType,nType)
#define ISAXAttributes_getTypeFromQName(This,pQName,nQName,pType,nType) (This)->lpVtbl->getTypeFromQName(This,pQName,nQName,pType,nType)
#define ISAXAttributes_getValue(This,nIndex,pValue,nValue) (This)->lpVtbl->getValue(This,nIndex,pValue,nValue)
#define ISAXAttributes_getValueFromName(This,pUri,nUri,pLocalName,nLocalName,pValue,nValue) (This)->lpVtbl->getValueFromName(This,pUri,nUri,pLocalName,nLocalName,pValue,nValue)
#define ISAXAttributes_getValueFromQName(This,pQName,nQName,pValue,nValue) (This)->lpVtbl->getValueFromQName(This,pQName,nQName,pValue,nValue)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISAXAttributes_QueryInterface(ISAXAttributes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISAXAttributes_AddRef(ISAXAttributes* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISAXAttributes_Release(ISAXAttributes* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXAttributes methods ***/
static __WIDL_INLINE HRESULT ISAXAttributes_getLength(ISAXAttributes* This,int *length) {
    return This->lpVtbl->getLength(This,length);
}
static __WIDL_INLINE HRESULT ISAXAttributes_getURI(ISAXAttributes* This,int nIndex,const WCHAR **pUrl,int *pUriSize) {
    return This->lpVtbl->getURI(This,nIndex,pUrl,pUriSize);
}
static __WIDL_INLINE HRESULT ISAXAttributes_getLocalName(ISAXAttributes* This,int nIndex,const WCHAR **pLocalName,int *pLocalNameLength) {
    return This->lpVtbl->getLocalName(This,nIndex,pLocalName,pLocalNameLength);
}
static __WIDL_INLINE HRESULT ISAXAttributes_getQName(ISAXAttributes* This,int nIndex,const WCHAR **pQName,int *pQNameLength) {
    return This->lpVtbl->getQName(This,nIndex,pQName,pQNameLength);
}
static __WIDL_INLINE HRESULT ISAXAttributes_getName(ISAXAttributes* This,int nIndex,const WCHAR **pUri,int *pUriLength,const WCHAR **pLocalName,int *pLocalNameSize,const WCHAR **pQName,int *pQNameLength) {
    return This->lpVtbl->getName(This,nIndex,pUri,pUriLength,pLocalName,pLocalNameSize,pQName,pQNameLength);
}
static __WIDL_INLINE HRESULT ISAXAttributes_getIndexFromName(ISAXAttributes* This,const WCHAR *pUri,int cUriLength,const WCHAR *pLocalName,int cocalNameLength,int *index) {
    return This->lpVtbl->getIndexFromName(This,pUri,cUriLength,pLocalName,cocalNameLength,index);
}
static __WIDL_INLINE HRESULT ISAXAttributes_getIndexFromQName(ISAXAttributes* This,const WCHAR *pQName,int nQNameLength,int *index) {
    return This->lpVtbl->getIndexFromQName(This,pQName,nQNameLength,index);
}
static __WIDL_INLINE HRESULT ISAXAttributes_getType(ISAXAttributes* This,int nIndex,const WCHAR **pType,int *pTypeLength) {
    return This->lpVtbl->getType(This,nIndex,pType,pTypeLength);
}
static __WIDL_INLINE HRESULT ISAXAttributes_getTypeFromName(ISAXAttributes* This,const WCHAR *pUri,int nUri,const WCHAR *pLocalName,int nLocalName,const WCHAR **pType,int *nType) {
    return This->lpVtbl->getTypeFromName(This,pUri,nUri,pLocalName,nLocalName,pType,nType);
}
static __WIDL_INLINE HRESULT ISAXAttributes_getTypeFromQName(ISAXAttributes* This,const WCHAR *pQName,int nQName,const WCHAR **pType,int *nType) {
    return This->lpVtbl->getTypeFromQName(This,pQName,nQName,pType,nType);
}
static __WIDL_INLINE HRESULT ISAXAttributes_getValue(ISAXAttributes* This,int nIndex,const WCHAR **pValue,int *nValue) {
    return This->lpVtbl->getValue(This,nIndex,pValue,nValue);
}
static __WIDL_INLINE HRESULT ISAXAttributes_getValueFromName(ISAXAttributes* This,const WCHAR *pUri,int nUri,const WCHAR *pLocalName,int nLocalName,const WCHAR **pValue,int *nValue) {
    return This->lpVtbl->getValueFromName(This,pUri,nUri,pLocalName,nLocalName,pValue,nValue);
}
static __WIDL_INLINE HRESULT ISAXAttributes_getValueFromQName(ISAXAttributes* This,const WCHAR *pQName,int nQName,const WCHAR **pValue,int *nValue) {
    return This->lpVtbl->getValueFromQName(This,pQName,nQName,pValue,nValue);
}
#endif
#endif

#endif


#endif  /* __ISAXAttributes_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISAXContentHandler interface
 */
#ifndef __ISAXContentHandler_INTERFACE_DEFINED__
#define __ISAXContentHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISAXContentHandler, 0x1545cdfa, 0x9e4e, 0x4497, 0xa8,0xa4, 0x2b,0xf7,0xd0,0x11,0x2c,0x44);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1545cdfa-9e4e-4497-a8a4-2bf7d0112c44")
ISAXContentHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE putDocumentLocator(
        ISAXLocator *pLocator) = 0;

    virtual HRESULT STDMETHODCALLTYPE startDocument(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE endDocument(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE startPrefixMapping(
        const WCHAR *pPrefix,
        int nPrefix,
        const WCHAR *pUri,
        int nUri) = 0;

    virtual HRESULT STDMETHODCALLTYPE endPrefixMapping(
        const WCHAR *pPrefix,
        int nPrefix) = 0;

    virtual HRESULT STDMETHODCALLTYPE startElement(
        const WCHAR *pNamespaceUri,
        int nNamespaceUri,
        const WCHAR *pLocalName,
        int nLocalName,
        const WCHAR *pQName,
        int nQName,
        ISAXAttributes *pAttr) = 0;

    virtual HRESULT STDMETHODCALLTYPE endElement(
        const WCHAR *pNamespaceUri,
        int nNamespaceUri,
        const WCHAR *pLocalName,
        int nLocalName,
        const WCHAR *pQName,
        int nQName) = 0;

    virtual HRESULT STDMETHODCALLTYPE characters(
        const WCHAR *pChars,
        int nChars) = 0;

    virtual HRESULT STDMETHODCALLTYPE ignorableWhitespace(
        const WCHAR *pChars,
        int nChars) = 0;

    virtual HRESULT STDMETHODCALLTYPE processingInstruction(
        const WCHAR *pTarget,
        int nTarget,
        const WCHAR *pData,
        int nData) = 0;

    virtual HRESULT STDMETHODCALLTYPE skippedEntity(
        const WCHAR *pName,
        int nName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISAXContentHandler, 0x1545cdfa, 0x9e4e, 0x4497, 0xa8,0xa4, 0x2b,0xf7,0xd0,0x11,0x2c,0x44)
#endif
#else
typedef struct ISAXContentHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISAXContentHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISAXContentHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISAXContentHandler *This);

    /*** ISAXContentHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *putDocumentLocator)(
        ISAXContentHandler *This,
        ISAXLocator *pLocator);

    HRESULT (STDMETHODCALLTYPE *startDocument)(
        ISAXContentHandler *This);

    HRESULT (STDMETHODCALLTYPE *endDocument)(
        ISAXContentHandler *This);

    HRESULT (STDMETHODCALLTYPE *startPrefixMapping)(
        ISAXContentHandler *This,
        const WCHAR *pPrefix,
        int nPrefix,
        const WCHAR *pUri,
        int nUri);

    HRESULT (STDMETHODCALLTYPE *endPrefixMapping)(
        ISAXContentHandler *This,
        const WCHAR *pPrefix,
        int nPrefix);

    HRESULT (STDMETHODCALLTYPE *startElement)(
        ISAXContentHandler *This,
        const WCHAR *pNamespaceUri,
        int nNamespaceUri,
        const WCHAR *pLocalName,
        int nLocalName,
        const WCHAR *pQName,
        int nQName,
        ISAXAttributes *pAttr);

    HRESULT (STDMETHODCALLTYPE *endElement)(
        ISAXContentHandler *This,
        const WCHAR *pNamespaceUri,
        int nNamespaceUri,
        const WCHAR *pLocalName,
        int nLocalName,
        const WCHAR *pQName,
        int nQName);

    HRESULT (STDMETHODCALLTYPE *characters)(
        ISAXContentHandler *This,
        const WCHAR *pChars,
        int nChars);

    HRESULT (STDMETHODCALLTYPE *ignorableWhitespace)(
        ISAXContentHandler *This,
        const WCHAR *pChars,
        int nChars);

    HRESULT (STDMETHODCALLTYPE *processingInstruction)(
        ISAXContentHandler *This,
        const WCHAR *pTarget,
        int nTarget,
        const WCHAR *pData,
        int nData);

    HRESULT (STDMETHODCALLTYPE *skippedEntity)(
        ISAXContentHandler *This,
        const WCHAR *pName,
        int nName);

    END_INTERFACE
} ISAXContentHandlerVtbl;

interface ISAXContentHandler {
    CONST_VTBL ISAXContentHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISAXContentHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISAXContentHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISAXContentHandler_Release(This) (This)->lpVtbl->Release(This)
/*** ISAXContentHandler methods ***/
#define ISAXContentHandler_putDocumentLocator(This,pLocator) (This)->lpVtbl->putDocumentLocator(This,pLocator)
#define ISAXContentHandler_startDocument(This) (This)->lpVtbl->startDocument(This)
#define ISAXContentHandler_endDocument(This) (This)->lpVtbl->endDocument(This)
#define ISAXContentHandler_startPrefixMapping(This,pPrefix,nPrefix,pUri,nUri) (This)->lpVtbl->startPrefixMapping(This,pPrefix,nPrefix,pUri,nUri)
#define ISAXContentHandler_endPrefixMapping(This,pPrefix,nPrefix) (This)->lpVtbl->endPrefixMapping(This,pPrefix,nPrefix)
#define ISAXContentHandler_startElement(This,pNamespaceUri,nNamespaceUri,pLocalName,nLocalName,pQName,nQName,pAttr) (This)->lpVtbl->startElement(This,pNamespaceUri,nNamespaceUri,pLocalName,nLocalName,pQName,nQName,pAttr)
#define ISAXContentHandler_endElement(This,pNamespaceUri,nNamespaceUri,pLocalName,nLocalName,pQName,nQName) (This)->lpVtbl->endElement(This,pNamespaceUri,nNamespaceUri,pLocalName,nLocalName,pQName,nQName)
#define ISAXContentHandler_characters(This,pChars,nChars) (This)->lpVtbl->characters(This,pChars,nChars)
#define ISAXContentHandler_ignorableWhitespace(This,pChars,nChars) (This)->lpVtbl->ignorableWhitespace(This,pChars,nChars)
#define ISAXContentHandler_processingInstruction(This,pTarget,nTarget,pData,nData) (This)->lpVtbl->processingInstruction(This,pTarget,nTarget,pData,nData)
#define ISAXContentHandler_skippedEntity(This,pName,nName) (This)->lpVtbl->skippedEntity(This,pName,nName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISAXContentHandler_QueryInterface(ISAXContentHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISAXContentHandler_AddRef(ISAXContentHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISAXContentHandler_Release(ISAXContentHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXContentHandler methods ***/
static __WIDL_INLINE HRESULT ISAXContentHandler_putDocumentLocator(ISAXContentHandler* This,ISAXLocator *pLocator) {
    return This->lpVtbl->putDocumentLocator(This,pLocator);
}
static __WIDL_INLINE HRESULT ISAXContentHandler_startDocument(ISAXContentHandler* This) {
    return This->lpVtbl->startDocument(This);
}
static __WIDL_INLINE HRESULT ISAXContentHandler_endDocument(ISAXContentHandler* This) {
    return This->lpVtbl->endDocument(This);
}
static __WIDL_INLINE HRESULT ISAXContentHandler_startPrefixMapping(ISAXContentHandler* This,const WCHAR *pPrefix,int nPrefix,const WCHAR *pUri,int nUri) {
    return This->lpVtbl->startPrefixMapping(This,pPrefix,nPrefix,pUri,nUri);
}
static __WIDL_INLINE HRESULT ISAXContentHandler_endPrefixMapping(ISAXContentHandler* This,const WCHAR *pPrefix,int nPrefix) {
    return This->lpVtbl->endPrefixMapping(This,pPrefix,nPrefix);
}
static __WIDL_INLINE HRESULT ISAXContentHandler_startElement(ISAXContentHandler* This,const WCHAR *pNamespaceUri,int nNamespaceUri,const WCHAR *pLocalName,int nLocalName,const WCHAR *pQName,int nQName,ISAXAttributes *pAttr) {
    return This->lpVtbl->startElement(This,pNamespaceUri,nNamespaceUri,pLocalName,nLocalName,pQName,nQName,pAttr);
}
static __WIDL_INLINE HRESULT ISAXContentHandler_endElement(ISAXContentHandler* This,const WCHAR *pNamespaceUri,int nNamespaceUri,const WCHAR *pLocalName,int nLocalName,const WCHAR *pQName,int nQName) {
    return This->lpVtbl->endElement(This,pNamespaceUri,nNamespaceUri,pLocalName,nLocalName,pQName,nQName);
}
static __WIDL_INLINE HRESULT ISAXContentHandler_characters(ISAXContentHandler* This,const WCHAR *pChars,int nChars) {
    return This->lpVtbl->characters(This,pChars,nChars);
}
static __WIDL_INLINE HRESULT ISAXContentHandler_ignorableWhitespace(ISAXContentHandler* This,const WCHAR *pChars,int nChars) {
    return This->lpVtbl->ignorableWhitespace(This,pChars,nChars);
}
static __WIDL_INLINE HRESULT ISAXContentHandler_processingInstruction(ISAXContentHandler* This,const WCHAR *pTarget,int nTarget,const WCHAR *pData,int nData) {
    return This->lpVtbl->processingInstruction(This,pTarget,nTarget,pData,nData);
}
static __WIDL_INLINE HRESULT ISAXContentHandler_skippedEntity(ISAXContentHandler* This,const WCHAR *pName,int nName) {
    return This->lpVtbl->skippedEntity(This,pName,nName);
}
#endif
#endif

#endif


#endif  /* __ISAXContentHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISAXDeclHandler interface
 */
#ifndef __ISAXDeclHandler_INTERFACE_DEFINED__
#define __ISAXDeclHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISAXDeclHandler, 0x862629ac, 0x771a, 0x47b2, 0x83,0x37, 0x4e,0x68,0x43,0xc1,0xbe,0x90);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("862629ac-771a-47b2-8337-4e6843c1be90")
ISAXDeclHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE elementDecl(
        const WCHAR *pName,
        int nName,
        const WCHAR *pModel,
        int nModel) = 0;

    virtual HRESULT STDMETHODCALLTYPE attributeDecl(
        const WCHAR *pElementName,
        int nElementName,
        const WCHAR *pAttributeName,
        int nAttributeName,
        const WCHAR *pType,
        int nType,
        const WCHAR *pValueDefault,
        int nValueDefault,
        const WCHAR *pValue,
        int nValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE internalEntityDecl(
        const WCHAR *pName,
        int nName,
        const WCHAR *pValue,
        int nValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE externalEntityDecl(
        const WCHAR *pName,
        int nName,
        const WCHAR *pPublicId,
        int nPublicId,
        const WCHAR *pSystemId,
        int nSystemId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISAXDeclHandler, 0x862629ac, 0x771a, 0x47b2, 0x83,0x37, 0x4e,0x68,0x43,0xc1,0xbe,0x90)
#endif
#else
typedef struct ISAXDeclHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISAXDeclHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISAXDeclHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISAXDeclHandler *This);

    /*** ISAXDeclHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *elementDecl)(
        ISAXDeclHandler *This,
        const WCHAR *pName,
        int nName,
        const WCHAR *pModel,
        int nModel);

    HRESULT (STDMETHODCALLTYPE *attributeDecl)(
        ISAXDeclHandler *This,
        const WCHAR *pElementName,
        int nElementName,
        const WCHAR *pAttributeName,
        int nAttributeName,
        const WCHAR *pType,
        int nType,
        const WCHAR *pValueDefault,
        int nValueDefault,
        const WCHAR *pValue,
        int nValue);

    HRESULT (STDMETHODCALLTYPE *internalEntityDecl)(
        ISAXDeclHandler *This,
        const WCHAR *pName,
        int nName,
        const WCHAR *pValue,
        int nValue);

    HRESULT (STDMETHODCALLTYPE *externalEntityDecl)(
        ISAXDeclHandler *This,
        const WCHAR *pName,
        int nName,
        const WCHAR *pPublicId,
        int nPublicId,
        const WCHAR *pSystemId,
        int nSystemId);

    END_INTERFACE
} ISAXDeclHandlerVtbl;

interface ISAXDeclHandler {
    CONST_VTBL ISAXDeclHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISAXDeclHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISAXDeclHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISAXDeclHandler_Release(This) (This)->lpVtbl->Release(This)
/*** ISAXDeclHandler methods ***/
#define ISAXDeclHandler_elementDecl(This,pName,nName,pModel,nModel) (This)->lpVtbl->elementDecl(This,pName,nName,pModel,nModel)
#define ISAXDeclHandler_attributeDecl(This,pElementName,nElementName,pAttributeName,nAttributeName,pType,nType,pValueDefault,nValueDefault,pValue,nValue) (This)->lpVtbl->attributeDecl(This,pElementName,nElementName,pAttributeName,nAttributeName,pType,nType,pValueDefault,nValueDefault,pValue,nValue)
#define ISAXDeclHandler_internalEntityDecl(This,pName,nName,pValue,nValue) (This)->lpVtbl->internalEntityDecl(This,pName,nName,pValue,nValue)
#define ISAXDeclHandler_externalEntityDecl(This,pName,nName,pPublicId,nPublicId,pSystemId,nSystemId) (This)->lpVtbl->externalEntityDecl(This,pName,nName,pPublicId,nPublicId,pSystemId,nSystemId)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISAXDeclHandler_QueryInterface(ISAXDeclHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISAXDeclHandler_AddRef(ISAXDeclHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISAXDeclHandler_Release(ISAXDeclHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXDeclHandler methods ***/
static __WIDL_INLINE HRESULT ISAXDeclHandler_elementDecl(ISAXDeclHandler* This,const WCHAR *pName,int nName,const WCHAR *pModel,int nModel) {
    return This->lpVtbl->elementDecl(This,pName,nName,pModel,nModel);
}
static __WIDL_INLINE HRESULT ISAXDeclHandler_attributeDecl(ISAXDeclHandler* This,const WCHAR *pElementName,int nElementName,const WCHAR *pAttributeName,int nAttributeName,const WCHAR *pType,int nType,const WCHAR *pValueDefault,int nValueDefault,const WCHAR *pValue,int nValue) {
    return This->lpVtbl->attributeDecl(This,pElementName,nElementName,pAttributeName,nAttributeName,pType,nType,pValueDefault,nValueDefault,pValue,nValue);
}
static __WIDL_INLINE HRESULT ISAXDeclHandler_internalEntityDecl(ISAXDeclHandler* This,const WCHAR *pName,int nName,const WCHAR *pValue,int nValue) {
    return This->lpVtbl->internalEntityDecl(This,pName,nName,pValue,nValue);
}
static __WIDL_INLINE HRESULT ISAXDeclHandler_externalEntityDecl(ISAXDeclHandler* This,const WCHAR *pName,int nName,const WCHAR *pPublicId,int nPublicId,const WCHAR *pSystemId,int nSystemId) {
    return This->lpVtbl->externalEntityDecl(This,pName,nName,pPublicId,nPublicId,pSystemId,nSystemId);
}
#endif
#endif

#endif


#endif  /* __ISAXDeclHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISAXDTDHandler interface
 */
#ifndef __ISAXDTDHandler_INTERFACE_DEFINED__
#define __ISAXDTDHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISAXDTDHandler, 0xe15c1baf, 0xafb3, 0x4d60, 0x8c,0x36, 0x19,0xa8,0xc4,0x5d,0xef,0xed);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e15c1baf-afb3-4d60-8c36-19a8c45defed")
ISAXDTDHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE notationDecl(
        const WCHAR *pName,
        int nName,
        const WCHAR *pPublicId,
        int nPublicId,
        const WCHAR *pSystemId,
        int nSystemId) = 0;

    virtual HRESULT STDMETHODCALLTYPE unparsedEntityDecl(
        const WCHAR *pName,
        int nName,
        const WCHAR *pPublicId,
        int nPublicId,
        const WCHAR *pSystemId,
        int nSystemId,
        const WCHAR *pNotationName,
        int nNotationName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISAXDTDHandler, 0xe15c1baf, 0xafb3, 0x4d60, 0x8c,0x36, 0x19,0xa8,0xc4,0x5d,0xef,0xed)
#endif
#else
typedef struct ISAXDTDHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISAXDTDHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISAXDTDHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISAXDTDHandler *This);

    /*** ISAXDTDHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *notationDecl)(
        ISAXDTDHandler *This,
        const WCHAR *pName,
        int nName,
        const WCHAR *pPublicId,
        int nPublicId,
        const WCHAR *pSystemId,
        int nSystemId);

    HRESULT (STDMETHODCALLTYPE *unparsedEntityDecl)(
        ISAXDTDHandler *This,
        const WCHAR *pName,
        int nName,
        const WCHAR *pPublicId,
        int nPublicId,
        const WCHAR *pSystemId,
        int nSystemId,
        const WCHAR *pNotationName,
        int nNotationName);

    END_INTERFACE
} ISAXDTDHandlerVtbl;

interface ISAXDTDHandler {
    CONST_VTBL ISAXDTDHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISAXDTDHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISAXDTDHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISAXDTDHandler_Release(This) (This)->lpVtbl->Release(This)
/*** ISAXDTDHandler methods ***/
#define ISAXDTDHandler_notationDecl(This,pName,nName,pPublicId,nPublicId,pSystemId,nSystemId) (This)->lpVtbl->notationDecl(This,pName,nName,pPublicId,nPublicId,pSystemId,nSystemId)
#define ISAXDTDHandler_unparsedEntityDecl(This,pName,nName,pPublicId,nPublicId,pSystemId,nSystemId,pNotationName,nNotationName) (This)->lpVtbl->unparsedEntityDecl(This,pName,nName,pPublicId,nPublicId,pSystemId,nSystemId,pNotationName,nNotationName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISAXDTDHandler_QueryInterface(ISAXDTDHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISAXDTDHandler_AddRef(ISAXDTDHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISAXDTDHandler_Release(ISAXDTDHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXDTDHandler methods ***/
static __WIDL_INLINE HRESULT ISAXDTDHandler_notationDecl(ISAXDTDHandler* This,const WCHAR *pName,int nName,const WCHAR *pPublicId,int nPublicId,const WCHAR *pSystemId,int nSystemId) {
    return This->lpVtbl->notationDecl(This,pName,nName,pPublicId,nPublicId,pSystemId,nSystemId);
}
static __WIDL_INLINE HRESULT ISAXDTDHandler_unparsedEntityDecl(ISAXDTDHandler* This,const WCHAR *pName,int nName,const WCHAR *pPublicId,int nPublicId,const WCHAR *pSystemId,int nSystemId,const WCHAR *pNotationName,int nNotationName) {
    return This->lpVtbl->unparsedEntityDecl(This,pName,nName,pPublicId,nPublicId,pSystemId,nSystemId,pNotationName,nNotationName);
}
#endif
#endif

#endif


#endif  /* __ISAXDTDHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISAXEntityResolver interface
 */
#ifndef __ISAXEntityResolver_INTERFACE_DEFINED__
#define __ISAXEntityResolver_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISAXEntityResolver, 0x99bca7bd, 0xe8c4, 0x4d5f, 0xa0,0xcf, 0x6d,0x90,0x79,0x01,0xff,0x07);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("99bca7bd-e8c4-4d5f-a0cf-6d907901ff07")
ISAXEntityResolver : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE resolveEntity(
        const WCHAR *pPublicId,
        const WCHAR *pSystemId,
        VARIANT *ret) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISAXEntityResolver, 0x99bca7bd, 0xe8c4, 0x4d5f, 0xa0,0xcf, 0x6d,0x90,0x79,0x01,0xff,0x07)
#endif
#else
typedef struct ISAXEntityResolverVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISAXEntityResolver *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISAXEntityResolver *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISAXEntityResolver *This);

    /*** ISAXEntityResolver methods ***/
    HRESULT (STDMETHODCALLTYPE *resolveEntity)(
        ISAXEntityResolver *This,
        const WCHAR *pPublicId,
        const WCHAR *pSystemId,
        VARIANT *ret);

    END_INTERFACE
} ISAXEntityResolverVtbl;

interface ISAXEntityResolver {
    CONST_VTBL ISAXEntityResolverVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISAXEntityResolver_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISAXEntityResolver_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISAXEntityResolver_Release(This) (This)->lpVtbl->Release(This)
/*** ISAXEntityResolver methods ***/
#define ISAXEntityResolver_resolveEntity(This,pPublicId,pSystemId,ret) (This)->lpVtbl->resolveEntity(This,pPublicId,pSystemId,ret)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISAXEntityResolver_QueryInterface(ISAXEntityResolver* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISAXEntityResolver_AddRef(ISAXEntityResolver* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISAXEntityResolver_Release(ISAXEntityResolver* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXEntityResolver methods ***/
static __WIDL_INLINE HRESULT ISAXEntityResolver_resolveEntity(ISAXEntityResolver* This,const WCHAR *pPublicId,const WCHAR *pSystemId,VARIANT *ret) {
    return This->lpVtbl->resolveEntity(This,pPublicId,pSystemId,ret);
}
#endif
#endif

#endif


#endif  /* __ISAXEntityResolver_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISAXErrorHandler interface
 */
#ifndef __ISAXErrorHandler_INTERFACE_DEFINED__
#define __ISAXErrorHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISAXErrorHandler, 0xa60511c4, 0xccf5, 0x479e, 0x98,0xa3, 0xdc,0x8d,0xc5,0x45,0xb7,0xd0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a60511c4-ccf5-479e-98a3-dc8dc545b7d0")
ISAXErrorHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE error(
        ISAXLocator *pLocator,
        const WCHAR *pErrorMessage,
        HRESULT hrErrorCode) = 0;

    virtual HRESULT STDMETHODCALLTYPE fatalError(
        ISAXLocator *pLocator,
        const WCHAR *pErrorMessage,
        HRESULT hrErrorCode) = 0;

    virtual HRESULT STDMETHODCALLTYPE ignorableWarning(
        ISAXLocator *pLocator,
        const WCHAR *pErrorMessage,
        HRESULT hrErrorCode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISAXErrorHandler, 0xa60511c4, 0xccf5, 0x479e, 0x98,0xa3, 0xdc,0x8d,0xc5,0x45,0xb7,0xd0)
#endif
#else
typedef struct ISAXErrorHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISAXErrorHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISAXErrorHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISAXErrorHandler *This);

    /*** ISAXErrorHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *error)(
        ISAXErrorHandler *This,
        ISAXLocator *pLocator,
        const WCHAR *pErrorMessage,
        HRESULT hrErrorCode);

    HRESULT (STDMETHODCALLTYPE *fatalError)(
        ISAXErrorHandler *This,
        ISAXLocator *pLocator,
        const WCHAR *pErrorMessage,
        HRESULT hrErrorCode);

    HRESULT (STDMETHODCALLTYPE *ignorableWarning)(
        ISAXErrorHandler *This,
        ISAXLocator *pLocator,
        const WCHAR *pErrorMessage,
        HRESULT hrErrorCode);

    END_INTERFACE
} ISAXErrorHandlerVtbl;

interface ISAXErrorHandler {
    CONST_VTBL ISAXErrorHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISAXErrorHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISAXErrorHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISAXErrorHandler_Release(This) (This)->lpVtbl->Release(This)
/*** ISAXErrorHandler methods ***/
#define ISAXErrorHandler_error(This,pLocator,pErrorMessage,hrErrorCode) (This)->lpVtbl->error(This,pLocator,pErrorMessage,hrErrorCode)
#define ISAXErrorHandler_fatalError(This,pLocator,pErrorMessage,hrErrorCode) (This)->lpVtbl->fatalError(This,pLocator,pErrorMessage,hrErrorCode)
#define ISAXErrorHandler_ignorableWarning(This,pLocator,pErrorMessage,hrErrorCode) (This)->lpVtbl->ignorableWarning(This,pLocator,pErrorMessage,hrErrorCode)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISAXErrorHandler_QueryInterface(ISAXErrorHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISAXErrorHandler_AddRef(ISAXErrorHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISAXErrorHandler_Release(ISAXErrorHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXErrorHandler methods ***/
static __WIDL_INLINE HRESULT ISAXErrorHandler_error(ISAXErrorHandler* This,ISAXLocator *pLocator,const WCHAR *pErrorMessage,HRESULT hrErrorCode) {
    return This->lpVtbl->error(This,pLocator,pErrorMessage,hrErrorCode);
}
static __WIDL_INLINE HRESULT ISAXErrorHandler_fatalError(ISAXErrorHandler* This,ISAXLocator *pLocator,const WCHAR *pErrorMessage,HRESULT hrErrorCode) {
    return This->lpVtbl->fatalError(This,pLocator,pErrorMessage,hrErrorCode);
}
static __WIDL_INLINE HRESULT ISAXErrorHandler_ignorableWarning(ISAXErrorHandler* This,ISAXLocator *pLocator,const WCHAR *pErrorMessage,HRESULT hrErrorCode) {
    return This->lpVtbl->ignorableWarning(This,pLocator,pErrorMessage,hrErrorCode);
}
#endif
#endif

#endif


#endif  /* __ISAXErrorHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISAXLexicalHandler interface
 */
#ifndef __ISAXLexicalHandler_INTERFACE_DEFINED__
#define __ISAXLexicalHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISAXLexicalHandler, 0x7f85d5f5, 0x47a8, 0x4497, 0xbd,0xa5, 0x84,0xba,0x04,0x81,0x9e,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7f85d5f5-47a8-4497-bda5-84ba04819ea6")
ISAXLexicalHandler : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE startDTD(
        const WCHAR *pName,
        int nName,
        const WCHAR *pPublicId,
        int nPublicId,
        const WCHAR *pSystemId,
        int nSystemId) = 0;

    virtual HRESULT STDMETHODCALLTYPE endDTD(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE startEntity(
        const WCHAR *pName,
        int nName) = 0;

    virtual HRESULT STDMETHODCALLTYPE endEntity(
        const WCHAR *pName,
        int nName) = 0;

    virtual HRESULT STDMETHODCALLTYPE startCDATA(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE endCDATA(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE comment(
        const WCHAR *pChars,
        int nChars) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISAXLexicalHandler, 0x7f85d5f5, 0x47a8, 0x4497, 0xbd,0xa5, 0x84,0xba,0x04,0x81,0x9e,0xa6)
#endif
#else
typedef struct ISAXLexicalHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISAXLexicalHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISAXLexicalHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISAXLexicalHandler *This);

    /*** ISAXLexicalHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *startDTD)(
        ISAXLexicalHandler *This,
        const WCHAR *pName,
        int nName,
        const WCHAR *pPublicId,
        int nPublicId,
        const WCHAR *pSystemId,
        int nSystemId);

    HRESULT (STDMETHODCALLTYPE *endDTD)(
        ISAXLexicalHandler *This);

    HRESULT (STDMETHODCALLTYPE *startEntity)(
        ISAXLexicalHandler *This,
        const WCHAR *pName,
        int nName);

    HRESULT (STDMETHODCALLTYPE *endEntity)(
        ISAXLexicalHandler *This,
        const WCHAR *pName,
        int nName);

    HRESULT (STDMETHODCALLTYPE *startCDATA)(
        ISAXLexicalHandler *This);

    HRESULT (STDMETHODCALLTYPE *endCDATA)(
        ISAXLexicalHandler *This);

    HRESULT (STDMETHODCALLTYPE *comment)(
        ISAXLexicalHandler *This,
        const WCHAR *pChars,
        int nChars);

    END_INTERFACE
} ISAXLexicalHandlerVtbl;

interface ISAXLexicalHandler {
    CONST_VTBL ISAXLexicalHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISAXLexicalHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISAXLexicalHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISAXLexicalHandler_Release(This) (This)->lpVtbl->Release(This)
/*** ISAXLexicalHandler methods ***/
#define ISAXLexicalHandler_startDTD(This,pName,nName,pPublicId,nPublicId,pSystemId,nSystemId) (This)->lpVtbl->startDTD(This,pName,nName,pPublicId,nPublicId,pSystemId,nSystemId)
#define ISAXLexicalHandler_endDTD(This) (This)->lpVtbl->endDTD(This)
#define ISAXLexicalHandler_startEntity(This,pName,nName) (This)->lpVtbl->startEntity(This,pName,nName)
#define ISAXLexicalHandler_endEntity(This,pName,nName) (This)->lpVtbl->endEntity(This,pName,nName)
#define ISAXLexicalHandler_startCDATA(This) (This)->lpVtbl->startCDATA(This)
#define ISAXLexicalHandler_endCDATA(This) (This)->lpVtbl->endCDATA(This)
#define ISAXLexicalHandler_comment(This,pChars,nChars) (This)->lpVtbl->comment(This,pChars,nChars)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISAXLexicalHandler_QueryInterface(ISAXLexicalHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISAXLexicalHandler_AddRef(ISAXLexicalHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISAXLexicalHandler_Release(ISAXLexicalHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXLexicalHandler methods ***/
static __WIDL_INLINE HRESULT ISAXLexicalHandler_startDTD(ISAXLexicalHandler* This,const WCHAR *pName,int nName,const WCHAR *pPublicId,int nPublicId,const WCHAR *pSystemId,int nSystemId) {
    return This->lpVtbl->startDTD(This,pName,nName,pPublicId,nPublicId,pSystemId,nSystemId);
}
static __WIDL_INLINE HRESULT ISAXLexicalHandler_endDTD(ISAXLexicalHandler* This) {
    return This->lpVtbl->endDTD(This);
}
static __WIDL_INLINE HRESULT ISAXLexicalHandler_startEntity(ISAXLexicalHandler* This,const WCHAR *pName,int nName) {
    return This->lpVtbl->startEntity(This,pName,nName);
}
static __WIDL_INLINE HRESULT ISAXLexicalHandler_endEntity(ISAXLexicalHandler* This,const WCHAR *pName,int nName) {
    return This->lpVtbl->endEntity(This,pName,nName);
}
static __WIDL_INLINE HRESULT ISAXLexicalHandler_startCDATA(ISAXLexicalHandler* This) {
    return This->lpVtbl->startCDATA(This);
}
static __WIDL_INLINE HRESULT ISAXLexicalHandler_endCDATA(ISAXLexicalHandler* This) {
    return This->lpVtbl->endCDATA(This);
}
static __WIDL_INLINE HRESULT ISAXLexicalHandler_comment(ISAXLexicalHandler* This,const WCHAR *pChars,int nChars) {
    return This->lpVtbl->comment(This,pChars,nChars);
}
#endif
#endif

#endif


#endif  /* __ISAXLexicalHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISAXLocator interface
 */
#ifndef __ISAXLocator_INTERFACE_DEFINED__
#define __ISAXLocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISAXLocator, 0x9b7e472a, 0x0de4, 0x4640, 0xbf,0xf3, 0x84,0xd3,0x8a,0x05,0x1c,0x31);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9b7e472a-0de4-4640-bff3-84d38a051c31")
ISAXLocator : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE getColumnNumber(
        int *nColumn) = 0;

    virtual HRESULT STDMETHODCALLTYPE getLineNumber(
        int *nLine) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPublicId(
        const WCHAR **publicId) = 0;

    virtual HRESULT STDMETHODCALLTYPE getSystemId(
        const WCHAR **systemId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISAXLocator, 0x9b7e472a, 0x0de4, 0x4640, 0xbf,0xf3, 0x84,0xd3,0x8a,0x05,0x1c,0x31)
#endif
#else
typedef struct ISAXLocatorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISAXLocator *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISAXLocator *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISAXLocator *This);

    /*** ISAXLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *getColumnNumber)(
        ISAXLocator *This,
        int *nColumn);

    HRESULT (STDMETHODCALLTYPE *getLineNumber)(
        ISAXLocator *This,
        int *nLine);

    HRESULT (STDMETHODCALLTYPE *getPublicId)(
        ISAXLocator *This,
        const WCHAR **publicId);

    HRESULT (STDMETHODCALLTYPE *getSystemId)(
        ISAXLocator *This,
        const WCHAR **systemId);

    END_INTERFACE
} ISAXLocatorVtbl;

interface ISAXLocator {
    CONST_VTBL ISAXLocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISAXLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISAXLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISAXLocator_Release(This) (This)->lpVtbl->Release(This)
/*** ISAXLocator methods ***/
#define ISAXLocator_getColumnNumber(This,nColumn) (This)->lpVtbl->getColumnNumber(This,nColumn)
#define ISAXLocator_getLineNumber(This,nLine) (This)->lpVtbl->getLineNumber(This,nLine)
#define ISAXLocator_getPublicId(This,publicId) (This)->lpVtbl->getPublicId(This,publicId)
#define ISAXLocator_getSystemId(This,systemId) (This)->lpVtbl->getSystemId(This,systemId)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISAXLocator_QueryInterface(ISAXLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISAXLocator_AddRef(ISAXLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISAXLocator_Release(ISAXLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXLocator methods ***/
static __WIDL_INLINE HRESULT ISAXLocator_getColumnNumber(ISAXLocator* This,int *nColumn) {
    return This->lpVtbl->getColumnNumber(This,nColumn);
}
static __WIDL_INLINE HRESULT ISAXLocator_getLineNumber(ISAXLocator* This,int *nLine) {
    return This->lpVtbl->getLineNumber(This,nLine);
}
static __WIDL_INLINE HRESULT ISAXLocator_getPublicId(ISAXLocator* This,const WCHAR **publicId) {
    return This->lpVtbl->getPublicId(This,publicId);
}
static __WIDL_INLINE HRESULT ISAXLocator_getSystemId(ISAXLocator* This,const WCHAR **systemId) {
    return This->lpVtbl->getSystemId(This,systemId);
}
#endif
#endif

#endif


#endif  /* __ISAXLocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISAXXMLReader interface
 */
#ifndef __ISAXXMLReader_INTERFACE_DEFINED__
#define __ISAXXMLReader_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISAXXMLReader, 0xa4f96ed0, 0xf829, 0x476e, 0x81,0xc0, 0xcd,0xc7,0xbd,0x2a,0x08,0x02);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a4f96ed0-f829-476e-81c0-cdc7bd2a0802")
ISAXXMLReader : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE getFeature(
        const WCHAR *pFeature,
        VARIANT_BOOL *pValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE putFeature(
        const WCHAR *pFeature,
        VARIANT_BOOL vfValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE getProperty(
        const WCHAR *pProp,
        VARIANT *pValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE putProperty(
        const WCHAR *pProp,
        VARIANT value) = 0;

    virtual HRESULT STDMETHODCALLTYPE getEntityResolver(
        ISAXEntityResolver **ppEntityResolver) = 0;

    virtual HRESULT STDMETHODCALLTYPE putEntityResolver(
        ISAXEntityResolver *pEntityResolver) = 0;

    virtual HRESULT STDMETHODCALLTYPE getContentHandler(
        ISAXContentHandler **pContentHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE putContentHandler(
        ISAXContentHandler *contentHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE getDTDHandler(
        ISAXDTDHandler **pDTDHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE putDTDHandler(
        ISAXDTDHandler *pDTDHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE getErrorHandler(
        ISAXErrorHandler **pErrorHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE putErrorHandler(
        ISAXErrorHandler *errorHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE getBaseURL(
        const WCHAR **pBaseUrl) = 0;

    virtual HRESULT STDMETHODCALLTYPE putBaseURL(
        const WCHAR *pBaseUrl) = 0;

    virtual HRESULT STDMETHODCALLTYPE getSecureBaseURL(
        const WCHAR **pSecureBaseUrl) = 0;

    virtual HRESULT STDMETHODCALLTYPE putSecureBaseURL(
        const WCHAR *secureBaseUrl) = 0;

    virtual HRESULT STDMETHODCALLTYPE parse(
        VARIANT varInput) = 0;

    virtual HRESULT STDMETHODCALLTYPE parseURL(
        const WCHAR *url) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISAXXMLReader, 0xa4f96ed0, 0xf829, 0x476e, 0x81,0xc0, 0xcd,0xc7,0xbd,0x2a,0x08,0x02)
#endif
#else
typedef struct ISAXXMLReaderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISAXXMLReader *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISAXXMLReader *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISAXXMLReader *This);

    /*** ISAXXMLReader methods ***/
    HRESULT (STDMETHODCALLTYPE *getFeature)(
        ISAXXMLReader *This,
        const WCHAR *pFeature,
        VARIANT_BOOL *pValue);

    HRESULT (STDMETHODCALLTYPE *putFeature)(
        ISAXXMLReader *This,
        const WCHAR *pFeature,
        VARIANT_BOOL vfValue);

    HRESULT (STDMETHODCALLTYPE *getProperty)(
        ISAXXMLReader *This,
        const WCHAR *pProp,
        VARIANT *pValue);

    HRESULT (STDMETHODCALLTYPE *putProperty)(
        ISAXXMLReader *This,
        const WCHAR *pProp,
        VARIANT value);

    HRESULT (STDMETHODCALLTYPE *getEntityResolver)(
        ISAXXMLReader *This,
        ISAXEntityResolver **ppEntityResolver);

    HRESULT (STDMETHODCALLTYPE *putEntityResolver)(
        ISAXXMLReader *This,
        ISAXEntityResolver *pEntityResolver);

    HRESULT (STDMETHODCALLTYPE *getContentHandler)(
        ISAXXMLReader *This,
        ISAXContentHandler **pContentHandler);

    HRESULT (STDMETHODCALLTYPE *putContentHandler)(
        ISAXXMLReader *This,
        ISAXContentHandler *contentHandler);

    HRESULT (STDMETHODCALLTYPE *getDTDHandler)(
        ISAXXMLReader *This,
        ISAXDTDHandler **pDTDHandler);

    HRESULT (STDMETHODCALLTYPE *putDTDHandler)(
        ISAXXMLReader *This,
        ISAXDTDHandler *pDTDHandler);

    HRESULT (STDMETHODCALLTYPE *getErrorHandler)(
        ISAXXMLReader *This,
        ISAXErrorHandler **pErrorHandler);

    HRESULT (STDMETHODCALLTYPE *putErrorHandler)(
        ISAXXMLReader *This,
        ISAXErrorHandler *errorHandler);

    HRESULT (STDMETHODCALLTYPE *getBaseURL)(
        ISAXXMLReader *This,
        const WCHAR **pBaseUrl);

    HRESULT (STDMETHODCALLTYPE *putBaseURL)(
        ISAXXMLReader *This,
        const WCHAR *pBaseUrl);

    HRESULT (STDMETHODCALLTYPE *getSecureBaseURL)(
        ISAXXMLReader *This,
        const WCHAR **pSecureBaseUrl);

    HRESULT (STDMETHODCALLTYPE *putSecureBaseURL)(
        ISAXXMLReader *This,
        const WCHAR *secureBaseUrl);

    HRESULT (STDMETHODCALLTYPE *parse)(
        ISAXXMLReader *This,
        VARIANT varInput);

    HRESULT (STDMETHODCALLTYPE *parseURL)(
        ISAXXMLReader *This,
        const WCHAR *url);

    END_INTERFACE
} ISAXXMLReaderVtbl;

interface ISAXXMLReader {
    CONST_VTBL ISAXXMLReaderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISAXXMLReader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISAXXMLReader_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISAXXMLReader_Release(This) (This)->lpVtbl->Release(This)
/*** ISAXXMLReader methods ***/
#define ISAXXMLReader_getFeature(This,pFeature,pValue) (This)->lpVtbl->getFeature(This,pFeature,pValue)
#define ISAXXMLReader_putFeature(This,pFeature,vfValue) (This)->lpVtbl->putFeature(This,pFeature,vfValue)
#define ISAXXMLReader_getProperty(This,pProp,pValue) (This)->lpVtbl->getProperty(This,pProp,pValue)
#define ISAXXMLReader_putProperty(This,pProp,value) (This)->lpVtbl->putProperty(This,pProp,value)
#define ISAXXMLReader_getEntityResolver(This,ppEntityResolver) (This)->lpVtbl->getEntityResolver(This,ppEntityResolver)
#define ISAXXMLReader_putEntityResolver(This,pEntityResolver) (This)->lpVtbl->putEntityResolver(This,pEntityResolver)
#define ISAXXMLReader_getContentHandler(This,pContentHandler) (This)->lpVtbl->getContentHandler(This,pContentHandler)
#define ISAXXMLReader_putContentHandler(This,contentHandler) (This)->lpVtbl->putContentHandler(This,contentHandler)
#define ISAXXMLReader_getDTDHandler(This,pDTDHandler) (This)->lpVtbl->getDTDHandler(This,pDTDHandler)
#define ISAXXMLReader_putDTDHandler(This,pDTDHandler) (This)->lpVtbl->putDTDHandler(This,pDTDHandler)
#define ISAXXMLReader_getErrorHandler(This,pErrorHandler) (This)->lpVtbl->getErrorHandler(This,pErrorHandler)
#define ISAXXMLReader_putErrorHandler(This,errorHandler) (This)->lpVtbl->putErrorHandler(This,errorHandler)
#define ISAXXMLReader_getBaseURL(This,pBaseUrl) (This)->lpVtbl->getBaseURL(This,pBaseUrl)
#define ISAXXMLReader_putBaseURL(This,pBaseUrl) (This)->lpVtbl->putBaseURL(This,pBaseUrl)
#define ISAXXMLReader_getSecureBaseURL(This,pSecureBaseUrl) (This)->lpVtbl->getSecureBaseURL(This,pSecureBaseUrl)
#define ISAXXMLReader_putSecureBaseURL(This,secureBaseUrl) (This)->lpVtbl->putSecureBaseURL(This,secureBaseUrl)
#define ISAXXMLReader_parse(This,varInput) (This)->lpVtbl->parse(This,varInput)
#define ISAXXMLReader_parseURL(This,url) (This)->lpVtbl->parseURL(This,url)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISAXXMLReader_QueryInterface(ISAXXMLReader* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISAXXMLReader_AddRef(ISAXXMLReader* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISAXXMLReader_Release(ISAXXMLReader* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXXMLReader methods ***/
static __WIDL_INLINE HRESULT ISAXXMLReader_getFeature(ISAXXMLReader* This,const WCHAR *pFeature,VARIANT_BOOL *pValue) {
    return This->lpVtbl->getFeature(This,pFeature,pValue);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_putFeature(ISAXXMLReader* This,const WCHAR *pFeature,VARIANT_BOOL vfValue) {
    return This->lpVtbl->putFeature(This,pFeature,vfValue);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_getProperty(ISAXXMLReader* This,const WCHAR *pProp,VARIANT *pValue) {
    return This->lpVtbl->getProperty(This,pProp,pValue);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_putProperty(ISAXXMLReader* This,const WCHAR *pProp,VARIANT value) {
    return This->lpVtbl->putProperty(This,pProp,value);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_getEntityResolver(ISAXXMLReader* This,ISAXEntityResolver **ppEntityResolver) {
    return This->lpVtbl->getEntityResolver(This,ppEntityResolver);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_putEntityResolver(ISAXXMLReader* This,ISAXEntityResolver *pEntityResolver) {
    return This->lpVtbl->putEntityResolver(This,pEntityResolver);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_getContentHandler(ISAXXMLReader* This,ISAXContentHandler **pContentHandler) {
    return This->lpVtbl->getContentHandler(This,pContentHandler);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_putContentHandler(ISAXXMLReader* This,ISAXContentHandler *contentHandler) {
    return This->lpVtbl->putContentHandler(This,contentHandler);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_getDTDHandler(ISAXXMLReader* This,ISAXDTDHandler **pDTDHandler) {
    return This->lpVtbl->getDTDHandler(This,pDTDHandler);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_putDTDHandler(ISAXXMLReader* This,ISAXDTDHandler *pDTDHandler) {
    return This->lpVtbl->putDTDHandler(This,pDTDHandler);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_getErrorHandler(ISAXXMLReader* This,ISAXErrorHandler **pErrorHandler) {
    return This->lpVtbl->getErrorHandler(This,pErrorHandler);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_putErrorHandler(ISAXXMLReader* This,ISAXErrorHandler *errorHandler) {
    return This->lpVtbl->putErrorHandler(This,errorHandler);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_getBaseURL(ISAXXMLReader* This,const WCHAR **pBaseUrl) {
    return This->lpVtbl->getBaseURL(This,pBaseUrl);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_putBaseURL(ISAXXMLReader* This,const WCHAR *pBaseUrl) {
    return This->lpVtbl->putBaseURL(This,pBaseUrl);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_getSecureBaseURL(ISAXXMLReader* This,const WCHAR **pSecureBaseUrl) {
    return This->lpVtbl->getSecureBaseURL(This,pSecureBaseUrl);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_putSecureBaseURL(ISAXXMLReader* This,const WCHAR *secureBaseUrl) {
    return This->lpVtbl->putSecureBaseURL(This,secureBaseUrl);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_parse(ISAXXMLReader* This,VARIANT varInput) {
    return This->lpVtbl->parse(This,varInput);
}
static __WIDL_INLINE HRESULT ISAXXMLReader_parseURL(ISAXXMLReader* This,const WCHAR *url) {
    return This->lpVtbl->parseURL(This,url);
}
#endif
#endif

#endif


#endif  /* __ISAXXMLReader_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISAXXMLFilter interface
 */
#ifndef __ISAXXMLFilter_INTERFACE_DEFINED__
#define __ISAXXMLFilter_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISAXXMLFilter, 0x70409222, 0xca09, 0x4475, 0xac,0xb8, 0x40,0x31,0x2f,0xe8,0xd1,0x45);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("70409222-ca09-4475-acb8-40312fe8d145")
ISAXXMLFilter : public ISAXXMLReader
{
    virtual HRESULT STDMETHODCALLTYPE getParent(
        ISAXXMLReader **pReader) = 0;

    virtual HRESULT STDMETHODCALLTYPE putParent(
        ISAXXMLReader *reader) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISAXXMLFilter, 0x70409222, 0xca09, 0x4475, 0xac,0xb8, 0x40,0x31,0x2f,0xe8,0xd1,0x45)
#endif
#else
typedef struct ISAXXMLFilterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISAXXMLFilter *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISAXXMLFilter *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISAXXMLFilter *This);

    /*** ISAXXMLReader methods ***/
    HRESULT (STDMETHODCALLTYPE *getFeature)(
        ISAXXMLFilter *This,
        const WCHAR *pFeature,
        VARIANT_BOOL *pValue);

    HRESULT (STDMETHODCALLTYPE *putFeature)(
        ISAXXMLFilter *This,
        const WCHAR *pFeature,
        VARIANT_BOOL vfValue);

    HRESULT (STDMETHODCALLTYPE *getProperty)(
        ISAXXMLFilter *This,
        const WCHAR *pProp,
        VARIANT *pValue);

    HRESULT (STDMETHODCALLTYPE *putProperty)(
        ISAXXMLFilter *This,
        const WCHAR *pProp,
        VARIANT value);

    HRESULT (STDMETHODCALLTYPE *getEntityResolver)(
        ISAXXMLFilter *This,
        ISAXEntityResolver **ppEntityResolver);

    HRESULT (STDMETHODCALLTYPE *putEntityResolver)(
        ISAXXMLFilter *This,
        ISAXEntityResolver *pEntityResolver);

    HRESULT (STDMETHODCALLTYPE *getContentHandler)(
        ISAXXMLFilter *This,
        ISAXContentHandler **pContentHandler);

    HRESULT (STDMETHODCALLTYPE *putContentHandler)(
        ISAXXMLFilter *This,
        ISAXContentHandler *contentHandler);

    HRESULT (STDMETHODCALLTYPE *getDTDHandler)(
        ISAXXMLFilter *This,
        ISAXDTDHandler **pDTDHandler);

    HRESULT (STDMETHODCALLTYPE *putDTDHandler)(
        ISAXXMLFilter *This,
        ISAXDTDHandler *pDTDHandler);

    HRESULT (STDMETHODCALLTYPE *getErrorHandler)(
        ISAXXMLFilter *This,
        ISAXErrorHandler **pErrorHandler);

    HRESULT (STDMETHODCALLTYPE *putErrorHandler)(
        ISAXXMLFilter *This,
        ISAXErrorHandler *errorHandler);

    HRESULT (STDMETHODCALLTYPE *getBaseURL)(
        ISAXXMLFilter *This,
        const WCHAR **pBaseUrl);

    HRESULT (STDMETHODCALLTYPE *putBaseURL)(
        ISAXXMLFilter *This,
        const WCHAR *pBaseUrl);

    HRESULT (STDMETHODCALLTYPE *getSecureBaseURL)(
        ISAXXMLFilter *This,
        const WCHAR **pSecureBaseUrl);

    HRESULT (STDMETHODCALLTYPE *putSecureBaseURL)(
        ISAXXMLFilter *This,
        const WCHAR *secureBaseUrl);

    HRESULT (STDMETHODCALLTYPE *parse)(
        ISAXXMLFilter *This,
        VARIANT varInput);

    HRESULT (STDMETHODCALLTYPE *parseURL)(
        ISAXXMLFilter *This,
        const WCHAR *url);

    /*** ISAXXMLFilter methods ***/
    HRESULT (STDMETHODCALLTYPE *getParent)(
        ISAXXMLFilter *This,
        ISAXXMLReader **pReader);

    HRESULT (STDMETHODCALLTYPE *putParent)(
        ISAXXMLFilter *This,
        ISAXXMLReader *reader);

    END_INTERFACE
} ISAXXMLFilterVtbl;

interface ISAXXMLFilter {
    CONST_VTBL ISAXXMLFilterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISAXXMLFilter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISAXXMLFilter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISAXXMLFilter_Release(This) (This)->lpVtbl->Release(This)
/*** ISAXXMLReader methods ***/
#define ISAXXMLFilter_getFeature(This,pFeature,pValue) (This)->lpVtbl->getFeature(This,pFeature,pValue)
#define ISAXXMLFilter_putFeature(This,pFeature,vfValue) (This)->lpVtbl->putFeature(This,pFeature,vfValue)
#define ISAXXMLFilter_getProperty(This,pProp,pValue) (This)->lpVtbl->getProperty(This,pProp,pValue)
#define ISAXXMLFilter_putProperty(This,pProp,value) (This)->lpVtbl->putProperty(This,pProp,value)
#define ISAXXMLFilter_getEntityResolver(This,ppEntityResolver) (This)->lpVtbl->getEntityResolver(This,ppEntityResolver)
#define ISAXXMLFilter_putEntityResolver(This,pEntityResolver) (This)->lpVtbl->putEntityResolver(This,pEntityResolver)
#define ISAXXMLFilter_getContentHandler(This,pContentHandler) (This)->lpVtbl->getContentHandler(This,pContentHandler)
#define ISAXXMLFilter_putContentHandler(This,contentHandler) (This)->lpVtbl->putContentHandler(This,contentHandler)
#define ISAXXMLFilter_getDTDHandler(This,pDTDHandler) (This)->lpVtbl->getDTDHandler(This,pDTDHandler)
#define ISAXXMLFilter_putDTDHandler(This,pDTDHandler) (This)->lpVtbl->putDTDHandler(This,pDTDHandler)
#define ISAXXMLFilter_getErrorHandler(This,pErrorHandler) (This)->lpVtbl->getErrorHandler(This,pErrorHandler)
#define ISAXXMLFilter_putErrorHandler(This,errorHandler) (This)->lpVtbl->putErrorHandler(This,errorHandler)
#define ISAXXMLFilter_getBaseURL(This,pBaseUrl) (This)->lpVtbl->getBaseURL(This,pBaseUrl)
#define ISAXXMLFilter_putBaseURL(This,pBaseUrl) (This)->lpVtbl->putBaseURL(This,pBaseUrl)
#define ISAXXMLFilter_getSecureBaseURL(This,pSecureBaseUrl) (This)->lpVtbl->getSecureBaseURL(This,pSecureBaseUrl)
#define ISAXXMLFilter_putSecureBaseURL(This,secureBaseUrl) (This)->lpVtbl->putSecureBaseURL(This,secureBaseUrl)
#define ISAXXMLFilter_parse(This,varInput) (This)->lpVtbl->parse(This,varInput)
#define ISAXXMLFilter_parseURL(This,url) (This)->lpVtbl->parseURL(This,url)
/*** ISAXXMLFilter methods ***/
#define ISAXXMLFilter_getParent(This,pReader) (This)->lpVtbl->getParent(This,pReader)
#define ISAXXMLFilter_putParent(This,reader) (This)->lpVtbl->putParent(This,reader)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISAXXMLFilter_QueryInterface(ISAXXMLFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISAXXMLFilter_AddRef(ISAXXMLFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISAXXMLFilter_Release(ISAXXMLFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXXMLReader methods ***/
static __WIDL_INLINE HRESULT ISAXXMLFilter_getFeature(ISAXXMLFilter* This,const WCHAR *pFeature,VARIANT_BOOL *pValue) {
    return This->lpVtbl->getFeature(This,pFeature,pValue);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_putFeature(ISAXXMLFilter* This,const WCHAR *pFeature,VARIANT_BOOL vfValue) {
    return This->lpVtbl->putFeature(This,pFeature,vfValue);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_getProperty(ISAXXMLFilter* This,const WCHAR *pProp,VARIANT *pValue) {
    return This->lpVtbl->getProperty(This,pProp,pValue);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_putProperty(ISAXXMLFilter* This,const WCHAR *pProp,VARIANT value) {
    return This->lpVtbl->putProperty(This,pProp,value);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_getEntityResolver(ISAXXMLFilter* This,ISAXEntityResolver **ppEntityResolver) {
    return This->lpVtbl->getEntityResolver(This,ppEntityResolver);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_putEntityResolver(ISAXXMLFilter* This,ISAXEntityResolver *pEntityResolver) {
    return This->lpVtbl->putEntityResolver(This,pEntityResolver);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_getContentHandler(ISAXXMLFilter* This,ISAXContentHandler **pContentHandler) {
    return This->lpVtbl->getContentHandler(This,pContentHandler);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_putContentHandler(ISAXXMLFilter* This,ISAXContentHandler *contentHandler) {
    return This->lpVtbl->putContentHandler(This,contentHandler);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_getDTDHandler(ISAXXMLFilter* This,ISAXDTDHandler **pDTDHandler) {
    return This->lpVtbl->getDTDHandler(This,pDTDHandler);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_putDTDHandler(ISAXXMLFilter* This,ISAXDTDHandler *pDTDHandler) {
    return This->lpVtbl->putDTDHandler(This,pDTDHandler);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_getErrorHandler(ISAXXMLFilter* This,ISAXErrorHandler **pErrorHandler) {
    return This->lpVtbl->getErrorHandler(This,pErrorHandler);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_putErrorHandler(ISAXXMLFilter* This,ISAXErrorHandler *errorHandler) {
    return This->lpVtbl->putErrorHandler(This,errorHandler);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_getBaseURL(ISAXXMLFilter* This,const WCHAR **pBaseUrl) {
    return This->lpVtbl->getBaseURL(This,pBaseUrl);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_putBaseURL(ISAXXMLFilter* This,const WCHAR *pBaseUrl) {
    return This->lpVtbl->putBaseURL(This,pBaseUrl);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_getSecureBaseURL(ISAXXMLFilter* This,const WCHAR **pSecureBaseUrl) {
    return This->lpVtbl->getSecureBaseURL(This,pSecureBaseUrl);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_putSecureBaseURL(ISAXXMLFilter* This,const WCHAR *secureBaseUrl) {
    return This->lpVtbl->putSecureBaseURL(This,secureBaseUrl);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_parse(ISAXXMLFilter* This,VARIANT varInput) {
    return This->lpVtbl->parse(This,varInput);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_parseURL(ISAXXMLFilter* This,const WCHAR *url) {
    return This->lpVtbl->parseURL(This,url);
}
/*** ISAXXMLFilter methods ***/
static __WIDL_INLINE HRESULT ISAXXMLFilter_getParent(ISAXXMLFilter* This,ISAXXMLReader **pReader) {
    return This->lpVtbl->getParent(This,pReader);
}
static __WIDL_INLINE HRESULT ISAXXMLFilter_putParent(ISAXXMLFilter* This,ISAXXMLReader *reader) {
    return This->lpVtbl->putParent(This,reader);
}
#endif
#endif

#endif


#endif  /* __ISAXXMLFilter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVBSAXAttributes interface
 */
#ifndef __IVBSAXAttributes_INTERFACE_DEFINED__
#define __IVBSAXAttributes_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVBSAXAttributes, 0x10dc0586, 0x132b, 0x4cac, 0x8b,0xb3, 0xdb,0x00,0xac,0x8b,0x7e,0xe0);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("10dc0586-132b-4cac-8bb3-db00ac8b7ee0")
IVBSAXAttributes : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_length(
        int *nLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE getURI(
        int nIndex,
        BSTR *uri) = 0;

    virtual HRESULT STDMETHODCALLTYPE getLocalName(
        int nIndex,
        BSTR *localName) = 0;

    virtual HRESULT STDMETHODCALLTYPE getQName(
        int nIndex,
        BSTR *QName) = 0;

    virtual HRESULT STDMETHODCALLTYPE getIndexFromName(
        BSTR uri,
        BSTR localName,
        int *nIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE getIndexFromQName(
        BSTR QName,
        int *nIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE getType(
        int nIndex,
        BSTR *type) = 0;

    virtual HRESULT STDMETHODCALLTYPE getTypeFromName(
        BSTR uri,
        BSTR localName,
        BSTR *type) = 0;

    virtual HRESULT STDMETHODCALLTYPE getTypeFromQName(
        BSTR QName,
        BSTR *type) = 0;

    virtual HRESULT STDMETHODCALLTYPE getValue(
        int nIndex,
        BSTR *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE getValueFromName(
        BSTR uri,
        BSTR localName,
        BSTR *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE getValueFromQName(
        BSTR QName,
        BSTR *value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVBSAXAttributes, 0x10dc0586, 0x132b, 0x4cac, 0x8b,0xb3, 0xdb,0x00,0xac,0x8b,0x7e,0xe0)
#endif
#else
typedef struct IVBSAXAttributesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVBSAXAttributes *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVBSAXAttributes *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVBSAXAttributes *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IVBSAXAttributes *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IVBSAXAttributes *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IVBSAXAttributes *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IVBSAXAttributes *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IVBSAXAttributes methods ***/
    HRESULT (STDMETHODCALLTYPE *get_length)(
        IVBSAXAttributes *This,
        int *nLength);

    HRESULT (STDMETHODCALLTYPE *getURI)(
        IVBSAXAttributes *This,
        int nIndex,
        BSTR *uri);

    HRESULT (STDMETHODCALLTYPE *getLocalName)(
        IVBSAXAttributes *This,
        int nIndex,
        BSTR *localName);

    HRESULT (STDMETHODCALLTYPE *getQName)(
        IVBSAXAttributes *This,
        int nIndex,
        BSTR *QName);

    HRESULT (STDMETHODCALLTYPE *getIndexFromName)(
        IVBSAXAttributes *This,
        BSTR uri,
        BSTR localName,
        int *nIndex);

    HRESULT (STDMETHODCALLTYPE *getIndexFromQName)(
        IVBSAXAttributes *This,
        BSTR QName,
        int *nIndex);

    HRESULT (STDMETHODCALLTYPE *getType)(
        IVBSAXAttributes *This,
        int nIndex,
        BSTR *type);

    HRESULT (STDMETHODCALLTYPE *getTypeFromName)(
        IVBSAXAttributes *This,
        BSTR uri,
        BSTR localName,
        BSTR *type);

    HRESULT (STDMETHODCALLTYPE *getTypeFromQName)(
        IVBSAXAttributes *This,
        BSTR QName,
        BSTR *type);

    HRESULT (STDMETHODCALLTYPE *getValue)(
        IVBSAXAttributes *This,
        int nIndex,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *getValueFromName)(
        IVBSAXAttributes *This,
        BSTR uri,
        BSTR localName,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *getValueFromQName)(
        IVBSAXAttributes *This,
        BSTR QName,
        BSTR *value);

    END_INTERFACE
} IVBSAXAttributesVtbl;

interface IVBSAXAttributes {
    CONST_VTBL IVBSAXAttributesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVBSAXAttributes_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVBSAXAttributes_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVBSAXAttributes_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IVBSAXAttributes_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IVBSAXAttributes_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IVBSAXAttributes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IVBSAXAttributes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IVBSAXAttributes methods ***/
#define IVBSAXAttributes_get_length(This,nLength) (This)->lpVtbl->get_length(This,nLength)
#define IVBSAXAttributes_getURI(This,nIndex,uri) (This)->lpVtbl->getURI(This,nIndex,uri)
#define IVBSAXAttributes_getLocalName(This,nIndex,localName) (This)->lpVtbl->getLocalName(This,nIndex,localName)
#define IVBSAXAttributes_getQName(This,nIndex,QName) (This)->lpVtbl->getQName(This,nIndex,QName)
#define IVBSAXAttributes_getIndexFromName(This,uri,localName,nIndex) (This)->lpVtbl->getIndexFromName(This,uri,localName,nIndex)
#define IVBSAXAttributes_getIndexFromQName(This,QName,nIndex) (This)->lpVtbl->getIndexFromQName(This,QName,nIndex)
#define IVBSAXAttributes_getType(This,nIndex,type) (This)->lpVtbl->getType(This,nIndex,type)
#define IVBSAXAttributes_getTypeFromName(This,uri,localName,type) (This)->lpVtbl->getTypeFromName(This,uri,localName,type)
#define IVBSAXAttributes_getTypeFromQName(This,QName,type) (This)->lpVtbl->getTypeFromQName(This,QName,type)
#define IVBSAXAttributes_getValue(This,nIndex,value) (This)->lpVtbl->getValue(This,nIndex,value)
#define IVBSAXAttributes_getValueFromName(This,uri,localName,value) (This)->lpVtbl->getValueFromName(This,uri,localName,value)
#define IVBSAXAttributes_getValueFromQName(This,QName,value) (This)->lpVtbl->getValueFromQName(This,QName,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVBSAXAttributes_QueryInterface(IVBSAXAttributes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVBSAXAttributes_AddRef(IVBSAXAttributes* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVBSAXAttributes_Release(IVBSAXAttributes* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IVBSAXAttributes_GetTypeInfoCount(IVBSAXAttributes* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IVBSAXAttributes_GetTypeInfo(IVBSAXAttributes* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IVBSAXAttributes_GetIDsOfNames(IVBSAXAttributes* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IVBSAXAttributes_Invoke(IVBSAXAttributes* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IVBSAXAttributes methods ***/
static __WIDL_INLINE HRESULT IVBSAXAttributes_get_length(IVBSAXAttributes* This,int *nLength) {
    return This->lpVtbl->get_length(This,nLength);
}
static __WIDL_INLINE HRESULT IVBSAXAttributes_getURI(IVBSAXAttributes* This,int nIndex,BSTR *uri) {
    return This->lpVtbl->getURI(This,nIndex,uri);
}
static __WIDL_INLINE HRESULT IVBSAXAttributes_getLocalName(IVBSAXAttributes* This,int nIndex,BSTR *localName) {
    return This->lpVtbl->getLocalName(This,nIndex,localName);
}
static __WIDL_INLINE HRESULT IVBSAXAttributes_getQName(IVBSAXAttributes* This,int nIndex,BSTR *QName) {
    return This->lpVtbl->getQName(This,nIndex,QName);
}
static __WIDL_INLINE HRESULT IVBSAXAttributes_getIndexFromName(IVBSAXAttributes* This,BSTR uri,BSTR localName,int *nIndex) {
    return This->lpVtbl->getIndexFromName(This,uri,localName,nIndex);
}
static __WIDL_INLINE HRESULT IVBSAXAttributes_getIndexFromQName(IVBSAXAttributes* This,BSTR QName,int *nIndex) {
    return This->lpVtbl->getIndexFromQName(This,QName,nIndex);
}
static __WIDL_INLINE HRESULT IVBSAXAttributes_getType(IVBSAXAttributes* This,int nIndex,BSTR *type) {
    return This->lpVtbl->getType(This,nIndex,type);
}
static __WIDL_INLINE HRESULT IVBSAXAttributes_getTypeFromName(IVBSAXAttributes* This,BSTR uri,BSTR localName,BSTR *type) {
    return This->lpVtbl->getTypeFromName(This,uri,localName,type);
}
static __WIDL_INLINE HRESULT IVBSAXAttributes_getTypeFromQName(IVBSAXAttributes* This,BSTR QName,BSTR *type) {
    return This->lpVtbl->getTypeFromQName(This,QName,type);
}
static __WIDL_INLINE HRESULT IVBSAXAttributes_getValue(IVBSAXAttributes* This,int nIndex,BSTR *value) {
    return This->lpVtbl->getValue(This,nIndex,value);
}
static __WIDL_INLINE HRESULT IVBSAXAttributes_getValueFromName(IVBSAXAttributes* This,BSTR uri,BSTR localName,BSTR *value) {
    return This->lpVtbl->getValueFromName(This,uri,localName,value);
}
static __WIDL_INLINE HRESULT IVBSAXAttributes_getValueFromQName(IVBSAXAttributes* This,BSTR QName,BSTR *value) {
    return This->lpVtbl->getValueFromQName(This,QName,value);
}
#endif
#endif

#endif


#endif  /* __IVBSAXAttributes_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVBSAXContentHandler interface
 */
#ifndef __IVBSAXContentHandler_INTERFACE_DEFINED__
#define __IVBSAXContentHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVBSAXContentHandler, 0x2ed7290a, 0x4dd5, 0x4b46, 0xbb,0x26, 0x4e,0x41,0x55,0xe7,0x7f,0xaa);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2ed7290a-4dd5-4b46-bb26-4e4155e77faa")
IVBSAXContentHandler : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE putref_documentLocator(
        IVBSAXLocator *oLocator) = 0;

    virtual HRESULT STDMETHODCALLTYPE startDocument(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE endDocument(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE startPrefixMapping(
        BSTR *prefix,
        BSTR *uri) = 0;

    virtual HRESULT STDMETHODCALLTYPE endPrefixMapping(
        BSTR *prefix) = 0;

    virtual HRESULT STDMETHODCALLTYPE startElement(
        BSTR *namespaceURI,
        BSTR *localName,
        BSTR *QName,
        IVBSAXAttributes *oAttributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE endElement(
        BSTR *namespaceURI,
        BSTR *localName,
        BSTR *strQName) = 0;

    virtual HRESULT STDMETHODCALLTYPE characters(
        BSTR *chars) = 0;

    virtual HRESULT STDMETHODCALLTYPE ignorableWhitespace(
        BSTR *chars) = 0;

    virtual HRESULT STDMETHODCALLTYPE processingInstruction(
        BSTR *target,
        BSTR *data) = 0;

    virtual HRESULT STDMETHODCALLTYPE skippedEntity(
        BSTR *name) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVBSAXContentHandler, 0x2ed7290a, 0x4dd5, 0x4b46, 0xbb,0x26, 0x4e,0x41,0x55,0xe7,0x7f,0xaa)
#endif
#else
typedef struct IVBSAXContentHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVBSAXContentHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVBSAXContentHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVBSAXContentHandler *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IVBSAXContentHandler *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IVBSAXContentHandler *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IVBSAXContentHandler *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IVBSAXContentHandler *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IVBSAXContentHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *putref_documentLocator)(
        IVBSAXContentHandler *This,
        IVBSAXLocator *oLocator);

    HRESULT (STDMETHODCALLTYPE *startDocument)(
        IVBSAXContentHandler *This);

    HRESULT (STDMETHODCALLTYPE *endDocument)(
        IVBSAXContentHandler *This);

    HRESULT (STDMETHODCALLTYPE *startPrefixMapping)(
        IVBSAXContentHandler *This,
        BSTR *prefix,
        BSTR *uri);

    HRESULT (STDMETHODCALLTYPE *endPrefixMapping)(
        IVBSAXContentHandler *This,
        BSTR *prefix);

    HRESULT (STDMETHODCALLTYPE *startElement)(
        IVBSAXContentHandler *This,
        BSTR *namespaceURI,
        BSTR *localName,
        BSTR *QName,
        IVBSAXAttributes *oAttributes);

    HRESULT (STDMETHODCALLTYPE *endElement)(
        IVBSAXContentHandler *This,
        BSTR *namespaceURI,
        BSTR *localName,
        BSTR *strQName);

    HRESULT (STDMETHODCALLTYPE *characters)(
        IVBSAXContentHandler *This,
        BSTR *chars);

    HRESULT (STDMETHODCALLTYPE *ignorableWhitespace)(
        IVBSAXContentHandler *This,
        BSTR *chars);

    HRESULT (STDMETHODCALLTYPE *processingInstruction)(
        IVBSAXContentHandler *This,
        BSTR *target,
        BSTR *data);

    HRESULT (STDMETHODCALLTYPE *skippedEntity)(
        IVBSAXContentHandler *This,
        BSTR *name);

    END_INTERFACE
} IVBSAXContentHandlerVtbl;

interface IVBSAXContentHandler {
    CONST_VTBL IVBSAXContentHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVBSAXContentHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVBSAXContentHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVBSAXContentHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IVBSAXContentHandler_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IVBSAXContentHandler_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IVBSAXContentHandler_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IVBSAXContentHandler_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IVBSAXContentHandler methods ***/
#define IVBSAXContentHandler_putref_documentLocator(This,oLocator) (This)->lpVtbl->putref_documentLocator(This,oLocator)
#define IVBSAXContentHandler_startDocument(This) (This)->lpVtbl->startDocument(This)
#define IVBSAXContentHandler_endDocument(This) (This)->lpVtbl->endDocument(This)
#define IVBSAXContentHandler_startPrefixMapping(This,prefix,uri) (This)->lpVtbl->startPrefixMapping(This,prefix,uri)
#define IVBSAXContentHandler_endPrefixMapping(This,prefix) (This)->lpVtbl->endPrefixMapping(This,prefix)
#define IVBSAXContentHandler_startElement(This,namespaceURI,localName,QName,oAttributes) (This)->lpVtbl->startElement(This,namespaceURI,localName,QName,oAttributes)
#define IVBSAXContentHandler_endElement(This,namespaceURI,localName,strQName) (This)->lpVtbl->endElement(This,namespaceURI,localName,strQName)
#define IVBSAXContentHandler_characters(This,chars) (This)->lpVtbl->characters(This,chars)
#define IVBSAXContentHandler_ignorableWhitespace(This,chars) (This)->lpVtbl->ignorableWhitespace(This,chars)
#define IVBSAXContentHandler_processingInstruction(This,target,data) (This)->lpVtbl->processingInstruction(This,target,data)
#define IVBSAXContentHandler_skippedEntity(This,name) (This)->lpVtbl->skippedEntity(This,name)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVBSAXContentHandler_QueryInterface(IVBSAXContentHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVBSAXContentHandler_AddRef(IVBSAXContentHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVBSAXContentHandler_Release(IVBSAXContentHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IVBSAXContentHandler_GetTypeInfoCount(IVBSAXContentHandler* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IVBSAXContentHandler_GetTypeInfo(IVBSAXContentHandler* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IVBSAXContentHandler_GetIDsOfNames(IVBSAXContentHandler* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IVBSAXContentHandler_Invoke(IVBSAXContentHandler* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IVBSAXContentHandler methods ***/
static __WIDL_INLINE HRESULT IVBSAXContentHandler_putref_documentLocator(IVBSAXContentHandler* This,IVBSAXLocator *oLocator) {
    return This->lpVtbl->putref_documentLocator(This,oLocator);
}
static __WIDL_INLINE HRESULT IVBSAXContentHandler_startDocument(IVBSAXContentHandler* This) {
    return This->lpVtbl->startDocument(This);
}
static __WIDL_INLINE HRESULT IVBSAXContentHandler_endDocument(IVBSAXContentHandler* This) {
    return This->lpVtbl->endDocument(This);
}
static __WIDL_INLINE HRESULT IVBSAXContentHandler_startPrefixMapping(IVBSAXContentHandler* This,BSTR *prefix,BSTR *uri) {
    return This->lpVtbl->startPrefixMapping(This,prefix,uri);
}
static __WIDL_INLINE HRESULT IVBSAXContentHandler_endPrefixMapping(IVBSAXContentHandler* This,BSTR *prefix) {
    return This->lpVtbl->endPrefixMapping(This,prefix);
}
static __WIDL_INLINE HRESULT IVBSAXContentHandler_startElement(IVBSAXContentHandler* This,BSTR *namespaceURI,BSTR *localName,BSTR *QName,IVBSAXAttributes *oAttributes) {
    return This->lpVtbl->startElement(This,namespaceURI,localName,QName,oAttributes);
}
static __WIDL_INLINE HRESULT IVBSAXContentHandler_endElement(IVBSAXContentHandler* This,BSTR *namespaceURI,BSTR *localName,BSTR *strQName) {
    return This->lpVtbl->endElement(This,namespaceURI,localName,strQName);
}
static __WIDL_INLINE HRESULT IVBSAXContentHandler_characters(IVBSAXContentHandler* This,BSTR *chars) {
    return This->lpVtbl->characters(This,chars);
}
static __WIDL_INLINE HRESULT IVBSAXContentHandler_ignorableWhitespace(IVBSAXContentHandler* This,BSTR *chars) {
    return This->lpVtbl->ignorableWhitespace(This,chars);
}
static __WIDL_INLINE HRESULT IVBSAXContentHandler_processingInstruction(IVBSAXContentHandler* This,BSTR *target,BSTR *data) {
    return This->lpVtbl->processingInstruction(This,target,data);
}
static __WIDL_INLINE HRESULT IVBSAXContentHandler_skippedEntity(IVBSAXContentHandler* This,BSTR *name) {
    return This->lpVtbl->skippedEntity(This,name);
}
#endif
#endif

#endif


#endif  /* __IVBSAXContentHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVBSAXDeclHandler interface
 */
#ifndef __IVBSAXDeclHandler_INTERFACE_DEFINED__
#define __IVBSAXDeclHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVBSAXDeclHandler, 0xe8917260, 0x7579, 0x4be1, 0xb5,0xdd, 0x7a,0xfb,0xfa,0x6f,0x07,0x7b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e8917260-7579-4be1-b5dd-7afbfa6f077b")
IVBSAXDeclHandler : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE elementDecl(
        BSTR *name,
        BSTR *model) = 0;

    virtual HRESULT STDMETHODCALLTYPE attributeDecl(
        BSTR *elementName,
        BSTR *attributeName,
        BSTR *type,
        BSTR *valueDefault,
        BSTR *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE internalEntityDecl(
        BSTR *name,
        BSTR *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE externalEntityDecl(
        BSTR *name,
        BSTR *publicId,
        BSTR *systemId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVBSAXDeclHandler, 0xe8917260, 0x7579, 0x4be1, 0xb5,0xdd, 0x7a,0xfb,0xfa,0x6f,0x07,0x7b)
#endif
#else
typedef struct IVBSAXDeclHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVBSAXDeclHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVBSAXDeclHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVBSAXDeclHandler *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IVBSAXDeclHandler *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IVBSAXDeclHandler *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IVBSAXDeclHandler *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IVBSAXDeclHandler *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IVBSAXDeclHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *elementDecl)(
        IVBSAXDeclHandler *This,
        BSTR *name,
        BSTR *model);

    HRESULT (STDMETHODCALLTYPE *attributeDecl)(
        IVBSAXDeclHandler *This,
        BSTR *elementName,
        BSTR *attributeName,
        BSTR *type,
        BSTR *valueDefault,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *internalEntityDecl)(
        IVBSAXDeclHandler *This,
        BSTR *name,
        BSTR *value);

    HRESULT (STDMETHODCALLTYPE *externalEntityDecl)(
        IVBSAXDeclHandler *This,
        BSTR *name,
        BSTR *publicId,
        BSTR *systemId);

    END_INTERFACE
} IVBSAXDeclHandlerVtbl;

interface IVBSAXDeclHandler {
    CONST_VTBL IVBSAXDeclHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVBSAXDeclHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVBSAXDeclHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVBSAXDeclHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IVBSAXDeclHandler_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IVBSAXDeclHandler_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IVBSAXDeclHandler_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IVBSAXDeclHandler_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IVBSAXDeclHandler methods ***/
#define IVBSAXDeclHandler_elementDecl(This,name,model) (This)->lpVtbl->elementDecl(This,name,model)
#define IVBSAXDeclHandler_attributeDecl(This,elementName,attributeName,type,valueDefault,value) (This)->lpVtbl->attributeDecl(This,elementName,attributeName,type,valueDefault,value)
#define IVBSAXDeclHandler_internalEntityDecl(This,name,value) (This)->lpVtbl->internalEntityDecl(This,name,value)
#define IVBSAXDeclHandler_externalEntityDecl(This,name,publicId,systemId) (This)->lpVtbl->externalEntityDecl(This,name,publicId,systemId)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVBSAXDeclHandler_QueryInterface(IVBSAXDeclHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVBSAXDeclHandler_AddRef(IVBSAXDeclHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVBSAXDeclHandler_Release(IVBSAXDeclHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IVBSAXDeclHandler_GetTypeInfoCount(IVBSAXDeclHandler* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IVBSAXDeclHandler_GetTypeInfo(IVBSAXDeclHandler* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IVBSAXDeclHandler_GetIDsOfNames(IVBSAXDeclHandler* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IVBSAXDeclHandler_Invoke(IVBSAXDeclHandler* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IVBSAXDeclHandler methods ***/
static __WIDL_INLINE HRESULT IVBSAXDeclHandler_elementDecl(IVBSAXDeclHandler* This,BSTR *name,BSTR *model) {
    return This->lpVtbl->elementDecl(This,name,model);
}
static __WIDL_INLINE HRESULT IVBSAXDeclHandler_attributeDecl(IVBSAXDeclHandler* This,BSTR *elementName,BSTR *attributeName,BSTR *type,BSTR *valueDefault,BSTR *value) {
    return This->lpVtbl->attributeDecl(This,elementName,attributeName,type,valueDefault,value);
}
static __WIDL_INLINE HRESULT IVBSAXDeclHandler_internalEntityDecl(IVBSAXDeclHandler* This,BSTR *name,BSTR *value) {
    return This->lpVtbl->internalEntityDecl(This,name,value);
}
static __WIDL_INLINE HRESULT IVBSAXDeclHandler_externalEntityDecl(IVBSAXDeclHandler* This,BSTR *name,BSTR *publicId,BSTR *systemId) {
    return This->lpVtbl->externalEntityDecl(This,name,publicId,systemId);
}
#endif
#endif

#endif


#endif  /* __IVBSAXDeclHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVBSAXDTDHandler interface
 */
#ifndef __IVBSAXDTDHandler_INTERFACE_DEFINED__
#define __IVBSAXDTDHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVBSAXDTDHandler, 0x24fb3297, 0x302d, 0x4620, 0xba,0x39, 0x3a,0x73,0x2d,0x85,0x05,0x58);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("24fb3297-302d-4620-ba39-3a732d850558")
IVBSAXDTDHandler : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE notationDecl(
        BSTR *name,
        BSTR *publicId,
        BSTR *systemId) = 0;

    virtual HRESULT STDMETHODCALLTYPE unparsedEntityDecl(
        BSTR *name,
        BSTR *publicId,
        BSTR *systemId,
        BSTR *notationName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVBSAXDTDHandler, 0x24fb3297, 0x302d, 0x4620, 0xba,0x39, 0x3a,0x73,0x2d,0x85,0x05,0x58)
#endif
#else
typedef struct IVBSAXDTDHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVBSAXDTDHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVBSAXDTDHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVBSAXDTDHandler *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IVBSAXDTDHandler *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IVBSAXDTDHandler *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IVBSAXDTDHandler *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IVBSAXDTDHandler *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IVBSAXDTDHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *notationDecl)(
        IVBSAXDTDHandler *This,
        BSTR *name,
        BSTR *publicId,
        BSTR *systemId);

    HRESULT (STDMETHODCALLTYPE *unparsedEntityDecl)(
        IVBSAXDTDHandler *This,
        BSTR *name,
        BSTR *publicId,
        BSTR *systemId,
        BSTR *notationName);

    END_INTERFACE
} IVBSAXDTDHandlerVtbl;

interface IVBSAXDTDHandler {
    CONST_VTBL IVBSAXDTDHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVBSAXDTDHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVBSAXDTDHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVBSAXDTDHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IVBSAXDTDHandler_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IVBSAXDTDHandler_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IVBSAXDTDHandler_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IVBSAXDTDHandler_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IVBSAXDTDHandler methods ***/
#define IVBSAXDTDHandler_notationDecl(This,name,publicId,systemId) (This)->lpVtbl->notationDecl(This,name,publicId,systemId)
#define IVBSAXDTDHandler_unparsedEntityDecl(This,name,publicId,systemId,notationName) (This)->lpVtbl->unparsedEntityDecl(This,name,publicId,systemId,notationName)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVBSAXDTDHandler_QueryInterface(IVBSAXDTDHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVBSAXDTDHandler_AddRef(IVBSAXDTDHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVBSAXDTDHandler_Release(IVBSAXDTDHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IVBSAXDTDHandler_GetTypeInfoCount(IVBSAXDTDHandler* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IVBSAXDTDHandler_GetTypeInfo(IVBSAXDTDHandler* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IVBSAXDTDHandler_GetIDsOfNames(IVBSAXDTDHandler* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IVBSAXDTDHandler_Invoke(IVBSAXDTDHandler* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IVBSAXDTDHandler methods ***/
static __WIDL_INLINE HRESULT IVBSAXDTDHandler_notationDecl(IVBSAXDTDHandler* This,BSTR *name,BSTR *publicId,BSTR *systemId) {
    return This->lpVtbl->notationDecl(This,name,publicId,systemId);
}
static __WIDL_INLINE HRESULT IVBSAXDTDHandler_unparsedEntityDecl(IVBSAXDTDHandler* This,BSTR *name,BSTR *publicId,BSTR *systemId,BSTR *notationName) {
    return This->lpVtbl->unparsedEntityDecl(This,name,publicId,systemId,notationName);
}
#endif
#endif

#endif


#endif  /* __IVBSAXDTDHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVBSAXEntityResolver interface
 */
#ifndef __IVBSAXEntityResolver_INTERFACE_DEFINED__
#define __IVBSAXEntityResolver_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVBSAXEntityResolver, 0x0c05d096, 0xf45b, 0x4aca, 0xad,0x1a, 0xaa,0x0b,0xc2,0x55,0x18,0xdc);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("0c05d096-f45b-4aca-ad1a-aa0bc25518dc")
IVBSAXEntityResolver : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE resolveEntity(
        BSTR *publicId,
        BSTR *systemId,
        VARIANT *ret) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVBSAXEntityResolver, 0x0c05d096, 0xf45b, 0x4aca, 0xad,0x1a, 0xaa,0x0b,0xc2,0x55,0x18,0xdc)
#endif
#else
typedef struct IVBSAXEntityResolverVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVBSAXEntityResolver *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVBSAXEntityResolver *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVBSAXEntityResolver *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IVBSAXEntityResolver *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IVBSAXEntityResolver *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IVBSAXEntityResolver *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IVBSAXEntityResolver *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IVBSAXEntityResolver methods ***/
    HRESULT (STDMETHODCALLTYPE *resolveEntity)(
        IVBSAXEntityResolver *This,
        BSTR *publicId,
        BSTR *systemId,
        VARIANT *ret);

    END_INTERFACE
} IVBSAXEntityResolverVtbl;

interface IVBSAXEntityResolver {
    CONST_VTBL IVBSAXEntityResolverVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVBSAXEntityResolver_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVBSAXEntityResolver_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVBSAXEntityResolver_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IVBSAXEntityResolver_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IVBSAXEntityResolver_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IVBSAXEntityResolver_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IVBSAXEntityResolver_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IVBSAXEntityResolver methods ***/
#define IVBSAXEntityResolver_resolveEntity(This,publicId,systemId,ret) (This)->lpVtbl->resolveEntity(This,publicId,systemId,ret)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVBSAXEntityResolver_QueryInterface(IVBSAXEntityResolver* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVBSAXEntityResolver_AddRef(IVBSAXEntityResolver* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVBSAXEntityResolver_Release(IVBSAXEntityResolver* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IVBSAXEntityResolver_GetTypeInfoCount(IVBSAXEntityResolver* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IVBSAXEntityResolver_GetTypeInfo(IVBSAXEntityResolver* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IVBSAXEntityResolver_GetIDsOfNames(IVBSAXEntityResolver* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IVBSAXEntityResolver_Invoke(IVBSAXEntityResolver* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IVBSAXEntityResolver methods ***/
static __WIDL_INLINE HRESULT IVBSAXEntityResolver_resolveEntity(IVBSAXEntityResolver* This,BSTR *publicId,BSTR *systemId,VARIANT *ret) {
    return This->lpVtbl->resolveEntity(This,publicId,systemId,ret);
}
#endif
#endif

#endif


#endif  /* __IVBSAXEntityResolver_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVBSAXErrorHandler interface
 */
#ifndef __IVBSAXErrorHandler_INTERFACE_DEFINED__
#define __IVBSAXErrorHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVBSAXErrorHandler, 0xd963d3fe, 0x173c, 0x4862, 0x90,0x95, 0xb9,0x2f,0x66,0x99,0x5f,0x52);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d963d3fe-173c-4862-9095-b92f66995f52")
IVBSAXErrorHandler : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE error(
        IVBSAXLocator *locator,
        BSTR *errorMessage,
        LONG errorCode) = 0;

    virtual HRESULT STDMETHODCALLTYPE fatalError(
        IVBSAXLocator *locator,
        BSTR *errorMessage,
        LONG errorCode) = 0;

    virtual HRESULT STDMETHODCALLTYPE ignorableWarning(
        IVBSAXLocator *locator,
        BSTR *errorMessage,
        LONG errorCode) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVBSAXErrorHandler, 0xd963d3fe, 0x173c, 0x4862, 0x90,0x95, 0xb9,0x2f,0x66,0x99,0x5f,0x52)
#endif
#else
typedef struct IVBSAXErrorHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVBSAXErrorHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVBSAXErrorHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVBSAXErrorHandler *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IVBSAXErrorHandler *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IVBSAXErrorHandler *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IVBSAXErrorHandler *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IVBSAXErrorHandler *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IVBSAXErrorHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *error)(
        IVBSAXErrorHandler *This,
        IVBSAXLocator *locator,
        BSTR *errorMessage,
        LONG errorCode);

    HRESULT (STDMETHODCALLTYPE *fatalError)(
        IVBSAXErrorHandler *This,
        IVBSAXLocator *locator,
        BSTR *errorMessage,
        LONG errorCode);

    HRESULT (STDMETHODCALLTYPE *ignorableWarning)(
        IVBSAXErrorHandler *This,
        IVBSAXLocator *locator,
        BSTR *errorMessage,
        LONG errorCode);

    END_INTERFACE
} IVBSAXErrorHandlerVtbl;

interface IVBSAXErrorHandler {
    CONST_VTBL IVBSAXErrorHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVBSAXErrorHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVBSAXErrorHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVBSAXErrorHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IVBSAXErrorHandler_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IVBSAXErrorHandler_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IVBSAXErrorHandler_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IVBSAXErrorHandler_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IVBSAXErrorHandler methods ***/
#define IVBSAXErrorHandler_error(This,locator,errorMessage,errorCode) (This)->lpVtbl->error(This,locator,errorMessage,errorCode)
#define IVBSAXErrorHandler_fatalError(This,locator,errorMessage,errorCode) (This)->lpVtbl->fatalError(This,locator,errorMessage,errorCode)
#define IVBSAXErrorHandler_ignorableWarning(This,locator,errorMessage,errorCode) (This)->lpVtbl->ignorableWarning(This,locator,errorMessage,errorCode)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVBSAXErrorHandler_QueryInterface(IVBSAXErrorHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVBSAXErrorHandler_AddRef(IVBSAXErrorHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVBSAXErrorHandler_Release(IVBSAXErrorHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IVBSAXErrorHandler_GetTypeInfoCount(IVBSAXErrorHandler* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IVBSAXErrorHandler_GetTypeInfo(IVBSAXErrorHandler* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IVBSAXErrorHandler_GetIDsOfNames(IVBSAXErrorHandler* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IVBSAXErrorHandler_Invoke(IVBSAXErrorHandler* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IVBSAXErrorHandler methods ***/
static __WIDL_INLINE HRESULT IVBSAXErrorHandler_error(IVBSAXErrorHandler* This,IVBSAXLocator *locator,BSTR *errorMessage,LONG errorCode) {
    return This->lpVtbl->error(This,locator,errorMessage,errorCode);
}
static __WIDL_INLINE HRESULT IVBSAXErrorHandler_fatalError(IVBSAXErrorHandler* This,IVBSAXLocator *locator,BSTR *errorMessage,LONG errorCode) {
    return This->lpVtbl->fatalError(This,locator,errorMessage,errorCode);
}
static __WIDL_INLINE HRESULT IVBSAXErrorHandler_ignorableWarning(IVBSAXErrorHandler* This,IVBSAXLocator *locator,BSTR *errorMessage,LONG errorCode) {
    return This->lpVtbl->ignorableWarning(This,locator,errorMessage,errorCode);
}
#endif
#endif

#endif


#endif  /* __IVBSAXErrorHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVBSAXLexicalHandler interface
 */
#ifndef __IVBSAXLexicalHandler_INTERFACE_DEFINED__
#define __IVBSAXLexicalHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVBSAXLexicalHandler, 0x032aac35, 0x8c0e, 0x4d9d, 0x97,0x9f, 0xe3,0xb7,0x02,0x93,0x55,0x76);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("032aac35-8c0e-4d9d-979f-e3b702935576")
IVBSAXLexicalHandler : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE startDTD(
        BSTR *name,
        BSTR *publicId,
        BSTR *systemId) = 0;

    virtual HRESULT STDMETHODCALLTYPE endDTD(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE startEntity(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE endEntity(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE startCDATA(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE endCDATA(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE comment(
        BSTR *chars) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVBSAXLexicalHandler, 0x032aac35, 0x8c0e, 0x4d9d, 0x97,0x9f, 0xe3,0xb7,0x02,0x93,0x55,0x76)
#endif
#else
typedef struct IVBSAXLexicalHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVBSAXLexicalHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVBSAXLexicalHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVBSAXLexicalHandler *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IVBSAXLexicalHandler *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IVBSAXLexicalHandler *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IVBSAXLexicalHandler *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IVBSAXLexicalHandler *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IVBSAXLexicalHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *startDTD)(
        IVBSAXLexicalHandler *This,
        BSTR *name,
        BSTR *publicId,
        BSTR *systemId);

    HRESULT (STDMETHODCALLTYPE *endDTD)(
        IVBSAXLexicalHandler *This);

    HRESULT (STDMETHODCALLTYPE *startEntity)(
        IVBSAXLexicalHandler *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *endEntity)(
        IVBSAXLexicalHandler *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *startCDATA)(
        IVBSAXLexicalHandler *This);

    HRESULT (STDMETHODCALLTYPE *endCDATA)(
        IVBSAXLexicalHandler *This);

    HRESULT (STDMETHODCALLTYPE *comment)(
        IVBSAXLexicalHandler *This,
        BSTR *chars);

    END_INTERFACE
} IVBSAXLexicalHandlerVtbl;

interface IVBSAXLexicalHandler {
    CONST_VTBL IVBSAXLexicalHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVBSAXLexicalHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVBSAXLexicalHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVBSAXLexicalHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IVBSAXLexicalHandler_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IVBSAXLexicalHandler_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IVBSAXLexicalHandler_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IVBSAXLexicalHandler_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IVBSAXLexicalHandler methods ***/
#define IVBSAXLexicalHandler_startDTD(This,name,publicId,systemId) (This)->lpVtbl->startDTD(This,name,publicId,systemId)
#define IVBSAXLexicalHandler_endDTD(This) (This)->lpVtbl->endDTD(This)
#define IVBSAXLexicalHandler_startEntity(This,name) (This)->lpVtbl->startEntity(This,name)
#define IVBSAXLexicalHandler_endEntity(This,name) (This)->lpVtbl->endEntity(This,name)
#define IVBSAXLexicalHandler_startCDATA(This) (This)->lpVtbl->startCDATA(This)
#define IVBSAXLexicalHandler_endCDATA(This) (This)->lpVtbl->endCDATA(This)
#define IVBSAXLexicalHandler_comment(This,chars) (This)->lpVtbl->comment(This,chars)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVBSAXLexicalHandler_QueryInterface(IVBSAXLexicalHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVBSAXLexicalHandler_AddRef(IVBSAXLexicalHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVBSAXLexicalHandler_Release(IVBSAXLexicalHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IVBSAXLexicalHandler_GetTypeInfoCount(IVBSAXLexicalHandler* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IVBSAXLexicalHandler_GetTypeInfo(IVBSAXLexicalHandler* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IVBSAXLexicalHandler_GetIDsOfNames(IVBSAXLexicalHandler* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IVBSAXLexicalHandler_Invoke(IVBSAXLexicalHandler* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IVBSAXLexicalHandler methods ***/
static __WIDL_INLINE HRESULT IVBSAXLexicalHandler_startDTD(IVBSAXLexicalHandler* This,BSTR *name,BSTR *publicId,BSTR *systemId) {
    return This->lpVtbl->startDTD(This,name,publicId,systemId);
}
static __WIDL_INLINE HRESULT IVBSAXLexicalHandler_endDTD(IVBSAXLexicalHandler* This) {
    return This->lpVtbl->endDTD(This);
}
static __WIDL_INLINE HRESULT IVBSAXLexicalHandler_startEntity(IVBSAXLexicalHandler* This,BSTR *name) {
    return This->lpVtbl->startEntity(This,name);
}
static __WIDL_INLINE HRESULT IVBSAXLexicalHandler_endEntity(IVBSAXLexicalHandler* This,BSTR *name) {
    return This->lpVtbl->endEntity(This,name);
}
static __WIDL_INLINE HRESULT IVBSAXLexicalHandler_startCDATA(IVBSAXLexicalHandler* This) {
    return This->lpVtbl->startCDATA(This);
}
static __WIDL_INLINE HRESULT IVBSAXLexicalHandler_endCDATA(IVBSAXLexicalHandler* This) {
    return This->lpVtbl->endCDATA(This);
}
static __WIDL_INLINE HRESULT IVBSAXLexicalHandler_comment(IVBSAXLexicalHandler* This,BSTR *chars) {
    return This->lpVtbl->comment(This,chars);
}
#endif
#endif

#endif


#endif  /* __IVBSAXLexicalHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVBSAXLocator interface
 */
#ifndef __IVBSAXLocator_INTERFACE_DEFINED__
#define __IVBSAXLocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVBSAXLocator, 0x796e7ac5, 0x5aa2, 0x4eff, 0xac,0xad, 0x3f,0xaa,0xf0,0x1a,0x32,0x88);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("796e7ac5-5aa2-4eff-acad-3faaf01a3288")
IVBSAXLocator : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_columnNumber(
        int *column) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_lineNumber(
        int *line) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_publicId(
        BSTR *publicId) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_systemId(
        BSTR *systemId) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVBSAXLocator, 0x796e7ac5, 0x5aa2, 0x4eff, 0xac,0xad, 0x3f,0xaa,0xf0,0x1a,0x32,0x88)
#endif
#else
typedef struct IVBSAXLocatorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVBSAXLocator *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVBSAXLocator *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVBSAXLocator *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IVBSAXLocator *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IVBSAXLocator *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IVBSAXLocator *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IVBSAXLocator *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IVBSAXLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *get_columnNumber)(
        IVBSAXLocator *This,
        int *column);

    HRESULT (STDMETHODCALLTYPE *get_lineNumber)(
        IVBSAXLocator *This,
        int *line);

    HRESULT (STDMETHODCALLTYPE *get_publicId)(
        IVBSAXLocator *This,
        BSTR *publicId);

    HRESULT (STDMETHODCALLTYPE *get_systemId)(
        IVBSAXLocator *This,
        BSTR *systemId);

    END_INTERFACE
} IVBSAXLocatorVtbl;

interface IVBSAXLocator {
    CONST_VTBL IVBSAXLocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVBSAXLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVBSAXLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVBSAXLocator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IVBSAXLocator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IVBSAXLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IVBSAXLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IVBSAXLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IVBSAXLocator methods ***/
#define IVBSAXLocator_get_columnNumber(This,column) (This)->lpVtbl->get_columnNumber(This,column)
#define IVBSAXLocator_get_lineNumber(This,line) (This)->lpVtbl->get_lineNumber(This,line)
#define IVBSAXLocator_get_publicId(This,publicId) (This)->lpVtbl->get_publicId(This,publicId)
#define IVBSAXLocator_get_systemId(This,systemId) (This)->lpVtbl->get_systemId(This,systemId)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVBSAXLocator_QueryInterface(IVBSAXLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVBSAXLocator_AddRef(IVBSAXLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVBSAXLocator_Release(IVBSAXLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IVBSAXLocator_GetTypeInfoCount(IVBSAXLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IVBSAXLocator_GetTypeInfo(IVBSAXLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IVBSAXLocator_GetIDsOfNames(IVBSAXLocator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IVBSAXLocator_Invoke(IVBSAXLocator* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IVBSAXLocator methods ***/
static __WIDL_INLINE HRESULT IVBSAXLocator_get_columnNumber(IVBSAXLocator* This,int *column) {
    return This->lpVtbl->get_columnNumber(This,column);
}
static __WIDL_INLINE HRESULT IVBSAXLocator_get_lineNumber(IVBSAXLocator* This,int *line) {
    return This->lpVtbl->get_lineNumber(This,line);
}
static __WIDL_INLINE HRESULT IVBSAXLocator_get_publicId(IVBSAXLocator* This,BSTR *publicId) {
    return This->lpVtbl->get_publicId(This,publicId);
}
static __WIDL_INLINE HRESULT IVBSAXLocator_get_systemId(IVBSAXLocator* This,BSTR *systemId) {
    return This->lpVtbl->get_systemId(This,systemId);
}
#endif
#endif

#endif


#endif  /* __IVBSAXLocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVBSAXXMLFilter interface
 */
#ifndef __IVBSAXXMLFilter_INTERFACE_DEFINED__
#define __IVBSAXXMLFilter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVBSAXXMLFilter, 0x1299eb1b, 0x5b88, 0x433e, 0x82,0xde, 0x82,0xca,0x75,0xad,0x4e,0x04);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1299eb1b-5b88-433e-82de-82ca75ad4e04")
IVBSAXXMLFilter : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_parent(
        IVBSAXXMLReader **reader) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_parent(
        IVBSAXXMLReader *reader) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVBSAXXMLFilter, 0x1299eb1b, 0x5b88, 0x433e, 0x82,0xde, 0x82,0xca,0x75,0xad,0x4e,0x04)
#endif
#else
typedef struct IVBSAXXMLFilterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVBSAXXMLFilter *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVBSAXXMLFilter *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVBSAXXMLFilter *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IVBSAXXMLFilter *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IVBSAXXMLFilter *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IVBSAXXMLFilter *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IVBSAXXMLFilter *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IVBSAXXMLFilter methods ***/
    HRESULT (STDMETHODCALLTYPE *get_parent)(
        IVBSAXXMLFilter *This,
        IVBSAXXMLReader **reader);

    HRESULT (STDMETHODCALLTYPE *putref_parent)(
        IVBSAXXMLFilter *This,
        IVBSAXXMLReader *reader);

    END_INTERFACE
} IVBSAXXMLFilterVtbl;

interface IVBSAXXMLFilter {
    CONST_VTBL IVBSAXXMLFilterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVBSAXXMLFilter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVBSAXXMLFilter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVBSAXXMLFilter_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IVBSAXXMLFilter_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IVBSAXXMLFilter_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IVBSAXXMLFilter_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IVBSAXXMLFilter_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IVBSAXXMLFilter methods ***/
#define IVBSAXXMLFilter_get_parent(This,reader) (This)->lpVtbl->get_parent(This,reader)
#define IVBSAXXMLFilter_putref_parent(This,reader) (This)->lpVtbl->putref_parent(This,reader)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVBSAXXMLFilter_QueryInterface(IVBSAXXMLFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVBSAXXMLFilter_AddRef(IVBSAXXMLFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVBSAXXMLFilter_Release(IVBSAXXMLFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IVBSAXXMLFilter_GetTypeInfoCount(IVBSAXXMLFilter* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IVBSAXXMLFilter_GetTypeInfo(IVBSAXXMLFilter* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IVBSAXXMLFilter_GetIDsOfNames(IVBSAXXMLFilter* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IVBSAXXMLFilter_Invoke(IVBSAXXMLFilter* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IVBSAXXMLFilter methods ***/
static __WIDL_INLINE HRESULT IVBSAXXMLFilter_get_parent(IVBSAXXMLFilter* This,IVBSAXXMLReader **reader) {
    return This->lpVtbl->get_parent(This,reader);
}
static __WIDL_INLINE HRESULT IVBSAXXMLFilter_putref_parent(IVBSAXXMLFilter* This,IVBSAXXMLReader *reader) {
    return This->lpVtbl->putref_parent(This,reader);
}
#endif
#endif

#endif


#endif  /* __IVBSAXXMLFilter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVBSAXXMLReader interface
 */
#ifndef __IVBSAXXMLReader_INTERFACE_DEFINED__
#define __IVBSAXXMLReader_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVBSAXXMLReader, 0x8c033caa, 0x6cd6, 0x4f73, 0xb7,0x28, 0x45,0x31,0xaf,0x74,0x94,0x5f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8c033caa-6cd6-4f73-b728-4531af74945f")
IVBSAXXMLReader : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE getFeature(
        BSTR pFeature,
        VARIANT_BOOL *pValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE putFeature(
        BSTR pFeature,
        VARIANT_BOOL vfValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE getProperty(
        BSTR pProp,
        VARIANT *pValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE putProperty(
        BSTR pProp,
        VARIANT value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_entityResolver(
        IVBSAXEntityResolver **ppEntityResolver) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_entityResolver(
        IVBSAXEntityResolver *pEntityResolver) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_contentHandler(
        IVBSAXContentHandler **pContentHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_contentHandler(
        IVBSAXContentHandler *contentHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dtdHandler(
        IVBSAXDTDHandler **pDTDHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_dtdHandler(
        IVBSAXDTDHandler *pDTDHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_errorHandler(
        IVBSAXErrorHandler **pErrorHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_errorHandler(
        IVBSAXErrorHandler *errorHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_baseURL(
        BSTR *pBaseUrl) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_baseURL(
        BSTR pBaseUrl) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_secureBaseURL(
        BSTR *pSecureBaseUrl) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_secureBaseURL(
        BSTR secureBaseUrl) = 0;

    virtual HRESULT STDMETHODCALLTYPE parse(
        VARIANT varInput) = 0;

    virtual HRESULT STDMETHODCALLTYPE parseURL(
        BSTR url) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVBSAXXMLReader, 0x8c033caa, 0x6cd6, 0x4f73, 0xb7,0x28, 0x45,0x31,0xaf,0x74,0x94,0x5f)
#endif
#else
typedef struct IVBSAXXMLReaderVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVBSAXXMLReader *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVBSAXXMLReader *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVBSAXXMLReader *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IVBSAXXMLReader *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IVBSAXXMLReader *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IVBSAXXMLReader *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IVBSAXXMLReader *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IVBSAXXMLReader methods ***/
    HRESULT (STDMETHODCALLTYPE *getFeature)(
        IVBSAXXMLReader *This,
        BSTR pFeature,
        VARIANT_BOOL *pValue);

    HRESULT (STDMETHODCALLTYPE *putFeature)(
        IVBSAXXMLReader *This,
        BSTR pFeature,
        VARIANT_BOOL vfValue);

    HRESULT (STDMETHODCALLTYPE *getProperty)(
        IVBSAXXMLReader *This,
        BSTR pProp,
        VARIANT *pValue);

    HRESULT (STDMETHODCALLTYPE *putProperty)(
        IVBSAXXMLReader *This,
        BSTR pProp,
        VARIANT value);

    HRESULT (STDMETHODCALLTYPE *get_entityResolver)(
        IVBSAXXMLReader *This,
        IVBSAXEntityResolver **ppEntityResolver);

    HRESULT (STDMETHODCALLTYPE *putref_entityResolver)(
        IVBSAXXMLReader *This,
        IVBSAXEntityResolver *pEntityResolver);

    HRESULT (STDMETHODCALLTYPE *get_contentHandler)(
        IVBSAXXMLReader *This,
        IVBSAXContentHandler **pContentHandler);

    HRESULT (STDMETHODCALLTYPE *putref_contentHandler)(
        IVBSAXXMLReader *This,
        IVBSAXContentHandler *contentHandler);

    HRESULT (STDMETHODCALLTYPE *get_dtdHandler)(
        IVBSAXXMLReader *This,
        IVBSAXDTDHandler **pDTDHandler);

    HRESULT (STDMETHODCALLTYPE *putref_dtdHandler)(
        IVBSAXXMLReader *This,
        IVBSAXDTDHandler *pDTDHandler);

    HRESULT (STDMETHODCALLTYPE *get_errorHandler)(
        IVBSAXXMLReader *This,
        IVBSAXErrorHandler **pErrorHandler);

    HRESULT (STDMETHODCALLTYPE *putref_errorHandler)(
        IVBSAXXMLReader *This,
        IVBSAXErrorHandler *errorHandler);

    HRESULT (STDMETHODCALLTYPE *get_baseURL)(
        IVBSAXXMLReader *This,
        BSTR *pBaseUrl);

    HRESULT (STDMETHODCALLTYPE *put_baseURL)(
        IVBSAXXMLReader *This,
        BSTR pBaseUrl);

    HRESULT (STDMETHODCALLTYPE *get_secureBaseURL)(
        IVBSAXXMLReader *This,
        BSTR *pSecureBaseUrl);

    HRESULT (STDMETHODCALLTYPE *put_secureBaseURL)(
        IVBSAXXMLReader *This,
        BSTR secureBaseUrl);

    HRESULT (STDMETHODCALLTYPE *parse)(
        IVBSAXXMLReader *This,
        VARIANT varInput);

    HRESULT (STDMETHODCALLTYPE *parseURL)(
        IVBSAXXMLReader *This,
        BSTR url);

    END_INTERFACE
} IVBSAXXMLReaderVtbl;

interface IVBSAXXMLReader {
    CONST_VTBL IVBSAXXMLReaderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVBSAXXMLReader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVBSAXXMLReader_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVBSAXXMLReader_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IVBSAXXMLReader_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IVBSAXXMLReader_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IVBSAXXMLReader_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IVBSAXXMLReader_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IVBSAXXMLReader methods ***/
#define IVBSAXXMLReader_getFeature(This,pFeature,pValue) (This)->lpVtbl->getFeature(This,pFeature,pValue)
#define IVBSAXXMLReader_putFeature(This,pFeature,vfValue) (This)->lpVtbl->putFeature(This,pFeature,vfValue)
#define IVBSAXXMLReader_getProperty(This,pProp,pValue) (This)->lpVtbl->getProperty(This,pProp,pValue)
#define IVBSAXXMLReader_putProperty(This,pProp,value) (This)->lpVtbl->putProperty(This,pProp,value)
#define IVBSAXXMLReader_get_entityResolver(This,ppEntityResolver) (This)->lpVtbl->get_entityResolver(This,ppEntityResolver)
#define IVBSAXXMLReader_putref_entityResolver(This,pEntityResolver) (This)->lpVtbl->putref_entityResolver(This,pEntityResolver)
#define IVBSAXXMLReader_get_contentHandler(This,pContentHandler) (This)->lpVtbl->get_contentHandler(This,pContentHandler)
#define IVBSAXXMLReader_putref_contentHandler(This,contentHandler) (This)->lpVtbl->putref_contentHandler(This,contentHandler)
#define IVBSAXXMLReader_get_dtdHandler(This,pDTDHandler) (This)->lpVtbl->get_dtdHandler(This,pDTDHandler)
#define IVBSAXXMLReader_putref_dtdHandler(This,pDTDHandler) (This)->lpVtbl->putref_dtdHandler(This,pDTDHandler)
#define IVBSAXXMLReader_get_errorHandler(This,pErrorHandler) (This)->lpVtbl->get_errorHandler(This,pErrorHandler)
#define IVBSAXXMLReader_putref_errorHandler(This,errorHandler) (This)->lpVtbl->putref_errorHandler(This,errorHandler)
#define IVBSAXXMLReader_get_baseURL(This,pBaseUrl) (This)->lpVtbl->get_baseURL(This,pBaseUrl)
#define IVBSAXXMLReader_put_baseURL(This,pBaseUrl) (This)->lpVtbl->put_baseURL(This,pBaseUrl)
#define IVBSAXXMLReader_get_secureBaseURL(This,pSecureBaseUrl) (This)->lpVtbl->get_secureBaseURL(This,pSecureBaseUrl)
#define IVBSAXXMLReader_put_secureBaseURL(This,secureBaseUrl) (This)->lpVtbl->put_secureBaseURL(This,secureBaseUrl)
#define IVBSAXXMLReader_parse(This,varInput) (This)->lpVtbl->parse(This,varInput)
#define IVBSAXXMLReader_parseURL(This,url) (This)->lpVtbl->parseURL(This,url)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVBSAXXMLReader_QueryInterface(IVBSAXXMLReader* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVBSAXXMLReader_AddRef(IVBSAXXMLReader* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVBSAXXMLReader_Release(IVBSAXXMLReader* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IVBSAXXMLReader_GetTypeInfoCount(IVBSAXXMLReader* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_GetTypeInfo(IVBSAXXMLReader* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_GetIDsOfNames(IVBSAXXMLReader* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_Invoke(IVBSAXXMLReader* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IVBSAXXMLReader methods ***/
static __WIDL_INLINE HRESULT IVBSAXXMLReader_getFeature(IVBSAXXMLReader* This,BSTR pFeature,VARIANT_BOOL *pValue) {
    return This->lpVtbl->getFeature(This,pFeature,pValue);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_putFeature(IVBSAXXMLReader* This,BSTR pFeature,VARIANT_BOOL vfValue) {
    return This->lpVtbl->putFeature(This,pFeature,vfValue);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_getProperty(IVBSAXXMLReader* This,BSTR pProp,VARIANT *pValue) {
    return This->lpVtbl->getProperty(This,pProp,pValue);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_putProperty(IVBSAXXMLReader* This,BSTR pProp,VARIANT value) {
    return This->lpVtbl->putProperty(This,pProp,value);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_get_entityResolver(IVBSAXXMLReader* This,IVBSAXEntityResolver **ppEntityResolver) {
    return This->lpVtbl->get_entityResolver(This,ppEntityResolver);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_putref_entityResolver(IVBSAXXMLReader* This,IVBSAXEntityResolver *pEntityResolver) {
    return This->lpVtbl->putref_entityResolver(This,pEntityResolver);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_get_contentHandler(IVBSAXXMLReader* This,IVBSAXContentHandler **pContentHandler) {
    return This->lpVtbl->get_contentHandler(This,pContentHandler);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_putref_contentHandler(IVBSAXXMLReader* This,IVBSAXContentHandler *contentHandler) {
    return This->lpVtbl->putref_contentHandler(This,contentHandler);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_get_dtdHandler(IVBSAXXMLReader* This,IVBSAXDTDHandler **pDTDHandler) {
    return This->lpVtbl->get_dtdHandler(This,pDTDHandler);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_putref_dtdHandler(IVBSAXXMLReader* This,IVBSAXDTDHandler *pDTDHandler) {
    return This->lpVtbl->putref_dtdHandler(This,pDTDHandler);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_get_errorHandler(IVBSAXXMLReader* This,IVBSAXErrorHandler **pErrorHandler) {
    return This->lpVtbl->get_errorHandler(This,pErrorHandler);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_putref_errorHandler(IVBSAXXMLReader* This,IVBSAXErrorHandler *errorHandler) {
    return This->lpVtbl->putref_errorHandler(This,errorHandler);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_get_baseURL(IVBSAXXMLReader* This,BSTR *pBaseUrl) {
    return This->lpVtbl->get_baseURL(This,pBaseUrl);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_put_baseURL(IVBSAXXMLReader* This,BSTR pBaseUrl) {
    return This->lpVtbl->put_baseURL(This,pBaseUrl);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_get_secureBaseURL(IVBSAXXMLReader* This,BSTR *pSecureBaseUrl) {
    return This->lpVtbl->get_secureBaseURL(This,pSecureBaseUrl);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_put_secureBaseURL(IVBSAXXMLReader* This,BSTR secureBaseUrl) {
    return This->lpVtbl->put_secureBaseURL(This,secureBaseUrl);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_parse(IVBSAXXMLReader* This,VARIANT varInput) {
    return This->lpVtbl->parse(This,varInput);
}
static __WIDL_INLINE HRESULT IVBSAXXMLReader_parseURL(IVBSAXXMLReader* This,BSTR url) {
    return This->lpVtbl->parseURL(This,url);
}
#endif
#endif

#endif


#endif  /* __IVBSAXXMLReader_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMXAttributes interface
 */
#ifndef __IMXAttributes_INTERFACE_DEFINED__
#define __IMXAttributes_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMXAttributes, 0xf10d27cc, 0x3ec0, 0x415c, 0x8e,0xd8, 0x77,0xab,0x1c,0x5e,0x72,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f10d27cc-3ec0-415c-8ed8-77ab1c5e7262")
IMXAttributes : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE addAttribute(
        BSTR uri,
        BSTR localName,
        BSTR QName,
        BSTR type,
        BSTR value) = 0;

    virtual HRESULT STDMETHODCALLTYPE addAttributeFromIndex(
        VARIANT atts,
        int index) = 0;

    virtual HRESULT STDMETHODCALLTYPE clear(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE removeAttribute(
        int index) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttribute(
        int index,
        BSTR uri,
        BSTR localName,
        BSTR QName,
        BSTR type,
        BSTR value) = 0;

    virtual HRESULT STDMETHODCALLTYPE setAttributes(
        VARIANT atts) = 0;

    virtual HRESULT STDMETHODCALLTYPE setLocalName(
        int index,
        BSTR localName) = 0;

    virtual HRESULT STDMETHODCALLTYPE setQName(
        int index,
        BSTR QName) = 0;

    virtual HRESULT STDMETHODCALLTYPE setType(
        int index,
        BSTR type) = 0;

    virtual HRESULT STDMETHODCALLTYPE setURI(
        int index,
        BSTR uri) = 0;

    virtual HRESULT STDMETHODCALLTYPE setValue(
        int index,
        BSTR value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMXAttributes, 0xf10d27cc, 0x3ec0, 0x415c, 0x8e,0xd8, 0x77,0xab,0x1c,0x5e,0x72,0x62)
#endif
#else
typedef struct IMXAttributesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMXAttributes *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMXAttributes *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMXAttributes *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IMXAttributes *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IMXAttributes *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IMXAttributes *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IMXAttributes *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IMXAttributes methods ***/
    HRESULT (STDMETHODCALLTYPE *addAttribute)(
        IMXAttributes *This,
        BSTR uri,
        BSTR localName,
        BSTR QName,
        BSTR type,
        BSTR value);

    HRESULT (STDMETHODCALLTYPE *addAttributeFromIndex)(
        IMXAttributes *This,
        VARIANT atts,
        int index);

    HRESULT (STDMETHODCALLTYPE *clear)(
        IMXAttributes *This);

    HRESULT (STDMETHODCALLTYPE *removeAttribute)(
        IMXAttributes *This,
        int index);

    HRESULT (STDMETHODCALLTYPE *setAttribute)(
        IMXAttributes *This,
        int index,
        BSTR uri,
        BSTR localName,
        BSTR QName,
        BSTR type,
        BSTR value);

    HRESULT (STDMETHODCALLTYPE *setAttributes)(
        IMXAttributes *This,
        VARIANT atts);

    HRESULT (STDMETHODCALLTYPE *setLocalName)(
        IMXAttributes *This,
        int index,
        BSTR localName);

    HRESULT (STDMETHODCALLTYPE *setQName)(
        IMXAttributes *This,
        int index,
        BSTR QName);

    HRESULT (STDMETHODCALLTYPE *setType)(
        IMXAttributes *This,
        int index,
        BSTR type);

    HRESULT (STDMETHODCALLTYPE *setURI)(
        IMXAttributes *This,
        int index,
        BSTR uri);

    HRESULT (STDMETHODCALLTYPE *setValue)(
        IMXAttributes *This,
        int index,
        BSTR value);

    END_INTERFACE
} IMXAttributesVtbl;

interface IMXAttributes {
    CONST_VTBL IMXAttributesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMXAttributes_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMXAttributes_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMXAttributes_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IMXAttributes_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMXAttributes_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMXAttributes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMXAttributes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IMXAttributes methods ***/
#define IMXAttributes_addAttribute(This,uri,localName,QName,type,value) (This)->lpVtbl->addAttribute(This,uri,localName,QName,type,value)
#define IMXAttributes_addAttributeFromIndex(This,atts,index) (This)->lpVtbl->addAttributeFromIndex(This,atts,index)
#define IMXAttributes_clear(This) (This)->lpVtbl->clear(This)
#define IMXAttributes_removeAttribute(This,index) (This)->lpVtbl->removeAttribute(This,index)
#define IMXAttributes_setAttribute(This,index,uri,localName,QName,type,value) (This)->lpVtbl->setAttribute(This,index,uri,localName,QName,type,value)
#define IMXAttributes_setAttributes(This,atts) (This)->lpVtbl->setAttributes(This,atts)
#define IMXAttributes_setLocalName(This,index,localName) (This)->lpVtbl->setLocalName(This,index,localName)
#define IMXAttributes_setQName(This,index,QName) (This)->lpVtbl->setQName(This,index,QName)
#define IMXAttributes_setType(This,index,type) (This)->lpVtbl->setType(This,index,type)
#define IMXAttributes_setURI(This,index,uri) (This)->lpVtbl->setURI(This,index,uri)
#define IMXAttributes_setValue(This,index,value) (This)->lpVtbl->setValue(This,index,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMXAttributes_QueryInterface(IMXAttributes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMXAttributes_AddRef(IMXAttributes* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMXAttributes_Release(IMXAttributes* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IMXAttributes_GetTypeInfoCount(IMXAttributes* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IMXAttributes_GetTypeInfo(IMXAttributes* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IMXAttributes_GetIDsOfNames(IMXAttributes* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IMXAttributes_Invoke(IMXAttributes* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IMXAttributes methods ***/
static __WIDL_INLINE HRESULT IMXAttributes_addAttribute(IMXAttributes* This,BSTR uri,BSTR localName,BSTR QName,BSTR type,BSTR value) {
    return This->lpVtbl->addAttribute(This,uri,localName,QName,type,value);
}
static __WIDL_INLINE HRESULT IMXAttributes_addAttributeFromIndex(IMXAttributes* This,VARIANT atts,int index) {
    return This->lpVtbl->addAttributeFromIndex(This,atts,index);
}
static __WIDL_INLINE HRESULT IMXAttributes_clear(IMXAttributes* This) {
    return This->lpVtbl->clear(This);
}
static __WIDL_INLINE HRESULT IMXAttributes_removeAttribute(IMXAttributes* This,int index) {
    return This->lpVtbl->removeAttribute(This,index);
}
static __WIDL_INLINE HRESULT IMXAttributes_setAttribute(IMXAttributes* This,int index,BSTR uri,BSTR localName,BSTR QName,BSTR type,BSTR value) {
    return This->lpVtbl->setAttribute(This,index,uri,localName,QName,type,value);
}
static __WIDL_INLINE HRESULT IMXAttributes_setAttributes(IMXAttributes* This,VARIANT atts) {
    return This->lpVtbl->setAttributes(This,atts);
}
static __WIDL_INLINE HRESULT IMXAttributes_setLocalName(IMXAttributes* This,int index,BSTR localName) {
    return This->lpVtbl->setLocalName(This,index,localName);
}
static __WIDL_INLINE HRESULT IMXAttributes_setQName(IMXAttributes* This,int index,BSTR QName) {
    return This->lpVtbl->setQName(This,index,QName);
}
static __WIDL_INLINE HRESULT IMXAttributes_setType(IMXAttributes* This,int index,BSTR type) {
    return This->lpVtbl->setType(This,index,type);
}
static __WIDL_INLINE HRESULT IMXAttributes_setURI(IMXAttributes* This,int index,BSTR uri) {
    return This->lpVtbl->setURI(This,index,uri);
}
static __WIDL_INLINE HRESULT IMXAttributes_setValue(IMXAttributes* This,int index,BSTR value) {
    return This->lpVtbl->setValue(This,index,value);
}
#endif
#endif

#endif


#endif  /* __IMXAttributes_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMXSchemaDeclHandler interface
 */
#ifndef __IMXSchemaDeclHandler_INTERFACE_DEFINED__
#define __IMXSchemaDeclHandler_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMXSchemaDeclHandler, 0xfa4bb38c, 0xfaf9, 0x4cca, 0x93,0x02, 0xd1,0xdd,0x0f,0xe5,0x20,0xdb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("fa4bb38c-faf9-4cca-9302-d1dd0fe520db")
IMXSchemaDeclHandler : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE schemaElementDecl(
        ISchemaElement *oSchemaElement) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMXSchemaDeclHandler, 0xfa4bb38c, 0xfaf9, 0x4cca, 0x93,0x02, 0xd1,0xdd,0x0f,0xe5,0x20,0xdb)
#endif
#else
typedef struct IMXSchemaDeclHandlerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMXSchemaDeclHandler *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMXSchemaDeclHandler *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMXSchemaDeclHandler *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IMXSchemaDeclHandler *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IMXSchemaDeclHandler *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IMXSchemaDeclHandler *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IMXSchemaDeclHandler *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IMXSchemaDeclHandler methods ***/
    HRESULT (STDMETHODCALLTYPE *schemaElementDecl)(
        IMXSchemaDeclHandler *This,
        ISchemaElement *oSchemaElement);

    END_INTERFACE
} IMXSchemaDeclHandlerVtbl;

interface IMXSchemaDeclHandler {
    CONST_VTBL IMXSchemaDeclHandlerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMXSchemaDeclHandler_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMXSchemaDeclHandler_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMXSchemaDeclHandler_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IMXSchemaDeclHandler_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMXSchemaDeclHandler_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMXSchemaDeclHandler_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMXSchemaDeclHandler_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IMXSchemaDeclHandler methods ***/
#define IMXSchemaDeclHandler_schemaElementDecl(This,oSchemaElement) (This)->lpVtbl->schemaElementDecl(This,oSchemaElement)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMXSchemaDeclHandler_QueryInterface(IMXSchemaDeclHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMXSchemaDeclHandler_AddRef(IMXSchemaDeclHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMXSchemaDeclHandler_Release(IMXSchemaDeclHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IMXSchemaDeclHandler_GetTypeInfoCount(IMXSchemaDeclHandler* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IMXSchemaDeclHandler_GetTypeInfo(IMXSchemaDeclHandler* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IMXSchemaDeclHandler_GetIDsOfNames(IMXSchemaDeclHandler* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IMXSchemaDeclHandler_Invoke(IMXSchemaDeclHandler* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IMXSchemaDeclHandler methods ***/
static __WIDL_INLINE HRESULT IMXSchemaDeclHandler_schemaElementDecl(IMXSchemaDeclHandler* This,ISchemaElement *oSchemaElement) {
    return This->lpVtbl->schemaElementDecl(This,oSchemaElement);
}
#endif
#endif

#endif


#endif  /* __IMXSchemaDeclHandler_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMXReaderControl interface
 */
#ifndef __IMXReaderControl_INTERFACE_DEFINED__
#define __IMXReaderControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMXReaderControl, 0x808f4e35, 0x8d5a, 0x4fbe, 0x84,0x66, 0x33,0xa4,0x12,0x79,0xed,0x30);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("808f4e35-8d5a-4fbe-8466-33a41279ed30")
IMXReaderControl : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE abort(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE resume(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE suspend(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMXReaderControl, 0x808f4e35, 0x8d5a, 0x4fbe, 0x84,0x66, 0x33,0xa4,0x12,0x79,0xed,0x30)
#endif
#else
typedef struct IMXReaderControlVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMXReaderControl *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMXReaderControl *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMXReaderControl *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IMXReaderControl *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IMXReaderControl *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IMXReaderControl *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IMXReaderControl *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IMXReaderControl methods ***/
    HRESULT (STDMETHODCALLTYPE *abort)(
        IMXReaderControl *This);

    HRESULT (STDMETHODCALLTYPE *resume)(
        IMXReaderControl *This);

    HRESULT (STDMETHODCALLTYPE *suspend)(
        IMXReaderControl *This);

    END_INTERFACE
} IMXReaderControlVtbl;

interface IMXReaderControl {
    CONST_VTBL IMXReaderControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMXReaderControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMXReaderControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMXReaderControl_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IMXReaderControl_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMXReaderControl_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMXReaderControl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMXReaderControl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IMXReaderControl methods ***/
#define IMXReaderControl_abort(This) (This)->lpVtbl->abort(This)
#define IMXReaderControl_resume(This) (This)->lpVtbl->resume(This)
#define IMXReaderControl_suspend(This) (This)->lpVtbl->suspend(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMXReaderControl_QueryInterface(IMXReaderControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMXReaderControl_AddRef(IMXReaderControl* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMXReaderControl_Release(IMXReaderControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IMXReaderControl_GetTypeInfoCount(IMXReaderControl* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IMXReaderControl_GetTypeInfo(IMXReaderControl* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IMXReaderControl_GetIDsOfNames(IMXReaderControl* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IMXReaderControl_Invoke(IMXReaderControl* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IMXReaderControl methods ***/
static __WIDL_INLINE HRESULT IMXReaderControl_abort(IMXReaderControl* This) {
    return This->lpVtbl->abort(This);
}
static __WIDL_INLINE HRESULT IMXReaderControl_resume(IMXReaderControl* This) {
    return This->lpVtbl->resume(This);
}
static __WIDL_INLINE HRESULT IMXReaderControl_suspend(IMXReaderControl* This) {
    return This->lpVtbl->suspend(This);
}
#endif
#endif

#endif


#endif  /* __IMXReaderControl_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMXWriter interface
 */
#ifndef __IMXWriter_INTERFACE_DEFINED__
#define __IMXWriter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMXWriter, 0x4d7ff4ba, 0x1565, 0x4ea8, 0x94,0xe1, 0x6e,0x72,0x4a,0x46,0xf9,0x8d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("4d7ff4ba-1565-4ea8-94e1-6e724a46f98d")
IMXWriter : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_output(
        VARIANT Destination) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_output(
        VARIANT *Destination) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_encoding(
        BSTR encoding) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_encoding(
        BSTR *encoding) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_byteOrderMark(
        VARIANT_BOOL writeByteOrderMark) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_byteOrderMark(
        VARIANT_BOOL *writeByteOrderMark) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_indent(
        VARIANT_BOOL indentMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_indent(
        VARIANT_BOOL *indentMode) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_standalone(
        VARIANT_BOOL value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_standalone(
        VARIANT_BOOL *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_omitXMLDeclaration(
        VARIANT_BOOL value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_omitXMLDeclaration(
        VARIANT_BOOL *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_version(
        BSTR version) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_version(
        BSTR *version) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_disableOutputEscaping(
        VARIANT_BOOL value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disableOutputEscaping(
        VARIANT_BOOL *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE flush(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMXWriter, 0x4d7ff4ba, 0x1565, 0x4ea8, 0x94,0xe1, 0x6e,0x72,0x4a,0x46,0xf9,0x8d)
#endif
#else
typedef struct IMXWriterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMXWriter *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMXWriter *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMXWriter *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IMXWriter *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IMXWriter *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IMXWriter *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IMXWriter *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IMXWriter methods ***/
    HRESULT (STDMETHODCALLTYPE *put_output)(
        IMXWriter *This,
        VARIANT Destination);

    HRESULT (STDMETHODCALLTYPE *get_output)(
        IMXWriter *This,
        VARIANT *Destination);

    HRESULT (STDMETHODCALLTYPE *put_encoding)(
        IMXWriter *This,
        BSTR encoding);

    HRESULT (STDMETHODCALLTYPE *get_encoding)(
        IMXWriter *This,
        BSTR *encoding);

    HRESULT (STDMETHODCALLTYPE *put_byteOrderMark)(
        IMXWriter *This,
        VARIANT_BOOL writeByteOrderMark);

    HRESULT (STDMETHODCALLTYPE *get_byteOrderMark)(
        IMXWriter *This,
        VARIANT_BOOL *writeByteOrderMark);

    HRESULT (STDMETHODCALLTYPE *put_indent)(
        IMXWriter *This,
        VARIANT_BOOL indentMode);

    HRESULT (STDMETHODCALLTYPE *get_indent)(
        IMXWriter *This,
        VARIANT_BOOL *indentMode);

    HRESULT (STDMETHODCALLTYPE *put_standalone)(
        IMXWriter *This,
        VARIANT_BOOL value);

    HRESULT (STDMETHODCALLTYPE *get_standalone)(
        IMXWriter *This,
        VARIANT_BOOL *value);

    HRESULT (STDMETHODCALLTYPE *put_omitXMLDeclaration)(
        IMXWriter *This,
        VARIANT_BOOL value);

    HRESULT (STDMETHODCALLTYPE *get_omitXMLDeclaration)(
        IMXWriter *This,
        VARIANT_BOOL *value);

    HRESULT (STDMETHODCALLTYPE *put_version)(
        IMXWriter *This,
        BSTR version);

    HRESULT (STDMETHODCALLTYPE *get_version)(
        IMXWriter *This,
        BSTR *version);

    HRESULT (STDMETHODCALLTYPE *put_disableOutputEscaping)(
        IMXWriter *This,
        VARIANT_BOOL value);

    HRESULT (STDMETHODCALLTYPE *get_disableOutputEscaping)(
        IMXWriter *This,
        VARIANT_BOOL *value);

    HRESULT (STDMETHODCALLTYPE *flush)(
        IMXWriter *This);

    END_INTERFACE
} IMXWriterVtbl;

interface IMXWriter {
    CONST_VTBL IMXWriterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMXWriter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMXWriter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMXWriter_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IMXWriter_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMXWriter_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMXWriter_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMXWriter_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IMXWriter methods ***/
#define IMXWriter_put_output(This,Destination) (This)->lpVtbl->put_output(This,Destination)
#define IMXWriter_get_output(This,Destination) (This)->lpVtbl->get_output(This,Destination)
#define IMXWriter_put_encoding(This,encoding) (This)->lpVtbl->put_encoding(This,encoding)
#define IMXWriter_get_encoding(This,encoding) (This)->lpVtbl->get_encoding(This,encoding)
#define IMXWriter_put_byteOrderMark(This,writeByteOrderMark) (This)->lpVtbl->put_byteOrderMark(This,writeByteOrderMark)
#define IMXWriter_get_byteOrderMark(This,writeByteOrderMark) (This)->lpVtbl->get_byteOrderMark(This,writeByteOrderMark)
#define IMXWriter_put_indent(This,indentMode) (This)->lpVtbl->put_indent(This,indentMode)
#define IMXWriter_get_indent(This,indentMode) (This)->lpVtbl->get_indent(This,indentMode)
#define IMXWriter_put_standalone(This,value) (This)->lpVtbl->put_standalone(This,value)
#define IMXWriter_get_standalone(This,value) (This)->lpVtbl->get_standalone(This,value)
#define IMXWriter_put_omitXMLDeclaration(This,value) (This)->lpVtbl->put_omitXMLDeclaration(This,value)
#define IMXWriter_get_omitXMLDeclaration(This,value) (This)->lpVtbl->get_omitXMLDeclaration(This,value)
#define IMXWriter_put_version(This,version) (This)->lpVtbl->put_version(This,version)
#define IMXWriter_get_version(This,version) (This)->lpVtbl->get_version(This,version)
#define IMXWriter_put_disableOutputEscaping(This,value) (This)->lpVtbl->put_disableOutputEscaping(This,value)
#define IMXWriter_get_disableOutputEscaping(This,value) (This)->lpVtbl->get_disableOutputEscaping(This,value)
#define IMXWriter_flush(This) (This)->lpVtbl->flush(This)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMXWriter_QueryInterface(IMXWriter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMXWriter_AddRef(IMXWriter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMXWriter_Release(IMXWriter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IMXWriter_GetTypeInfoCount(IMXWriter* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IMXWriter_GetTypeInfo(IMXWriter* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IMXWriter_GetIDsOfNames(IMXWriter* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IMXWriter_Invoke(IMXWriter* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IMXWriter methods ***/
static __WIDL_INLINE HRESULT IMXWriter_put_output(IMXWriter* This,VARIANT Destination) {
    return This->lpVtbl->put_output(This,Destination);
}
static __WIDL_INLINE HRESULT IMXWriter_get_output(IMXWriter* This,VARIANT *Destination) {
    return This->lpVtbl->get_output(This,Destination);
}
static __WIDL_INLINE HRESULT IMXWriter_put_encoding(IMXWriter* This,BSTR encoding) {
    return This->lpVtbl->put_encoding(This,encoding);
}
static __WIDL_INLINE HRESULT IMXWriter_get_encoding(IMXWriter* This,BSTR *encoding) {
    return This->lpVtbl->get_encoding(This,encoding);
}
static __WIDL_INLINE HRESULT IMXWriter_put_byteOrderMark(IMXWriter* This,VARIANT_BOOL writeByteOrderMark) {
    return This->lpVtbl->put_byteOrderMark(This,writeByteOrderMark);
}
static __WIDL_INLINE HRESULT IMXWriter_get_byteOrderMark(IMXWriter* This,VARIANT_BOOL *writeByteOrderMark) {
    return This->lpVtbl->get_byteOrderMark(This,writeByteOrderMark);
}
static __WIDL_INLINE HRESULT IMXWriter_put_indent(IMXWriter* This,VARIANT_BOOL indentMode) {
    return This->lpVtbl->put_indent(This,indentMode);
}
static __WIDL_INLINE HRESULT IMXWriter_get_indent(IMXWriter* This,VARIANT_BOOL *indentMode) {
    return This->lpVtbl->get_indent(This,indentMode);
}
static __WIDL_INLINE HRESULT IMXWriter_put_standalone(IMXWriter* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_standalone(This,value);
}
static __WIDL_INLINE HRESULT IMXWriter_get_standalone(IMXWriter* This,VARIANT_BOOL *value) {
    return This->lpVtbl->get_standalone(This,value);
}
static __WIDL_INLINE HRESULT IMXWriter_put_omitXMLDeclaration(IMXWriter* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_omitXMLDeclaration(This,value);
}
static __WIDL_INLINE HRESULT IMXWriter_get_omitXMLDeclaration(IMXWriter* This,VARIANT_BOOL *value) {
    return This->lpVtbl->get_omitXMLDeclaration(This,value);
}
static __WIDL_INLINE HRESULT IMXWriter_put_version(IMXWriter* This,BSTR version) {
    return This->lpVtbl->put_version(This,version);
}
static __WIDL_INLINE HRESULT IMXWriter_get_version(IMXWriter* This,BSTR *version) {
    return This->lpVtbl->get_version(This,version);
}
static __WIDL_INLINE HRESULT IMXWriter_put_disableOutputEscaping(IMXWriter* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_disableOutputEscaping(This,value);
}
static __WIDL_INLINE HRESULT IMXWriter_get_disableOutputEscaping(IMXWriter* This,VARIANT_BOOL *value) {
    return This->lpVtbl->get_disableOutputEscaping(This,value);
}
static __WIDL_INLINE HRESULT IMXWriter_flush(IMXWriter* This) {
    return This->lpVtbl->flush(This);
}
#endif
#endif

#endif


#endif  /* __IMXWriter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMXNamespacePrefixes interface
 */
#ifndef __IMXNamespacePrefixes_INTERFACE_DEFINED__
#define __IMXNamespacePrefixes_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMXNamespacePrefixes, 0xc90352f4, 0x643c, 0x4fbc, 0xbb,0x23, 0xe9,0x96,0xeb,0x2d,0x51,0xfd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c90352f4-643c-4fbc-bb23-e996eb2d51fd")
IMXNamespacePrefixes : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_item(
        LONG index,
        BSTR *prefix) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **ppUnk) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMXNamespacePrefixes, 0xc90352f4, 0x643c, 0x4fbc, 0xbb,0x23, 0xe9,0x96,0xeb,0x2d,0x51,0xfd)
#endif
#else
typedef struct IMXNamespacePrefixesVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMXNamespacePrefixes *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMXNamespacePrefixes *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMXNamespacePrefixes *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IMXNamespacePrefixes *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IMXNamespacePrefixes *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IMXNamespacePrefixes *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IMXNamespacePrefixes *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IMXNamespacePrefixes methods ***/
    HRESULT (STDMETHODCALLTYPE *get_item)(
        IMXNamespacePrefixes *This,
        LONG index,
        BSTR *prefix);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        IMXNamespacePrefixes *This,
        LONG *length);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        IMXNamespacePrefixes *This,
        IUnknown **ppUnk);

    END_INTERFACE
} IMXNamespacePrefixesVtbl;

interface IMXNamespacePrefixes {
    CONST_VTBL IMXNamespacePrefixesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMXNamespacePrefixes_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMXNamespacePrefixes_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMXNamespacePrefixes_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IMXNamespacePrefixes_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMXNamespacePrefixes_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMXNamespacePrefixes_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMXNamespacePrefixes_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IMXNamespacePrefixes methods ***/
#define IMXNamespacePrefixes_get_item(This,index,prefix) (This)->lpVtbl->get_item(This,index,prefix)
#define IMXNamespacePrefixes_get_length(This,length) (This)->lpVtbl->get_length(This,length)
#define IMXNamespacePrefixes_get__newEnum(This,ppUnk) (This)->lpVtbl->get__newEnum(This,ppUnk)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMXNamespacePrefixes_QueryInterface(IMXNamespacePrefixes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMXNamespacePrefixes_AddRef(IMXNamespacePrefixes* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMXNamespacePrefixes_Release(IMXNamespacePrefixes* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IMXNamespacePrefixes_GetTypeInfoCount(IMXNamespacePrefixes* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IMXNamespacePrefixes_GetTypeInfo(IMXNamespacePrefixes* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IMXNamespacePrefixes_GetIDsOfNames(IMXNamespacePrefixes* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IMXNamespacePrefixes_Invoke(IMXNamespacePrefixes* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IMXNamespacePrefixes methods ***/
static __WIDL_INLINE HRESULT IMXNamespacePrefixes_get_item(IMXNamespacePrefixes* This,LONG index,BSTR *prefix) {
    return This->lpVtbl->get_item(This,index,prefix);
}
static __WIDL_INLINE HRESULT IMXNamespacePrefixes_get_length(IMXNamespacePrefixes* This,LONG *length) {
    return This->lpVtbl->get_length(This,length);
}
static __WIDL_INLINE HRESULT IMXNamespacePrefixes_get__newEnum(IMXNamespacePrefixes* This,IUnknown **ppUnk) {
    return This->lpVtbl->get__newEnum(This,ppUnk);
}
#endif
#endif

#endif


#endif  /* __IMXNamespacePrefixes_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMXNamespaceManager interface
 */
#ifndef __IMXNamespaceManager_INTERFACE_DEFINED__
#define __IMXNamespaceManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMXNamespaceManager, 0xc90352f6, 0x643c, 0x4fbc, 0xbb,0x23, 0xe9,0x96,0xeb,0x2d,0x51,0xfd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c90352f6-643c-4fbc-bb23-e996eb2d51fd")
IMXNamespaceManager : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE putAllowOverride(
        VARIANT_BOOL fOverride) = 0;

    virtual HRESULT STDMETHODCALLTYPE getAllowOverride(
        VARIANT_BOOL *fOverride) = 0;

    virtual HRESULT STDMETHODCALLTYPE reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE pushContext(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE pushNodeContext(
        IXMLDOMNode *contextNode,
        VARIANT_BOOL fDeep) = 0;

    virtual HRESULT STDMETHODCALLTYPE popContext(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE declarePrefix(
        const WCHAR *prefix,
        const WCHAR *namespaceURI) = 0;

    virtual HRESULT STDMETHODCALLTYPE getDeclaredPrefix(
        LONG nIndex,
        WCHAR *pwchPrefix,
        int *pcchPrefix) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPrefix(
        const WCHAR *pwszNamespaceURI,
        LONG nIndex,
        WCHAR *pwchPrefix,
        int *pcchPrefix) = 0;

    virtual HRESULT STDMETHODCALLTYPE getURI(
        const WCHAR *pwchPrefix,
        IXMLDOMNode *pContextNode,
        WCHAR *pwchUri,
        int *pcchUri) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMXNamespaceManager, 0xc90352f6, 0x643c, 0x4fbc, 0xbb,0x23, 0xe9,0x96,0xeb,0x2d,0x51,0xfd)
#endif
#else
typedef struct IMXNamespaceManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMXNamespaceManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMXNamespaceManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMXNamespaceManager *This);

    /*** IMXNamespaceManager methods ***/
    HRESULT (STDMETHODCALLTYPE *putAllowOverride)(
        IMXNamespaceManager *This,
        VARIANT_BOOL fOverride);

    HRESULT (STDMETHODCALLTYPE *getAllowOverride)(
        IMXNamespaceManager *This,
        VARIANT_BOOL *fOverride);

    HRESULT (STDMETHODCALLTYPE *reset)(
        IMXNamespaceManager *This);

    HRESULT (STDMETHODCALLTYPE *pushContext)(
        IMXNamespaceManager *This);

    HRESULT (STDMETHODCALLTYPE *pushNodeContext)(
        IMXNamespaceManager *This,
        IXMLDOMNode *contextNode,
        VARIANT_BOOL fDeep);

    HRESULT (STDMETHODCALLTYPE *popContext)(
        IMXNamespaceManager *This);

    HRESULT (STDMETHODCALLTYPE *declarePrefix)(
        IMXNamespaceManager *This,
        const WCHAR *prefix,
        const WCHAR *namespaceURI);

    HRESULT (STDMETHODCALLTYPE *getDeclaredPrefix)(
        IMXNamespaceManager *This,
        LONG nIndex,
        WCHAR *pwchPrefix,
        int *pcchPrefix);

    HRESULT (STDMETHODCALLTYPE *getPrefix)(
        IMXNamespaceManager *This,
        const WCHAR *pwszNamespaceURI,
        LONG nIndex,
        WCHAR *pwchPrefix,
        int *pcchPrefix);

    HRESULT (STDMETHODCALLTYPE *getURI)(
        IMXNamespaceManager *This,
        const WCHAR *pwchPrefix,
        IXMLDOMNode *pContextNode,
        WCHAR *pwchUri,
        int *pcchUri);

    END_INTERFACE
} IMXNamespaceManagerVtbl;

interface IMXNamespaceManager {
    CONST_VTBL IMXNamespaceManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMXNamespaceManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMXNamespaceManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMXNamespaceManager_Release(This) (This)->lpVtbl->Release(This)
/*** IMXNamespaceManager methods ***/
#define IMXNamespaceManager_putAllowOverride(This,fOverride) (This)->lpVtbl->putAllowOverride(This,fOverride)
#define IMXNamespaceManager_getAllowOverride(This,fOverride) (This)->lpVtbl->getAllowOverride(This,fOverride)
#define IMXNamespaceManager_reset(This) (This)->lpVtbl->reset(This)
#define IMXNamespaceManager_pushContext(This) (This)->lpVtbl->pushContext(This)
#define IMXNamespaceManager_pushNodeContext(This,contextNode,fDeep) (This)->lpVtbl->pushNodeContext(This,contextNode,fDeep)
#define IMXNamespaceManager_popContext(This) (This)->lpVtbl->popContext(This)
#define IMXNamespaceManager_declarePrefix(This,prefix,namespaceURI) (This)->lpVtbl->declarePrefix(This,prefix,namespaceURI)
#define IMXNamespaceManager_getDeclaredPrefix(This,nIndex,pwchPrefix,pcchPrefix) (This)->lpVtbl->getDeclaredPrefix(This,nIndex,pwchPrefix,pcchPrefix)
#define IMXNamespaceManager_getPrefix(This,pwszNamespaceURI,nIndex,pwchPrefix,pcchPrefix) (This)->lpVtbl->getPrefix(This,pwszNamespaceURI,nIndex,pwchPrefix,pcchPrefix)
#define IMXNamespaceManager_getURI(This,pwchPrefix,pContextNode,pwchUri,pcchUri) (This)->lpVtbl->getURI(This,pwchPrefix,pContextNode,pwchUri,pcchUri)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMXNamespaceManager_QueryInterface(IMXNamespaceManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMXNamespaceManager_AddRef(IMXNamespaceManager* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMXNamespaceManager_Release(IMXNamespaceManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IMXNamespaceManager methods ***/
static __WIDL_INLINE HRESULT IMXNamespaceManager_putAllowOverride(IMXNamespaceManager* This,VARIANT_BOOL fOverride) {
    return This->lpVtbl->putAllowOverride(This,fOverride);
}
static __WIDL_INLINE HRESULT IMXNamespaceManager_getAllowOverride(IMXNamespaceManager* This,VARIANT_BOOL *fOverride) {
    return This->lpVtbl->getAllowOverride(This,fOverride);
}
static __WIDL_INLINE HRESULT IMXNamespaceManager_reset(IMXNamespaceManager* This) {
    return This->lpVtbl->reset(This);
}
static __WIDL_INLINE HRESULT IMXNamespaceManager_pushContext(IMXNamespaceManager* This) {
    return This->lpVtbl->pushContext(This);
}
static __WIDL_INLINE HRESULT IMXNamespaceManager_pushNodeContext(IMXNamespaceManager* This,IXMLDOMNode *contextNode,VARIANT_BOOL fDeep) {
    return This->lpVtbl->pushNodeContext(This,contextNode,fDeep);
}
static __WIDL_INLINE HRESULT IMXNamespaceManager_popContext(IMXNamespaceManager* This) {
    return This->lpVtbl->popContext(This);
}
static __WIDL_INLINE HRESULT IMXNamespaceManager_declarePrefix(IMXNamespaceManager* This,const WCHAR *prefix,const WCHAR *namespaceURI) {
    return This->lpVtbl->declarePrefix(This,prefix,namespaceURI);
}
static __WIDL_INLINE HRESULT IMXNamespaceManager_getDeclaredPrefix(IMXNamespaceManager* This,LONG nIndex,WCHAR *pwchPrefix,int *pcchPrefix) {
    return This->lpVtbl->getDeclaredPrefix(This,nIndex,pwchPrefix,pcchPrefix);
}
static __WIDL_INLINE HRESULT IMXNamespaceManager_getPrefix(IMXNamespaceManager* This,const WCHAR *pwszNamespaceURI,LONG nIndex,WCHAR *pwchPrefix,int *pcchPrefix) {
    return This->lpVtbl->getPrefix(This,pwszNamespaceURI,nIndex,pwchPrefix,pcchPrefix);
}
static __WIDL_INLINE HRESULT IMXNamespaceManager_getURI(IMXNamespaceManager* This,const WCHAR *pwchPrefix,IXMLDOMNode *pContextNode,WCHAR *pwchUri,int *pcchUri) {
    return This->lpVtbl->getURI(This,pwchPrefix,pContextNode,pwchUri,pcchUri);
}
#endif
#endif

#endif


#endif  /* __IMXNamespaceManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVBMXNamespaceManager interface
 */
#ifndef __IVBMXNamespaceManager_INTERFACE_DEFINED__
#define __IVBMXNamespaceManager_INTERFACE_DEFINED__

DEFINE_GUID(IID_IVBMXNamespaceManager, 0xc90352f5, 0x643c, 0x4fbc, 0xbb,0x23, 0xe9,0x96,0xeb,0x2d,0x51,0xfd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c90352f5-643c-4fbc-bb23-e996eb2d51fd")
IVBMXNamespaceManager : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE put_allowOverride(
        VARIANT_BOOL fOverride) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_allowOverride(
        VARIANT_BOOL *fOverride) = 0;

    virtual HRESULT STDMETHODCALLTYPE reset(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE pushContext(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE pushNodeContext(
        IXMLDOMNode *contextNode,
        VARIANT_BOOL fDeep = -1) = 0;

    virtual HRESULT STDMETHODCALLTYPE popContext(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE declarePrefix(
        BSTR prefix,
        BSTR namespaceURI) = 0;

    virtual HRESULT STDMETHODCALLTYPE getDeclaredPrefixes(
        IMXNamespacePrefixes **prefixes) = 0;

    virtual HRESULT STDMETHODCALLTYPE getPrefixes(
        BSTR namespaceURI,
        IMXNamespacePrefixes **prefixes) = 0;

    virtual HRESULT STDMETHODCALLTYPE getURI(
        BSTR prefix,
        VARIANT *uri) = 0;

    virtual HRESULT STDMETHODCALLTYPE getURIFromNode(
        BSTR strPrefix,
        IXMLDOMNode *contextNode,
        VARIANT *uri) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IVBMXNamespaceManager, 0xc90352f5, 0x643c, 0x4fbc, 0xbb,0x23, 0xe9,0x96,0xeb,0x2d,0x51,0xfd)
#endif
#else
typedef struct IVBMXNamespaceManagerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IVBMXNamespaceManager *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IVBMXNamespaceManager *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IVBMXNamespaceManager *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IVBMXNamespaceManager *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IVBMXNamespaceManager *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IVBMXNamespaceManager *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IVBMXNamespaceManager *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IVBMXNamespaceManager methods ***/
    HRESULT (STDMETHODCALLTYPE *put_allowOverride)(
        IVBMXNamespaceManager *This,
        VARIANT_BOOL fOverride);

    HRESULT (STDMETHODCALLTYPE *get_allowOverride)(
        IVBMXNamespaceManager *This,
        VARIANT_BOOL *fOverride);

    HRESULT (STDMETHODCALLTYPE *reset)(
        IVBMXNamespaceManager *This);

    HRESULT (STDMETHODCALLTYPE *pushContext)(
        IVBMXNamespaceManager *This);

    HRESULT (STDMETHODCALLTYPE *pushNodeContext)(
        IVBMXNamespaceManager *This,
        IXMLDOMNode *contextNode,
        VARIANT_BOOL fDeep);

    HRESULT (STDMETHODCALLTYPE *popContext)(
        IVBMXNamespaceManager *This);

    HRESULT (STDMETHODCALLTYPE *declarePrefix)(
        IVBMXNamespaceManager *This,
        BSTR prefix,
        BSTR namespaceURI);

    HRESULT (STDMETHODCALLTYPE *getDeclaredPrefixes)(
        IVBMXNamespaceManager *This,
        IMXNamespacePrefixes **prefixes);

    HRESULT (STDMETHODCALLTYPE *getPrefixes)(
        IVBMXNamespaceManager *This,
        BSTR namespaceURI,
        IMXNamespacePrefixes **prefixes);

    HRESULT (STDMETHODCALLTYPE *getURI)(
        IVBMXNamespaceManager *This,
        BSTR prefix,
        VARIANT *uri);

    HRESULT (STDMETHODCALLTYPE *getURIFromNode)(
        IVBMXNamespaceManager *This,
        BSTR strPrefix,
        IXMLDOMNode *contextNode,
        VARIANT *uri);

    END_INTERFACE
} IVBMXNamespaceManagerVtbl;

interface IVBMXNamespaceManager {
    CONST_VTBL IVBMXNamespaceManagerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IVBMXNamespaceManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IVBMXNamespaceManager_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IVBMXNamespaceManager_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IVBMXNamespaceManager_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IVBMXNamespaceManager_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IVBMXNamespaceManager_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IVBMXNamespaceManager_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IVBMXNamespaceManager methods ***/
#define IVBMXNamespaceManager_put_allowOverride(This,fOverride) (This)->lpVtbl->put_allowOverride(This,fOverride)
#define IVBMXNamespaceManager_get_allowOverride(This,fOverride) (This)->lpVtbl->get_allowOverride(This,fOverride)
#define IVBMXNamespaceManager_reset(This) (This)->lpVtbl->reset(This)
#define IVBMXNamespaceManager_pushContext(This) (This)->lpVtbl->pushContext(This)
#define IVBMXNamespaceManager_pushNodeContext(This,contextNode,fDeep) (This)->lpVtbl->pushNodeContext(This,contextNode,fDeep)
#define IVBMXNamespaceManager_popContext(This) (This)->lpVtbl->popContext(This)
#define IVBMXNamespaceManager_declarePrefix(This,prefix,namespaceURI) (This)->lpVtbl->declarePrefix(This,prefix,namespaceURI)
#define IVBMXNamespaceManager_getDeclaredPrefixes(This,prefixes) (This)->lpVtbl->getDeclaredPrefixes(This,prefixes)
#define IVBMXNamespaceManager_getPrefixes(This,namespaceURI,prefixes) (This)->lpVtbl->getPrefixes(This,namespaceURI,prefixes)
#define IVBMXNamespaceManager_getURI(This,prefix,uri) (This)->lpVtbl->getURI(This,prefix,uri)
#define IVBMXNamespaceManager_getURIFromNode(This,strPrefix,contextNode,uri) (This)->lpVtbl->getURIFromNode(This,strPrefix,contextNode,uri)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_QueryInterface(IVBMXNamespaceManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IVBMXNamespaceManager_AddRef(IVBMXNamespaceManager* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IVBMXNamespaceManager_Release(IVBMXNamespaceManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_GetTypeInfoCount(IVBMXNamespaceManager* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_GetTypeInfo(IVBMXNamespaceManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_GetIDsOfNames(IVBMXNamespaceManager* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_Invoke(IVBMXNamespaceManager* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IVBMXNamespaceManager methods ***/
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_put_allowOverride(IVBMXNamespaceManager* This,VARIANT_BOOL fOverride) {
    return This->lpVtbl->put_allowOverride(This,fOverride);
}
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_get_allowOverride(IVBMXNamespaceManager* This,VARIANT_BOOL *fOverride) {
    return This->lpVtbl->get_allowOverride(This,fOverride);
}
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_reset(IVBMXNamespaceManager* This) {
    return This->lpVtbl->reset(This);
}
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_pushContext(IVBMXNamespaceManager* This) {
    return This->lpVtbl->pushContext(This);
}
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_pushNodeContext(IVBMXNamespaceManager* This,IXMLDOMNode *contextNode,VARIANT_BOOL fDeep) {
    return This->lpVtbl->pushNodeContext(This,contextNode,fDeep);
}
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_popContext(IVBMXNamespaceManager* This) {
    return This->lpVtbl->popContext(This);
}
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_declarePrefix(IVBMXNamespaceManager* This,BSTR prefix,BSTR namespaceURI) {
    return This->lpVtbl->declarePrefix(This,prefix,namespaceURI);
}
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_getDeclaredPrefixes(IVBMXNamespaceManager* This,IMXNamespacePrefixes **prefixes) {
    return This->lpVtbl->getDeclaredPrefixes(This,prefixes);
}
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_getPrefixes(IVBMXNamespaceManager* This,BSTR namespaceURI,IMXNamespacePrefixes **prefixes) {
    return This->lpVtbl->getPrefixes(This,namespaceURI,prefixes);
}
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_getURI(IVBMXNamespaceManager* This,BSTR prefix,VARIANT *uri) {
    return This->lpVtbl->getURI(This,prefix,uri);
}
static __WIDL_INLINE HRESULT IVBMXNamespaceManager_getURIFromNode(IVBMXNamespaceManager* This,BSTR strPrefix,IXMLDOMNode *contextNode,VARIANT *uri) {
    return This->lpVtbl->getURIFromNode(This,strPrefix,contextNode,uri);
}
#endif
#endif

#endif


#endif  /* __IVBMXNamespaceManager_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IMXXMLFilter interface
 */
#ifndef __IMXXMLFilter_INTERFACE_DEFINED__
#define __IMXXMLFilter_INTERFACE_DEFINED__

DEFINE_GUID(IID_IMXXMLFilter, 0xc90352f7, 0x643c, 0x4fbc, 0xbb,0x23, 0xe9,0x96,0xeb,0x2d,0x51,0xfd);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c90352f7-643c-4fbc-bb23-e996eb2d51fd")
IMXXMLFilter : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE getFeature(
        BSTR strName,
        VARIANT_BOOL *fValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE putFeature(
        BSTR strName,
        VARIANT_BOOL fValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE getProperty(
        BSTR strName,
        VARIANT *varValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE putProperty(
        BSTR strName,
        VARIANT varValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_entityResolver(
        IUnknown **oResolver) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_entityResolver(
        IUnknown *oResolver) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_contentHandler(
        IUnknown **oHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_contentHandler(
        IUnknown *oHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_dtdHandler(
        IUnknown **oHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_dtdHandler(
        IUnknown *oHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_errorHandler(
        IUnknown **oHandler) = 0;

    virtual HRESULT STDMETHODCALLTYPE putref_errorHandler(
        IUnknown *oHandler) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IMXXMLFilter, 0xc90352f7, 0x643c, 0x4fbc, 0xbb,0x23, 0xe9,0x96,0xeb,0x2d,0x51,0xfd)
#endif
#else
typedef struct IMXXMLFilterVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        IMXXMLFilter *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        IMXXMLFilter *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        IMXXMLFilter *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        IMXXMLFilter *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        IMXXMLFilter *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        IMXXMLFilter *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        IMXXMLFilter *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** IMXXMLFilter methods ***/
    HRESULT (STDMETHODCALLTYPE *getFeature)(
        IMXXMLFilter *This,
        BSTR strName,
        VARIANT_BOOL *fValue);

    HRESULT (STDMETHODCALLTYPE *putFeature)(
        IMXXMLFilter *This,
        BSTR strName,
        VARIANT_BOOL fValue);

    HRESULT (STDMETHODCALLTYPE *getProperty)(
        IMXXMLFilter *This,
        BSTR strName,
        VARIANT *varValue);

    HRESULT (STDMETHODCALLTYPE *putProperty)(
        IMXXMLFilter *This,
        BSTR strName,
        VARIANT varValue);

    HRESULT (STDMETHODCALLTYPE *get_entityResolver)(
        IMXXMLFilter *This,
        IUnknown **oResolver);

    HRESULT (STDMETHODCALLTYPE *putref_entityResolver)(
        IMXXMLFilter *This,
        IUnknown *oResolver);

    HRESULT (STDMETHODCALLTYPE *get_contentHandler)(
        IMXXMLFilter *This,
        IUnknown **oHandler);

    HRESULT (STDMETHODCALLTYPE *putref_contentHandler)(
        IMXXMLFilter *This,
        IUnknown *oHandler);

    HRESULT (STDMETHODCALLTYPE *get_dtdHandler)(
        IMXXMLFilter *This,
        IUnknown **oHandler);

    HRESULT (STDMETHODCALLTYPE *putref_dtdHandler)(
        IMXXMLFilter *This,
        IUnknown *oHandler);

    HRESULT (STDMETHODCALLTYPE *get_errorHandler)(
        IMXXMLFilter *This,
        IUnknown **oHandler);

    HRESULT (STDMETHODCALLTYPE *putref_errorHandler)(
        IMXXMLFilter *This,
        IUnknown *oHandler);

    END_INTERFACE
} IMXXMLFilterVtbl;

interface IMXXMLFilter {
    CONST_VTBL IMXXMLFilterVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IMXXMLFilter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IMXXMLFilter_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IMXXMLFilter_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IMXXMLFilter_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IMXXMLFilter_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IMXXMLFilter_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IMXXMLFilter_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IMXXMLFilter methods ***/
#define IMXXMLFilter_getFeature(This,strName,fValue) (This)->lpVtbl->getFeature(This,strName,fValue)
#define IMXXMLFilter_putFeature(This,strName,fValue) (This)->lpVtbl->putFeature(This,strName,fValue)
#define IMXXMLFilter_getProperty(This,strName,varValue) (This)->lpVtbl->getProperty(This,strName,varValue)
#define IMXXMLFilter_putProperty(This,strName,varValue) (This)->lpVtbl->putProperty(This,strName,varValue)
#define IMXXMLFilter_get_entityResolver(This,oResolver) (This)->lpVtbl->get_entityResolver(This,oResolver)
#define IMXXMLFilter_putref_entityResolver(This,oResolver) (This)->lpVtbl->putref_entityResolver(This,oResolver)
#define IMXXMLFilter_get_contentHandler(This,oHandler) (This)->lpVtbl->get_contentHandler(This,oHandler)
#define IMXXMLFilter_putref_contentHandler(This,oHandler) (This)->lpVtbl->putref_contentHandler(This,oHandler)
#define IMXXMLFilter_get_dtdHandler(This,oHandler) (This)->lpVtbl->get_dtdHandler(This,oHandler)
#define IMXXMLFilter_putref_dtdHandler(This,oHandler) (This)->lpVtbl->putref_dtdHandler(This,oHandler)
#define IMXXMLFilter_get_errorHandler(This,oHandler) (This)->lpVtbl->get_errorHandler(This,oHandler)
#define IMXXMLFilter_putref_errorHandler(This,oHandler) (This)->lpVtbl->putref_errorHandler(This,oHandler)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT IMXXMLFilter_QueryInterface(IMXXMLFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG IMXXMLFilter_AddRef(IMXXMLFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG IMXXMLFilter_Release(IMXXMLFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT IMXXMLFilter_GetTypeInfoCount(IMXXMLFilter* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT IMXXMLFilter_GetTypeInfo(IMXXMLFilter* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT IMXXMLFilter_GetIDsOfNames(IMXXMLFilter* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT IMXXMLFilter_Invoke(IMXXMLFilter* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IMXXMLFilter methods ***/
static __WIDL_INLINE HRESULT IMXXMLFilter_getFeature(IMXXMLFilter* This,BSTR strName,VARIANT_BOOL *fValue) {
    return This->lpVtbl->getFeature(This,strName,fValue);
}
static __WIDL_INLINE HRESULT IMXXMLFilter_putFeature(IMXXMLFilter* This,BSTR strName,VARIANT_BOOL fValue) {
    return This->lpVtbl->putFeature(This,strName,fValue);
}
static __WIDL_INLINE HRESULT IMXXMLFilter_getProperty(IMXXMLFilter* This,BSTR strName,VARIANT *varValue) {
    return This->lpVtbl->getProperty(This,strName,varValue);
}
static __WIDL_INLINE HRESULT IMXXMLFilter_putProperty(IMXXMLFilter* This,BSTR strName,VARIANT varValue) {
    return This->lpVtbl->putProperty(This,strName,varValue);
}
static __WIDL_INLINE HRESULT IMXXMLFilter_get_entityResolver(IMXXMLFilter* This,IUnknown **oResolver) {
    return This->lpVtbl->get_entityResolver(This,oResolver);
}
static __WIDL_INLINE HRESULT IMXXMLFilter_putref_entityResolver(IMXXMLFilter* This,IUnknown *oResolver) {
    return This->lpVtbl->putref_entityResolver(This,oResolver);
}
static __WIDL_INLINE HRESULT IMXXMLFilter_get_contentHandler(IMXXMLFilter* This,IUnknown **oHandler) {
    return This->lpVtbl->get_contentHandler(This,oHandler);
}
static __WIDL_INLINE HRESULT IMXXMLFilter_putref_contentHandler(IMXXMLFilter* This,IUnknown *oHandler) {
    return This->lpVtbl->putref_contentHandler(This,oHandler);
}
static __WIDL_INLINE HRESULT IMXXMLFilter_get_dtdHandler(IMXXMLFilter* This,IUnknown **oHandler) {
    return This->lpVtbl->get_dtdHandler(This,oHandler);
}
static __WIDL_INLINE HRESULT IMXXMLFilter_putref_dtdHandler(IMXXMLFilter* This,IUnknown *oHandler) {
    return This->lpVtbl->putref_dtdHandler(This,oHandler);
}
static __WIDL_INLINE HRESULT IMXXMLFilter_get_errorHandler(IMXXMLFilter* This,IUnknown **oHandler) {
    return This->lpVtbl->get_errorHandler(This,oHandler);
}
static __WIDL_INLINE HRESULT IMXXMLFilter_putref_errorHandler(IMXXMLFilter* This,IUnknown *oHandler) {
    return This->lpVtbl->putref_errorHandler(This,oHandler);
}
#endif
#endif

#endif


#endif  /* __IMXXMLFilter_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISchemaStringCollection interface
 */
#ifndef __ISchemaStringCollection_INTERFACE_DEFINED__
#define __ISchemaStringCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISchemaStringCollection, 0x50ea08b1, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08b1-dd1b-4664-9a50-c2f40f4bd79a")
ISchemaStringCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_item(
        LONG index,
        BSTR *bstr) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **ppunk) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISchemaStringCollection, 0x50ea08b1, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct ISchemaStringCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISchemaStringCollection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISchemaStringCollection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISchemaStringCollection *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISchemaStringCollection *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISchemaStringCollection *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISchemaStringCollection *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISchemaStringCollection *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISchemaStringCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_item)(
        ISchemaStringCollection *This,
        LONG index,
        BSTR *bstr);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        ISchemaStringCollection *This,
        LONG *length);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        ISchemaStringCollection *This,
        IUnknown **ppunk);

    END_INTERFACE
} ISchemaStringCollectionVtbl;

interface ISchemaStringCollection {
    CONST_VTBL ISchemaStringCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISchemaStringCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchemaStringCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchemaStringCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISchemaStringCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISchemaStringCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISchemaStringCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISchemaStringCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISchemaStringCollection methods ***/
#define ISchemaStringCollection_get_item(This,index,bstr) (This)->lpVtbl->get_item(This,index,bstr)
#define ISchemaStringCollection_get_length(This,length) (This)->lpVtbl->get_length(This,length)
#define ISchemaStringCollection_get__newEnum(This,ppunk) (This)->lpVtbl->get__newEnum(This,ppunk)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISchemaStringCollection_QueryInterface(ISchemaStringCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISchemaStringCollection_AddRef(ISchemaStringCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISchemaStringCollection_Release(ISchemaStringCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISchemaStringCollection_GetTypeInfoCount(ISchemaStringCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISchemaStringCollection_GetTypeInfo(ISchemaStringCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT ISchemaStringCollection_GetIDsOfNames(ISchemaStringCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT ISchemaStringCollection_Invoke(ISchemaStringCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISchemaStringCollection methods ***/
static __WIDL_INLINE HRESULT ISchemaStringCollection_get_item(ISchemaStringCollection* This,LONG index,BSTR *bstr) {
    return This->lpVtbl->get_item(This,index,bstr);
}
static __WIDL_INLINE HRESULT ISchemaStringCollection_get_length(ISchemaStringCollection* This,LONG *length) {
    return This->lpVtbl->get_length(This,length);
}
static __WIDL_INLINE HRESULT ISchemaStringCollection_get__newEnum(ISchemaStringCollection* This,IUnknown **ppunk) {
    return This->lpVtbl->get__newEnum(This,ppunk);
}
#endif
#endif

#endif


#endif  /* __ISchemaStringCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISchemaItemCollection interface
 */
#ifndef __ISchemaItemCollection_INTERFACE_DEFINED__
#define __ISchemaItemCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISchemaItemCollection, 0x50ea08b2, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08b2-dd1b-4664-9a50-c2f40f4bd79a")
ISchemaItemCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_item(
        LONG index,
        ISchemaItem **item) = 0;

    virtual HRESULT STDMETHODCALLTYPE itemByName(
        BSTR name,
        ISchemaItem **item) = 0;

    virtual HRESULT STDMETHODCALLTYPE itemByQName(
        BSTR name,
        BSTR namespaceURI,
        ISchemaItem **item) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        LONG *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__newEnum(
        IUnknown **ppunk) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISchemaItemCollection, 0x50ea08b2, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct ISchemaItemCollectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISchemaItemCollection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISchemaItemCollection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISchemaItemCollection *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISchemaItemCollection *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISchemaItemCollection *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISchemaItemCollection *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISchemaItemCollection *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISchemaItemCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_item)(
        ISchemaItemCollection *This,
        LONG index,
        ISchemaItem **item);

    HRESULT (STDMETHODCALLTYPE *itemByName)(
        ISchemaItemCollection *This,
        BSTR name,
        ISchemaItem **item);

    HRESULT (STDMETHODCALLTYPE *itemByQName)(
        ISchemaItemCollection *This,
        BSTR name,
        BSTR namespaceURI,
        ISchemaItem **item);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        ISchemaItemCollection *This,
        LONG *length);

    HRESULT (STDMETHODCALLTYPE *get__newEnum)(
        ISchemaItemCollection *This,
        IUnknown **ppunk);

    END_INTERFACE
} ISchemaItemCollectionVtbl;

interface ISchemaItemCollection {
    CONST_VTBL ISchemaItemCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISchemaItemCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchemaItemCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchemaItemCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISchemaItemCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISchemaItemCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISchemaItemCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISchemaItemCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISchemaItemCollection methods ***/
#define ISchemaItemCollection_get_item(This,index,item) (This)->lpVtbl->get_item(This,index,item)
#define ISchemaItemCollection_itemByName(This,name,item) (This)->lpVtbl->itemByName(This,name,item)
#define ISchemaItemCollection_itemByQName(This,name,namespaceURI,item) (This)->lpVtbl->itemByQName(This,name,namespaceURI,item)
#define ISchemaItemCollection_get_length(This,length) (This)->lpVtbl->get_length(This,length)
#define ISchemaItemCollection_get__newEnum(This,ppunk) (This)->lpVtbl->get__newEnum(This,ppunk)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISchemaItemCollection_QueryInterface(ISchemaItemCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISchemaItemCollection_AddRef(ISchemaItemCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISchemaItemCollection_Release(ISchemaItemCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISchemaItemCollection_GetTypeInfoCount(ISchemaItemCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISchemaItemCollection_GetTypeInfo(ISchemaItemCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT ISchemaItemCollection_GetIDsOfNames(ISchemaItemCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT ISchemaItemCollection_Invoke(ISchemaItemCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISchemaItemCollection methods ***/
static __WIDL_INLINE HRESULT ISchemaItemCollection_get_item(ISchemaItemCollection* This,LONG index,ISchemaItem **item) {
    return This->lpVtbl->get_item(This,index,item);
}
static __WIDL_INLINE HRESULT ISchemaItemCollection_itemByName(ISchemaItemCollection* This,BSTR name,ISchemaItem **item) {
    return This->lpVtbl->itemByName(This,name,item);
}
static __WIDL_INLINE HRESULT ISchemaItemCollection_itemByQName(ISchemaItemCollection* This,BSTR name,BSTR namespaceURI,ISchemaItem **item) {
    return This->lpVtbl->itemByQName(This,name,namespaceURI,item);
}
static __WIDL_INLINE HRESULT ISchemaItemCollection_get_length(ISchemaItemCollection* This,LONG *length) {
    return This->lpVtbl->get_length(This,length);
}
static __WIDL_INLINE HRESULT ISchemaItemCollection_get__newEnum(ISchemaItemCollection* This,IUnknown **ppunk) {
    return This->lpVtbl->get__newEnum(This,ppunk);
}
#endif
#endif

#endif


#endif  /* __ISchemaItemCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISchemaItem interface
 */
#ifndef __ISchemaItem_INTERFACE_DEFINED__
#define __ISchemaItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISchemaItem, 0x50ea08b3, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08b3-dd1b-4664-9a50-c2f40f4bd79a")
ISchemaItem : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_name(
        BSTR *name) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_namespaceURI(
        BSTR *namespaceURI) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_schema(
        ISchema **schema) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_id(
        BSTR *id) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_itemType(
        SOMITEMTYPE *itemType) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_unhandledAttributes(
        IVBSAXAttributes **attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE writeAnnotation(
        IUnknown *annotationSink,
        VARIANT_BOOL *isWritten) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISchemaItem, 0x50ea08b3, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct ISchemaItemVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISchemaItem *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISchemaItem *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISchemaItem *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISchemaItem *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISchemaItem *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISchemaItem *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISchemaItem *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISchemaItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        ISchemaItem *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        ISchemaItem *This,
        BSTR *namespaceURI);

    HRESULT (STDMETHODCALLTYPE *get_schema)(
        ISchemaItem *This,
        ISchema **schema);

    HRESULT (STDMETHODCALLTYPE *get_id)(
        ISchemaItem *This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *get_itemType)(
        ISchemaItem *This,
        SOMITEMTYPE *itemType);

    HRESULT (STDMETHODCALLTYPE *get_unhandledAttributes)(
        ISchemaItem *This,
        IVBSAXAttributes **attributes);

    HRESULT (STDMETHODCALLTYPE *writeAnnotation)(
        ISchemaItem *This,
        IUnknown *annotationSink,
        VARIANT_BOOL *isWritten);

    END_INTERFACE
} ISchemaItemVtbl;

interface ISchemaItem {
    CONST_VTBL ISchemaItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISchemaItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchemaItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchemaItem_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISchemaItem_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISchemaItem_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISchemaItem_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISchemaItem_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISchemaItem methods ***/
#define ISchemaItem_get_name(This,name) (This)->lpVtbl->get_name(This,name)
#define ISchemaItem_get_namespaceURI(This,namespaceURI) (This)->lpVtbl->get_namespaceURI(This,namespaceURI)
#define ISchemaItem_get_schema(This,schema) (This)->lpVtbl->get_schema(This,schema)
#define ISchemaItem_get_id(This,id) (This)->lpVtbl->get_id(This,id)
#define ISchemaItem_get_itemType(This,itemType) (This)->lpVtbl->get_itemType(This,itemType)
#define ISchemaItem_get_unhandledAttributes(This,attributes) (This)->lpVtbl->get_unhandledAttributes(This,attributes)
#define ISchemaItem_writeAnnotation(This,annotationSink,isWritten) (This)->lpVtbl->writeAnnotation(This,annotationSink,isWritten)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISchemaItem_QueryInterface(ISchemaItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISchemaItem_AddRef(ISchemaItem* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISchemaItem_Release(ISchemaItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISchemaItem_GetTypeInfoCount(ISchemaItem* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISchemaItem_GetTypeInfo(ISchemaItem* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT ISchemaItem_GetIDsOfNames(ISchemaItem* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT ISchemaItem_Invoke(ISchemaItem* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISchemaItem methods ***/
static __WIDL_INLINE HRESULT ISchemaItem_get_name(ISchemaItem* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static __WIDL_INLINE HRESULT ISchemaItem_get_namespaceURI(ISchemaItem* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static __WIDL_INLINE HRESULT ISchemaItem_get_schema(ISchemaItem* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static __WIDL_INLINE HRESULT ISchemaItem_get_id(ISchemaItem* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static __WIDL_INLINE HRESULT ISchemaItem_get_itemType(ISchemaItem* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static __WIDL_INLINE HRESULT ISchemaItem_get_unhandledAttributes(ISchemaItem* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static __WIDL_INLINE HRESULT ISchemaItem_writeAnnotation(ISchemaItem* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
#endif
#endif

#endif


#endif  /* __ISchemaItem_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISchema interface
 */
#ifndef __ISchema_INTERFACE_DEFINED__
#define __ISchema_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISchema, 0x50ea08b4, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08b4-dd1b-4664-9a50-c2f40f4bd79a")
ISchema : public ISchemaItem
{
    virtual HRESULT STDMETHODCALLTYPE get_targetNamespace(
        BSTR *targetNamespace) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_version(
        BSTR *version) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_types(
        ISchemaItemCollection **types) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_elements(
        ISchemaItemCollection **elements) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_attributes(
        ISchemaItemCollection **attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_attributeGroups(
        ISchemaItemCollection **attributeGroups) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_modelGroups(
        ISchemaItemCollection **modelGroups) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_notations(
        ISchemaItemCollection **notations) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_schemaLocations(
        ISchemaStringCollection **schemaLocations) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISchema, 0x50ea08b4, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct ISchemaVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISchema *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISchema *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISchema *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISchema *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISchema *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISchema *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISchema *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISchemaItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        ISchema *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        ISchema *This,
        BSTR *namespaceURI);

    HRESULT (STDMETHODCALLTYPE *get_schema)(
        ISchema *This,
        ISchema **schema);

    HRESULT (STDMETHODCALLTYPE *get_id)(
        ISchema *This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *get_itemType)(
        ISchema *This,
        SOMITEMTYPE *itemType);

    HRESULT (STDMETHODCALLTYPE *get_unhandledAttributes)(
        ISchema *This,
        IVBSAXAttributes **attributes);

    HRESULT (STDMETHODCALLTYPE *writeAnnotation)(
        ISchema *This,
        IUnknown *annotationSink,
        VARIANT_BOOL *isWritten);

    /*** ISchema methods ***/
    HRESULT (STDMETHODCALLTYPE *get_targetNamespace)(
        ISchema *This,
        BSTR *targetNamespace);

    HRESULT (STDMETHODCALLTYPE *get_version)(
        ISchema *This,
        BSTR *version);

    HRESULT (STDMETHODCALLTYPE *get_types)(
        ISchema *This,
        ISchemaItemCollection **types);

    HRESULT (STDMETHODCALLTYPE *get_elements)(
        ISchema *This,
        ISchemaItemCollection **elements);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        ISchema *This,
        ISchemaItemCollection **attributes);

    HRESULT (STDMETHODCALLTYPE *get_attributeGroups)(
        ISchema *This,
        ISchemaItemCollection **attributeGroups);

    HRESULT (STDMETHODCALLTYPE *get_modelGroups)(
        ISchema *This,
        ISchemaItemCollection **modelGroups);

    HRESULT (STDMETHODCALLTYPE *get_notations)(
        ISchema *This,
        ISchemaItemCollection **notations);

    HRESULT (STDMETHODCALLTYPE *get_schemaLocations)(
        ISchema *This,
        ISchemaStringCollection **schemaLocations);

    END_INTERFACE
} ISchemaVtbl;

interface ISchema {
    CONST_VTBL ISchemaVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISchema_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchema_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchema_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISchema_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISchema_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISchema_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISchema_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISchemaItem methods ***/
#define ISchema_get_name(This,name) (This)->lpVtbl->get_name(This,name)
#define ISchema_get_namespaceURI(This,namespaceURI) (This)->lpVtbl->get_namespaceURI(This,namespaceURI)
#define ISchema_get_schema(This,schema) (This)->lpVtbl->get_schema(This,schema)
#define ISchema_get_id(This,id) (This)->lpVtbl->get_id(This,id)
#define ISchema_get_itemType(This,itemType) (This)->lpVtbl->get_itemType(This,itemType)
#define ISchema_get_unhandledAttributes(This,attributes) (This)->lpVtbl->get_unhandledAttributes(This,attributes)
#define ISchema_writeAnnotation(This,annotationSink,isWritten) (This)->lpVtbl->writeAnnotation(This,annotationSink,isWritten)
/*** ISchema methods ***/
#define ISchema_get_targetNamespace(This,targetNamespace) (This)->lpVtbl->get_targetNamespace(This,targetNamespace)
#define ISchema_get_version(This,version) (This)->lpVtbl->get_version(This,version)
#define ISchema_get_types(This,types) (This)->lpVtbl->get_types(This,types)
#define ISchema_get_elements(This,elements) (This)->lpVtbl->get_elements(This,elements)
#define ISchema_get_attributes(This,attributes) (This)->lpVtbl->get_attributes(This,attributes)
#define ISchema_get_attributeGroups(This,attributeGroups) (This)->lpVtbl->get_attributeGroups(This,attributeGroups)
#define ISchema_get_modelGroups(This,modelGroups) (This)->lpVtbl->get_modelGroups(This,modelGroups)
#define ISchema_get_notations(This,notations) (This)->lpVtbl->get_notations(This,notations)
#define ISchema_get_schemaLocations(This,schemaLocations) (This)->lpVtbl->get_schemaLocations(This,schemaLocations)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISchema_QueryInterface(ISchema* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISchema_AddRef(ISchema* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISchema_Release(ISchema* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISchema_GetTypeInfoCount(ISchema* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISchema_GetTypeInfo(ISchema* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT ISchema_GetIDsOfNames(ISchema* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT ISchema_Invoke(ISchema* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISchemaItem methods ***/
static __WIDL_INLINE HRESULT ISchema_get_name(ISchema* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static __WIDL_INLINE HRESULT ISchema_get_namespaceURI(ISchema* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static __WIDL_INLINE HRESULT ISchema_get_schema(ISchema* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static __WIDL_INLINE HRESULT ISchema_get_id(ISchema* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static __WIDL_INLINE HRESULT ISchema_get_itemType(ISchema* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static __WIDL_INLINE HRESULT ISchema_get_unhandledAttributes(ISchema* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static __WIDL_INLINE HRESULT ISchema_writeAnnotation(ISchema* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchema methods ***/
static __WIDL_INLINE HRESULT ISchema_get_targetNamespace(ISchema* This,BSTR *targetNamespace) {
    return This->lpVtbl->get_targetNamespace(This,targetNamespace);
}
static __WIDL_INLINE HRESULT ISchema_get_version(ISchema* This,BSTR *version) {
    return This->lpVtbl->get_version(This,version);
}
static __WIDL_INLINE HRESULT ISchema_get_types(ISchema* This,ISchemaItemCollection **types) {
    return This->lpVtbl->get_types(This,types);
}
static __WIDL_INLINE HRESULT ISchema_get_elements(ISchema* This,ISchemaItemCollection **elements) {
    return This->lpVtbl->get_elements(This,elements);
}
static __WIDL_INLINE HRESULT ISchema_get_attributes(ISchema* This,ISchemaItemCollection **attributes) {
    return This->lpVtbl->get_attributes(This,attributes);
}
static __WIDL_INLINE HRESULT ISchema_get_attributeGroups(ISchema* This,ISchemaItemCollection **attributeGroups) {
    return This->lpVtbl->get_attributeGroups(This,attributeGroups);
}
static __WIDL_INLINE HRESULT ISchema_get_modelGroups(ISchema* This,ISchemaItemCollection **modelGroups) {
    return This->lpVtbl->get_modelGroups(This,modelGroups);
}
static __WIDL_INLINE HRESULT ISchema_get_notations(ISchema* This,ISchemaItemCollection **notations) {
    return This->lpVtbl->get_notations(This,notations);
}
static __WIDL_INLINE HRESULT ISchema_get_schemaLocations(ISchema* This,ISchemaStringCollection **schemaLocations) {
    return This->lpVtbl->get_schemaLocations(This,schemaLocations);
}
#endif
#endif

#endif


#endif  /* __ISchema_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISchemaParticle interface
 */
#ifndef __ISchemaParticle_INTERFACE_DEFINED__
#define __ISchemaParticle_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISchemaParticle, 0x50ea08b5, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08b5-dd1b-4664-9a50-c2f40f4bd79a")
ISchemaParticle : public ISchemaItem
{
    virtual HRESULT STDMETHODCALLTYPE get_minOccurs(
        VARIANT *minOccurs) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxOccurs(
        VARIANT *maxOccurs) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISchemaParticle, 0x50ea08b5, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct ISchemaParticleVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISchemaParticle *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISchemaParticle *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISchemaParticle *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISchemaParticle *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISchemaParticle *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISchemaParticle *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISchemaParticle *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISchemaItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        ISchemaParticle *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        ISchemaParticle *This,
        BSTR *namespaceURI);

    HRESULT (STDMETHODCALLTYPE *get_schema)(
        ISchemaParticle *This,
        ISchema **schema);

    HRESULT (STDMETHODCALLTYPE *get_id)(
        ISchemaParticle *This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *get_itemType)(
        ISchemaParticle *This,
        SOMITEMTYPE *itemType);

    HRESULT (STDMETHODCALLTYPE *get_unhandledAttributes)(
        ISchemaParticle *This,
        IVBSAXAttributes **attributes);

    HRESULT (STDMETHODCALLTYPE *writeAnnotation)(
        ISchemaParticle *This,
        IUnknown *annotationSink,
        VARIANT_BOOL *isWritten);

    /*** ISchemaParticle methods ***/
    HRESULT (STDMETHODCALLTYPE *get_minOccurs)(
        ISchemaParticle *This,
        VARIANT *minOccurs);

    HRESULT (STDMETHODCALLTYPE *get_maxOccurs)(
        ISchemaParticle *This,
        VARIANT *maxOccurs);

    END_INTERFACE
} ISchemaParticleVtbl;

interface ISchemaParticle {
    CONST_VTBL ISchemaParticleVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISchemaParticle_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchemaParticle_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchemaParticle_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISchemaParticle_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISchemaParticle_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISchemaParticle_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISchemaParticle_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISchemaItem methods ***/
#define ISchemaParticle_get_name(This,name) (This)->lpVtbl->get_name(This,name)
#define ISchemaParticle_get_namespaceURI(This,namespaceURI) (This)->lpVtbl->get_namespaceURI(This,namespaceURI)
#define ISchemaParticle_get_schema(This,schema) (This)->lpVtbl->get_schema(This,schema)
#define ISchemaParticle_get_id(This,id) (This)->lpVtbl->get_id(This,id)
#define ISchemaParticle_get_itemType(This,itemType) (This)->lpVtbl->get_itemType(This,itemType)
#define ISchemaParticle_get_unhandledAttributes(This,attributes) (This)->lpVtbl->get_unhandledAttributes(This,attributes)
#define ISchemaParticle_writeAnnotation(This,annotationSink,isWritten) (This)->lpVtbl->writeAnnotation(This,annotationSink,isWritten)
/*** ISchemaParticle methods ***/
#define ISchemaParticle_get_minOccurs(This,minOccurs) (This)->lpVtbl->get_minOccurs(This,minOccurs)
#define ISchemaParticle_get_maxOccurs(This,maxOccurs) (This)->lpVtbl->get_maxOccurs(This,maxOccurs)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISchemaParticle_QueryInterface(ISchemaParticle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISchemaParticle_AddRef(ISchemaParticle* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISchemaParticle_Release(ISchemaParticle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISchemaParticle_GetTypeInfoCount(ISchemaParticle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISchemaParticle_GetTypeInfo(ISchemaParticle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT ISchemaParticle_GetIDsOfNames(ISchemaParticle* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT ISchemaParticle_Invoke(ISchemaParticle* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISchemaItem methods ***/
static __WIDL_INLINE HRESULT ISchemaParticle_get_name(ISchemaParticle* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static __WIDL_INLINE HRESULT ISchemaParticle_get_namespaceURI(ISchemaParticle* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static __WIDL_INLINE HRESULT ISchemaParticle_get_schema(ISchemaParticle* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static __WIDL_INLINE HRESULT ISchemaParticle_get_id(ISchemaParticle* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static __WIDL_INLINE HRESULT ISchemaParticle_get_itemType(ISchemaParticle* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static __WIDL_INLINE HRESULT ISchemaParticle_get_unhandledAttributes(ISchemaParticle* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static __WIDL_INLINE HRESULT ISchemaParticle_writeAnnotation(ISchemaParticle* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaParticle methods ***/
static __WIDL_INLINE HRESULT ISchemaParticle_get_minOccurs(ISchemaParticle* This,VARIANT *minOccurs) {
    return This->lpVtbl->get_minOccurs(This,minOccurs);
}
static __WIDL_INLINE HRESULT ISchemaParticle_get_maxOccurs(ISchemaParticle* This,VARIANT *maxOccurs) {
    return This->lpVtbl->get_maxOccurs(This,maxOccurs);
}
#endif
#endif

#endif


#endif  /* __ISchemaParticle_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISchemaAttribute interface
 */
#ifndef __ISchemaAttribute_INTERFACE_DEFINED__
#define __ISchemaAttribute_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISchemaAttribute, 0x50ea08b6, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08b6-dd1b-4664-9a50-c2f40f4bd79a")
ISchemaAttribute : public ISchemaItem
{
    virtual HRESULT STDMETHODCALLTYPE get_type(
        ISchemaType **type) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scope(
        ISchemaComplexType **scope) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultValue(
        BSTR *defaultValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fixedValue(
        BSTR *fixedValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_use(
        SCHEMAUSE *use) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isReference(
        VARIANT_BOOL *reference) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISchemaAttribute, 0x50ea08b6, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct ISchemaAttributeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISchemaAttribute *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISchemaAttribute *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISchemaAttribute *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISchemaAttribute *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISchemaAttribute *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISchemaAttribute *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISchemaAttribute *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISchemaItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        ISchemaAttribute *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        ISchemaAttribute *This,
        BSTR *namespaceURI);

    HRESULT (STDMETHODCALLTYPE *get_schema)(
        ISchemaAttribute *This,
        ISchema **schema);

    HRESULT (STDMETHODCALLTYPE *get_id)(
        ISchemaAttribute *This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *get_itemType)(
        ISchemaAttribute *This,
        SOMITEMTYPE *itemType);

    HRESULT (STDMETHODCALLTYPE *get_unhandledAttributes)(
        ISchemaAttribute *This,
        IVBSAXAttributes **attributes);

    HRESULT (STDMETHODCALLTYPE *writeAnnotation)(
        ISchemaAttribute *This,
        IUnknown *annotationSink,
        VARIANT_BOOL *isWritten);

    /*** ISchemaAttribute methods ***/
    HRESULT (STDMETHODCALLTYPE *get_type)(
        ISchemaAttribute *This,
        ISchemaType **type);

    HRESULT (STDMETHODCALLTYPE *get_scope)(
        ISchemaAttribute *This,
        ISchemaComplexType **scope);

    HRESULT (STDMETHODCALLTYPE *get_defaultValue)(
        ISchemaAttribute *This,
        BSTR *defaultValue);

    HRESULT (STDMETHODCALLTYPE *get_fixedValue)(
        ISchemaAttribute *This,
        BSTR *fixedValue);

    HRESULT (STDMETHODCALLTYPE *get_use)(
        ISchemaAttribute *This,
        SCHEMAUSE *use);

    HRESULT (STDMETHODCALLTYPE *get_isReference)(
        ISchemaAttribute *This,
        VARIANT_BOOL *reference);

    END_INTERFACE
} ISchemaAttributeVtbl;

interface ISchemaAttribute {
    CONST_VTBL ISchemaAttributeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISchemaAttribute_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchemaAttribute_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchemaAttribute_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISchemaAttribute_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISchemaAttribute_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISchemaAttribute_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISchemaAttribute_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISchemaItem methods ***/
#define ISchemaAttribute_get_name(This,name) (This)->lpVtbl->get_name(This,name)
#define ISchemaAttribute_get_namespaceURI(This,namespaceURI) (This)->lpVtbl->get_namespaceURI(This,namespaceURI)
#define ISchemaAttribute_get_schema(This,schema) (This)->lpVtbl->get_schema(This,schema)
#define ISchemaAttribute_get_id(This,id) (This)->lpVtbl->get_id(This,id)
#define ISchemaAttribute_get_itemType(This,itemType) (This)->lpVtbl->get_itemType(This,itemType)
#define ISchemaAttribute_get_unhandledAttributes(This,attributes) (This)->lpVtbl->get_unhandledAttributes(This,attributes)
#define ISchemaAttribute_writeAnnotation(This,annotationSink,isWritten) (This)->lpVtbl->writeAnnotation(This,annotationSink,isWritten)
/*** ISchemaAttribute methods ***/
#define ISchemaAttribute_get_type(This,type) (This)->lpVtbl->get_type(This,type)
#define ISchemaAttribute_get_scope(This,scope) (This)->lpVtbl->get_scope(This,scope)
#define ISchemaAttribute_get_defaultValue(This,defaultValue) (This)->lpVtbl->get_defaultValue(This,defaultValue)
#define ISchemaAttribute_get_fixedValue(This,fixedValue) (This)->lpVtbl->get_fixedValue(This,fixedValue)
#define ISchemaAttribute_get_use(This,use) (This)->lpVtbl->get_use(This,use)
#define ISchemaAttribute_get_isReference(This,reference) (This)->lpVtbl->get_isReference(This,reference)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISchemaAttribute_QueryInterface(ISchemaAttribute* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISchemaAttribute_AddRef(ISchemaAttribute* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISchemaAttribute_Release(ISchemaAttribute* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISchemaAttribute_GetTypeInfoCount(ISchemaAttribute* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISchemaAttribute_GetTypeInfo(ISchemaAttribute* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT ISchemaAttribute_GetIDsOfNames(ISchemaAttribute* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT ISchemaAttribute_Invoke(ISchemaAttribute* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISchemaItem methods ***/
static __WIDL_INLINE HRESULT ISchemaAttribute_get_name(ISchemaAttribute* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static __WIDL_INLINE HRESULT ISchemaAttribute_get_namespaceURI(ISchemaAttribute* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static __WIDL_INLINE HRESULT ISchemaAttribute_get_schema(ISchemaAttribute* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static __WIDL_INLINE HRESULT ISchemaAttribute_get_id(ISchemaAttribute* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static __WIDL_INLINE HRESULT ISchemaAttribute_get_itemType(ISchemaAttribute* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static __WIDL_INLINE HRESULT ISchemaAttribute_get_unhandledAttributes(ISchemaAttribute* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static __WIDL_INLINE HRESULT ISchemaAttribute_writeAnnotation(ISchemaAttribute* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaAttribute methods ***/
static __WIDL_INLINE HRESULT ISchemaAttribute_get_type(ISchemaAttribute* This,ISchemaType **type) {
    return This->lpVtbl->get_type(This,type);
}
static __WIDL_INLINE HRESULT ISchemaAttribute_get_scope(ISchemaAttribute* This,ISchemaComplexType **scope) {
    return This->lpVtbl->get_scope(This,scope);
}
static __WIDL_INLINE HRESULT ISchemaAttribute_get_defaultValue(ISchemaAttribute* This,BSTR *defaultValue) {
    return This->lpVtbl->get_defaultValue(This,defaultValue);
}
static __WIDL_INLINE HRESULT ISchemaAttribute_get_fixedValue(ISchemaAttribute* This,BSTR *fixedValue) {
    return This->lpVtbl->get_fixedValue(This,fixedValue);
}
static __WIDL_INLINE HRESULT ISchemaAttribute_get_use(ISchemaAttribute* This,SCHEMAUSE *use) {
    return This->lpVtbl->get_use(This,use);
}
static __WIDL_INLINE HRESULT ISchemaAttribute_get_isReference(ISchemaAttribute* This,VARIANT_BOOL *reference) {
    return This->lpVtbl->get_isReference(This,reference);
}
#endif
#endif

#endif


#endif  /* __ISchemaAttribute_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISchemaElement interface
 */
#ifndef __ISchemaElement_INTERFACE_DEFINED__
#define __ISchemaElement_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISchemaElement, 0x50ea08b7, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08b7-dd1b-4664-9a50-c2f40f4bd79a")
ISchemaElement : public ISchemaParticle
{
    virtual HRESULT STDMETHODCALLTYPE get_type(
        ISchemaType **type) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_scope(
        ISchemaComplexType **scope) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_defaultValue(
        BSTR *defaultValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fixedValue(
        BSTR *fixedValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isNillable(
        VARIANT_BOOL *nillable) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_identityConstraints(
        ISchemaItemCollection **constraints) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_substitutionGroup(
        ISchemaElement **element) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_substitutionGroupExclusions(
        SCHEMADERIVATIONMETHOD *exclusions) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_disallowedSubstitutions(
        SCHEMADERIVATIONMETHOD *disallowed) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isAbstract(
        VARIANT_BOOL *abstract) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_isReference(
        VARIANT_BOOL *reference) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISchemaElement, 0x50ea08b7, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct ISchemaElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISchemaElement *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISchemaElement *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISchemaElement *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISchemaElement *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISchemaElement *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISchemaElement *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISchemaElement *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISchemaItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        ISchemaElement *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        ISchemaElement *This,
        BSTR *namespaceURI);

    HRESULT (STDMETHODCALLTYPE *get_schema)(
        ISchemaElement *This,
        ISchema **schema);

    HRESULT (STDMETHODCALLTYPE *get_id)(
        ISchemaElement *This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *get_itemType)(
        ISchemaElement *This,
        SOMITEMTYPE *itemType);

    HRESULT (STDMETHODCALLTYPE *get_unhandledAttributes)(
        ISchemaElement *This,
        IVBSAXAttributes **attributes);

    HRESULT (STDMETHODCALLTYPE *writeAnnotation)(
        ISchemaElement *This,
        IUnknown *annotationSink,
        VARIANT_BOOL *isWritten);

    /*** ISchemaParticle methods ***/
    HRESULT (STDMETHODCALLTYPE *get_minOccurs)(
        ISchemaElement *This,
        VARIANT *minOccurs);

    HRESULT (STDMETHODCALLTYPE *get_maxOccurs)(
        ISchemaElement *This,
        VARIANT *maxOccurs);

    /*** ISchemaElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_type)(
        ISchemaElement *This,
        ISchemaType **type);

    HRESULT (STDMETHODCALLTYPE *get_scope)(
        ISchemaElement *This,
        ISchemaComplexType **scope);

    HRESULT (STDMETHODCALLTYPE *get_defaultValue)(
        ISchemaElement *This,
        BSTR *defaultValue);

    HRESULT (STDMETHODCALLTYPE *get_fixedValue)(
        ISchemaElement *This,
        BSTR *fixedValue);

    HRESULT (STDMETHODCALLTYPE *get_isNillable)(
        ISchemaElement *This,
        VARIANT_BOOL *nillable);

    HRESULT (STDMETHODCALLTYPE *get_identityConstraints)(
        ISchemaElement *This,
        ISchemaItemCollection **constraints);

    HRESULT (STDMETHODCALLTYPE *get_substitutionGroup)(
        ISchemaElement *This,
        ISchemaElement **element);

    HRESULT (STDMETHODCALLTYPE *get_substitutionGroupExclusions)(
        ISchemaElement *This,
        SCHEMADERIVATIONMETHOD *exclusions);

    HRESULT (STDMETHODCALLTYPE *get_disallowedSubstitutions)(
        ISchemaElement *This,
        SCHEMADERIVATIONMETHOD *disallowed);

    HRESULT (STDMETHODCALLTYPE *get_isAbstract)(
        ISchemaElement *This,
        VARIANT_BOOL *abstract);

    HRESULT (STDMETHODCALLTYPE *get_isReference)(
        ISchemaElement *This,
        VARIANT_BOOL *reference);

    END_INTERFACE
} ISchemaElementVtbl;

interface ISchemaElement {
    CONST_VTBL ISchemaElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISchemaElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchemaElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchemaElement_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISchemaElement_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISchemaElement_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISchemaElement_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISchemaElement_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISchemaItem methods ***/
#define ISchemaElement_get_name(This,name) (This)->lpVtbl->get_name(This,name)
#define ISchemaElement_get_namespaceURI(This,namespaceURI) (This)->lpVtbl->get_namespaceURI(This,namespaceURI)
#define ISchemaElement_get_schema(This,schema) (This)->lpVtbl->get_schema(This,schema)
#define ISchemaElement_get_id(This,id) (This)->lpVtbl->get_id(This,id)
#define ISchemaElement_get_itemType(This,itemType) (This)->lpVtbl->get_itemType(This,itemType)
#define ISchemaElement_get_unhandledAttributes(This,attributes) (This)->lpVtbl->get_unhandledAttributes(This,attributes)
#define ISchemaElement_writeAnnotation(This,annotationSink,isWritten) (This)->lpVtbl->writeAnnotation(This,annotationSink,isWritten)
/*** ISchemaParticle methods ***/
#define ISchemaElement_get_minOccurs(This,minOccurs) (This)->lpVtbl->get_minOccurs(This,minOccurs)
#define ISchemaElement_get_maxOccurs(This,maxOccurs) (This)->lpVtbl->get_maxOccurs(This,maxOccurs)
/*** ISchemaElement methods ***/
#define ISchemaElement_get_type(This,type) (This)->lpVtbl->get_type(This,type)
#define ISchemaElement_get_scope(This,scope) (This)->lpVtbl->get_scope(This,scope)
#define ISchemaElement_get_defaultValue(This,defaultValue) (This)->lpVtbl->get_defaultValue(This,defaultValue)
#define ISchemaElement_get_fixedValue(This,fixedValue) (This)->lpVtbl->get_fixedValue(This,fixedValue)
#define ISchemaElement_get_isNillable(This,nillable) (This)->lpVtbl->get_isNillable(This,nillable)
#define ISchemaElement_get_identityConstraints(This,constraints) (This)->lpVtbl->get_identityConstraints(This,constraints)
#define ISchemaElement_get_substitutionGroup(This,element) (This)->lpVtbl->get_substitutionGroup(This,element)
#define ISchemaElement_get_substitutionGroupExclusions(This,exclusions) (This)->lpVtbl->get_substitutionGroupExclusions(This,exclusions)
#define ISchemaElement_get_disallowedSubstitutions(This,disallowed) (This)->lpVtbl->get_disallowedSubstitutions(This,disallowed)
#define ISchemaElement_get_isAbstract(This,abstract) (This)->lpVtbl->get_isAbstract(This,abstract)
#define ISchemaElement_get_isReference(This,reference) (This)->lpVtbl->get_isReference(This,reference)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISchemaElement_QueryInterface(ISchemaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISchemaElement_AddRef(ISchemaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISchemaElement_Release(ISchemaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISchemaElement_GetTypeInfoCount(ISchemaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISchemaElement_GetTypeInfo(ISchemaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT ISchemaElement_GetIDsOfNames(ISchemaElement* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT ISchemaElement_Invoke(ISchemaElement* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISchemaItem methods ***/
static __WIDL_INLINE HRESULT ISchemaElement_get_name(ISchemaElement* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_namespaceURI(ISchemaElement* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_schema(ISchemaElement* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_id(ISchemaElement* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_itemType(ISchemaElement* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_unhandledAttributes(ISchemaElement* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static __WIDL_INLINE HRESULT ISchemaElement_writeAnnotation(ISchemaElement* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaParticle methods ***/
static __WIDL_INLINE HRESULT ISchemaElement_get_minOccurs(ISchemaElement* This,VARIANT *minOccurs) {
    return This->lpVtbl->get_minOccurs(This,minOccurs);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_maxOccurs(ISchemaElement* This,VARIANT *maxOccurs) {
    return This->lpVtbl->get_maxOccurs(This,maxOccurs);
}
/*** ISchemaElement methods ***/
static __WIDL_INLINE HRESULT ISchemaElement_get_type(ISchemaElement* This,ISchemaType **type) {
    return This->lpVtbl->get_type(This,type);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_scope(ISchemaElement* This,ISchemaComplexType **scope) {
    return This->lpVtbl->get_scope(This,scope);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_defaultValue(ISchemaElement* This,BSTR *defaultValue) {
    return This->lpVtbl->get_defaultValue(This,defaultValue);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_fixedValue(ISchemaElement* This,BSTR *fixedValue) {
    return This->lpVtbl->get_fixedValue(This,fixedValue);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_isNillable(ISchemaElement* This,VARIANT_BOOL *nillable) {
    return This->lpVtbl->get_isNillable(This,nillable);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_identityConstraints(ISchemaElement* This,ISchemaItemCollection **constraints) {
    return This->lpVtbl->get_identityConstraints(This,constraints);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_substitutionGroup(ISchemaElement* This,ISchemaElement **element) {
    return This->lpVtbl->get_substitutionGroup(This,element);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_substitutionGroupExclusions(ISchemaElement* This,SCHEMADERIVATIONMETHOD *exclusions) {
    return This->lpVtbl->get_substitutionGroupExclusions(This,exclusions);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_disallowedSubstitutions(ISchemaElement* This,SCHEMADERIVATIONMETHOD *disallowed) {
    return This->lpVtbl->get_disallowedSubstitutions(This,disallowed);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_isAbstract(ISchemaElement* This,VARIANT_BOOL *abstract) {
    return This->lpVtbl->get_isAbstract(This,abstract);
}
static __WIDL_INLINE HRESULT ISchemaElement_get_isReference(ISchemaElement* This,VARIANT_BOOL *reference) {
    return This->lpVtbl->get_isReference(This,reference);
}
#endif
#endif

#endif


#endif  /* __ISchemaElement_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISchemaType interface
 */
#ifndef __ISchemaType_INTERFACE_DEFINED__
#define __ISchemaType_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISchemaType, 0x50ea08b8, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08b8-dd1b-4664-9a50-c2f40f4bd79a")
ISchemaType : public ISchemaItem
{
    virtual HRESULT STDMETHODCALLTYPE get_baseTypes(
        ISchemaItemCollection **baseTypes) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_final(
        SCHEMADERIVATIONMETHOD *final) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_variety(
        SCHEMATYPEVARIETY *variety) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_derivedBy(
        SCHEMADERIVATIONMETHOD *derivedBy) = 0;

    virtual HRESULT STDMETHODCALLTYPE isValid(
        BSTR data,
        VARIANT_BOOL *valid) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_minExclusive(
        BSTR *minExclusive) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_minInclusive(
        BSTR *minInclusive) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxExclusive(
        BSTR *maxExclusive) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxInclusive(
        BSTR *maxInclusive) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_totalDigits(
        VARIANT *totalDigits) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fractionDigits(
        VARIANT *fractionDigits) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_length(
        VARIANT *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_minLength(
        VARIANT *minLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_maxLength(
        VARIANT *maxLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_enumeration(
        ISchemaStringCollection **enumeration) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_whitespace(
        SCHEMAWHITESPACE *whitespace) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_patterns(
        ISchemaStringCollection **patterns) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISchemaType, 0x50ea08b8, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct ISchemaTypeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISchemaType *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISchemaType *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISchemaType *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISchemaType *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISchemaType *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISchemaType *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISchemaType *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISchemaItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        ISchemaType *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        ISchemaType *This,
        BSTR *namespaceURI);

    HRESULT (STDMETHODCALLTYPE *get_schema)(
        ISchemaType *This,
        ISchema **schema);

    HRESULT (STDMETHODCALLTYPE *get_id)(
        ISchemaType *This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *get_itemType)(
        ISchemaType *This,
        SOMITEMTYPE *itemType);

    HRESULT (STDMETHODCALLTYPE *get_unhandledAttributes)(
        ISchemaType *This,
        IVBSAXAttributes **attributes);

    HRESULT (STDMETHODCALLTYPE *writeAnnotation)(
        ISchemaType *This,
        IUnknown *annotationSink,
        VARIANT_BOOL *isWritten);

    /*** ISchemaType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_baseTypes)(
        ISchemaType *This,
        ISchemaItemCollection **baseTypes);

    HRESULT (STDMETHODCALLTYPE *get_final)(
        ISchemaType *This,
        SCHEMADERIVATIONMETHOD *final);

    HRESULT (STDMETHODCALLTYPE *get_variety)(
        ISchemaType *This,
        SCHEMATYPEVARIETY *variety);

    HRESULT (STDMETHODCALLTYPE *get_derivedBy)(
        ISchemaType *This,
        SCHEMADERIVATIONMETHOD *derivedBy);

    HRESULT (STDMETHODCALLTYPE *isValid)(
        ISchemaType *This,
        BSTR data,
        VARIANT_BOOL *valid);

    HRESULT (STDMETHODCALLTYPE *get_minExclusive)(
        ISchemaType *This,
        BSTR *minExclusive);

    HRESULT (STDMETHODCALLTYPE *get_minInclusive)(
        ISchemaType *This,
        BSTR *minInclusive);

    HRESULT (STDMETHODCALLTYPE *get_maxExclusive)(
        ISchemaType *This,
        BSTR *maxExclusive);

    HRESULT (STDMETHODCALLTYPE *get_maxInclusive)(
        ISchemaType *This,
        BSTR *maxInclusive);

    HRESULT (STDMETHODCALLTYPE *get_totalDigits)(
        ISchemaType *This,
        VARIANT *totalDigits);

    HRESULT (STDMETHODCALLTYPE *get_fractionDigits)(
        ISchemaType *This,
        VARIANT *fractionDigits);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        ISchemaType *This,
        VARIANT *length);

    HRESULT (STDMETHODCALLTYPE *get_minLength)(
        ISchemaType *This,
        VARIANT *minLength);

    HRESULT (STDMETHODCALLTYPE *get_maxLength)(
        ISchemaType *This,
        VARIANT *maxLength);

    HRESULT (STDMETHODCALLTYPE *get_enumeration)(
        ISchemaType *This,
        ISchemaStringCollection **enumeration);

    HRESULT (STDMETHODCALLTYPE *get_whitespace)(
        ISchemaType *This,
        SCHEMAWHITESPACE *whitespace);

    HRESULT (STDMETHODCALLTYPE *get_patterns)(
        ISchemaType *This,
        ISchemaStringCollection **patterns);

    END_INTERFACE
} ISchemaTypeVtbl;

interface ISchemaType {
    CONST_VTBL ISchemaTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISchemaType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchemaType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchemaType_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISchemaType_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISchemaType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISchemaType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISchemaType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISchemaItem methods ***/
#define ISchemaType_get_name(This,name) (This)->lpVtbl->get_name(This,name)
#define ISchemaType_get_namespaceURI(This,namespaceURI) (This)->lpVtbl->get_namespaceURI(This,namespaceURI)
#define ISchemaType_get_schema(This,schema) (This)->lpVtbl->get_schema(This,schema)
#define ISchemaType_get_id(This,id) (This)->lpVtbl->get_id(This,id)
#define ISchemaType_get_itemType(This,itemType) (This)->lpVtbl->get_itemType(This,itemType)
#define ISchemaType_get_unhandledAttributes(This,attributes) (This)->lpVtbl->get_unhandledAttributes(This,attributes)
#define ISchemaType_writeAnnotation(This,annotationSink,isWritten) (This)->lpVtbl->writeAnnotation(This,annotationSink,isWritten)
/*** ISchemaType methods ***/
#define ISchemaType_get_baseTypes(This,baseTypes) (This)->lpVtbl->get_baseTypes(This,baseTypes)
#define ISchemaType_get_final(This,final) (This)->lpVtbl->get_final(This,final)
#define ISchemaType_get_variety(This,variety) (This)->lpVtbl->get_variety(This,variety)
#define ISchemaType_get_derivedBy(This,derivedBy) (This)->lpVtbl->get_derivedBy(This,derivedBy)
#define ISchemaType_isValid(This,data,valid) (This)->lpVtbl->isValid(This,data,valid)
#define ISchemaType_get_minExclusive(This,minExclusive) (This)->lpVtbl->get_minExclusive(This,minExclusive)
#define ISchemaType_get_minInclusive(This,minInclusive) (This)->lpVtbl->get_minInclusive(This,minInclusive)
#define ISchemaType_get_maxExclusive(This,maxExclusive) (This)->lpVtbl->get_maxExclusive(This,maxExclusive)
#define ISchemaType_get_maxInclusive(This,maxInclusive) (This)->lpVtbl->get_maxInclusive(This,maxInclusive)
#define ISchemaType_get_totalDigits(This,totalDigits) (This)->lpVtbl->get_totalDigits(This,totalDigits)
#define ISchemaType_get_fractionDigits(This,fractionDigits) (This)->lpVtbl->get_fractionDigits(This,fractionDigits)
#define ISchemaType_get_length(This,length) (This)->lpVtbl->get_length(This,length)
#define ISchemaType_get_minLength(This,minLength) (This)->lpVtbl->get_minLength(This,minLength)
#define ISchemaType_get_maxLength(This,maxLength) (This)->lpVtbl->get_maxLength(This,maxLength)
#define ISchemaType_get_enumeration(This,enumeration) (This)->lpVtbl->get_enumeration(This,enumeration)
#define ISchemaType_get_whitespace(This,whitespace) (This)->lpVtbl->get_whitespace(This,whitespace)
#define ISchemaType_get_patterns(This,patterns) (This)->lpVtbl->get_patterns(This,patterns)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISchemaType_QueryInterface(ISchemaType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISchemaType_AddRef(ISchemaType* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISchemaType_Release(ISchemaType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISchemaType_GetTypeInfoCount(ISchemaType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISchemaType_GetTypeInfo(ISchemaType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT ISchemaType_GetIDsOfNames(ISchemaType* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT ISchemaType_Invoke(ISchemaType* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISchemaItem methods ***/
static __WIDL_INLINE HRESULT ISchemaType_get_name(ISchemaType* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static __WIDL_INLINE HRESULT ISchemaType_get_namespaceURI(ISchemaType* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static __WIDL_INLINE HRESULT ISchemaType_get_schema(ISchemaType* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static __WIDL_INLINE HRESULT ISchemaType_get_id(ISchemaType* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static __WIDL_INLINE HRESULT ISchemaType_get_itemType(ISchemaType* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static __WIDL_INLINE HRESULT ISchemaType_get_unhandledAttributes(ISchemaType* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static __WIDL_INLINE HRESULT ISchemaType_writeAnnotation(ISchemaType* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaType methods ***/
static __WIDL_INLINE HRESULT ISchemaType_get_baseTypes(ISchemaType* This,ISchemaItemCollection **baseTypes) {
    return This->lpVtbl->get_baseTypes(This,baseTypes);
}
static __WIDL_INLINE HRESULT ISchemaType_get_final(ISchemaType* This,SCHEMADERIVATIONMETHOD *final) {
    return This->lpVtbl->get_final(This,final);
}
static __WIDL_INLINE HRESULT ISchemaType_get_variety(ISchemaType* This,SCHEMATYPEVARIETY *variety) {
    return This->lpVtbl->get_variety(This,variety);
}
static __WIDL_INLINE HRESULT ISchemaType_get_derivedBy(ISchemaType* This,SCHEMADERIVATIONMETHOD *derivedBy) {
    return This->lpVtbl->get_derivedBy(This,derivedBy);
}
static __WIDL_INLINE HRESULT ISchemaType_isValid(ISchemaType* This,BSTR data,VARIANT_BOOL *valid) {
    return This->lpVtbl->isValid(This,data,valid);
}
static __WIDL_INLINE HRESULT ISchemaType_get_minExclusive(ISchemaType* This,BSTR *minExclusive) {
    return This->lpVtbl->get_minExclusive(This,minExclusive);
}
static __WIDL_INLINE HRESULT ISchemaType_get_minInclusive(ISchemaType* This,BSTR *minInclusive) {
    return This->lpVtbl->get_minInclusive(This,minInclusive);
}
static __WIDL_INLINE HRESULT ISchemaType_get_maxExclusive(ISchemaType* This,BSTR *maxExclusive) {
    return This->lpVtbl->get_maxExclusive(This,maxExclusive);
}
static __WIDL_INLINE HRESULT ISchemaType_get_maxInclusive(ISchemaType* This,BSTR *maxInclusive) {
    return This->lpVtbl->get_maxInclusive(This,maxInclusive);
}
static __WIDL_INLINE HRESULT ISchemaType_get_totalDigits(ISchemaType* This,VARIANT *totalDigits) {
    return This->lpVtbl->get_totalDigits(This,totalDigits);
}
static __WIDL_INLINE HRESULT ISchemaType_get_fractionDigits(ISchemaType* This,VARIANT *fractionDigits) {
    return This->lpVtbl->get_fractionDigits(This,fractionDigits);
}
static __WIDL_INLINE HRESULT ISchemaType_get_length(ISchemaType* This,VARIANT *length) {
    return This->lpVtbl->get_length(This,length);
}
static __WIDL_INLINE HRESULT ISchemaType_get_minLength(ISchemaType* This,VARIANT *minLength) {
    return This->lpVtbl->get_minLength(This,minLength);
}
static __WIDL_INLINE HRESULT ISchemaType_get_maxLength(ISchemaType* This,VARIANT *maxLength) {
    return This->lpVtbl->get_maxLength(This,maxLength);
}
static __WIDL_INLINE HRESULT ISchemaType_get_enumeration(ISchemaType* This,ISchemaStringCollection **enumeration) {
    return This->lpVtbl->get_enumeration(This,enumeration);
}
static __WIDL_INLINE HRESULT ISchemaType_get_whitespace(ISchemaType* This,SCHEMAWHITESPACE *whitespace) {
    return This->lpVtbl->get_whitespace(This,whitespace);
}
static __WIDL_INLINE HRESULT ISchemaType_get_patterns(ISchemaType* This,ISchemaStringCollection **patterns) {
    return This->lpVtbl->get_patterns(This,patterns);
}
#endif
#endif

#endif


#endif  /* __ISchemaType_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISchemaComplexType interface
 */
#ifndef __ISchemaComplexType_INTERFACE_DEFINED__
#define __ISchemaComplexType_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISchemaComplexType, 0x50ea08b9, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08b9-dd1b-4664-9a50-c2f40f4bd79a")
ISchemaComplexType : public ISchemaType
{
    virtual HRESULT STDMETHODCALLTYPE get_isAbstract(
        VARIANT_BOOL *abstract) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_anyAttribute(
        ISchemaAny **anyAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_attributes(
        ISchemaItemCollection **attributes) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_contentType(
        SCHEMACONTENTTYPE *contentType) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_contentModel(
        ISchemaModelGroup **contentModel) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_prohibitedSubstitutions(
        SCHEMADERIVATIONMETHOD *prohibited) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISchemaComplexType, 0x50ea08b9, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct ISchemaComplexTypeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISchemaComplexType *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISchemaComplexType *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISchemaComplexType *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISchemaComplexType *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISchemaComplexType *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISchemaComplexType *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISchemaComplexType *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISchemaItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        ISchemaComplexType *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        ISchemaComplexType *This,
        BSTR *namespaceURI);

    HRESULT (STDMETHODCALLTYPE *get_schema)(
        ISchemaComplexType *This,
        ISchema **schema);

    HRESULT (STDMETHODCALLTYPE *get_id)(
        ISchemaComplexType *This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *get_itemType)(
        ISchemaComplexType *This,
        SOMITEMTYPE *itemType);

    HRESULT (STDMETHODCALLTYPE *get_unhandledAttributes)(
        ISchemaComplexType *This,
        IVBSAXAttributes **attributes);

    HRESULT (STDMETHODCALLTYPE *writeAnnotation)(
        ISchemaComplexType *This,
        IUnknown *annotationSink,
        VARIANT_BOOL *isWritten);

    /*** ISchemaType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_baseTypes)(
        ISchemaComplexType *This,
        ISchemaItemCollection **baseTypes);

    HRESULT (STDMETHODCALLTYPE *get_final)(
        ISchemaComplexType *This,
        SCHEMADERIVATIONMETHOD *final);

    HRESULT (STDMETHODCALLTYPE *get_variety)(
        ISchemaComplexType *This,
        SCHEMATYPEVARIETY *variety);

    HRESULT (STDMETHODCALLTYPE *get_derivedBy)(
        ISchemaComplexType *This,
        SCHEMADERIVATIONMETHOD *derivedBy);

    HRESULT (STDMETHODCALLTYPE *isValid)(
        ISchemaComplexType *This,
        BSTR data,
        VARIANT_BOOL *valid);

    HRESULT (STDMETHODCALLTYPE *get_minExclusive)(
        ISchemaComplexType *This,
        BSTR *minExclusive);

    HRESULT (STDMETHODCALLTYPE *get_minInclusive)(
        ISchemaComplexType *This,
        BSTR *minInclusive);

    HRESULT (STDMETHODCALLTYPE *get_maxExclusive)(
        ISchemaComplexType *This,
        BSTR *maxExclusive);

    HRESULT (STDMETHODCALLTYPE *get_maxInclusive)(
        ISchemaComplexType *This,
        BSTR *maxInclusive);

    HRESULT (STDMETHODCALLTYPE *get_totalDigits)(
        ISchemaComplexType *This,
        VARIANT *totalDigits);

    HRESULT (STDMETHODCALLTYPE *get_fractionDigits)(
        ISchemaComplexType *This,
        VARIANT *fractionDigits);

    HRESULT (STDMETHODCALLTYPE *get_length)(
        ISchemaComplexType *This,
        VARIANT *length);

    HRESULT (STDMETHODCALLTYPE *get_minLength)(
        ISchemaComplexType *This,
        VARIANT *minLength);

    HRESULT (STDMETHODCALLTYPE *get_maxLength)(
        ISchemaComplexType *This,
        VARIANT *maxLength);

    HRESULT (STDMETHODCALLTYPE *get_enumeration)(
        ISchemaComplexType *This,
        ISchemaStringCollection **enumeration);

    HRESULT (STDMETHODCALLTYPE *get_whitespace)(
        ISchemaComplexType *This,
        SCHEMAWHITESPACE *whitespace);

    HRESULT (STDMETHODCALLTYPE *get_patterns)(
        ISchemaComplexType *This,
        ISchemaStringCollection **patterns);

    /*** ISchemaComplexType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_isAbstract)(
        ISchemaComplexType *This,
        VARIANT_BOOL *abstract);

    HRESULT (STDMETHODCALLTYPE *get_anyAttribute)(
        ISchemaComplexType *This,
        ISchemaAny **anyAttribute);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        ISchemaComplexType *This,
        ISchemaItemCollection **attributes);

    HRESULT (STDMETHODCALLTYPE *get_contentType)(
        ISchemaComplexType *This,
        SCHEMACONTENTTYPE *contentType);

    HRESULT (STDMETHODCALLTYPE *get_contentModel)(
        ISchemaComplexType *This,
        ISchemaModelGroup **contentModel);

    HRESULT (STDMETHODCALLTYPE *get_prohibitedSubstitutions)(
        ISchemaComplexType *This,
        SCHEMADERIVATIONMETHOD *prohibited);

    END_INTERFACE
} ISchemaComplexTypeVtbl;

interface ISchemaComplexType {
    CONST_VTBL ISchemaComplexTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISchemaComplexType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchemaComplexType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchemaComplexType_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISchemaComplexType_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISchemaComplexType_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISchemaComplexType_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISchemaComplexType_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISchemaItem methods ***/
#define ISchemaComplexType_get_name(This,name) (This)->lpVtbl->get_name(This,name)
#define ISchemaComplexType_get_namespaceURI(This,namespaceURI) (This)->lpVtbl->get_namespaceURI(This,namespaceURI)
#define ISchemaComplexType_get_schema(This,schema) (This)->lpVtbl->get_schema(This,schema)
#define ISchemaComplexType_get_id(This,id) (This)->lpVtbl->get_id(This,id)
#define ISchemaComplexType_get_itemType(This,itemType) (This)->lpVtbl->get_itemType(This,itemType)
#define ISchemaComplexType_get_unhandledAttributes(This,attributes) (This)->lpVtbl->get_unhandledAttributes(This,attributes)
#define ISchemaComplexType_writeAnnotation(This,annotationSink,isWritten) (This)->lpVtbl->writeAnnotation(This,annotationSink,isWritten)
/*** ISchemaType methods ***/
#define ISchemaComplexType_get_baseTypes(This,baseTypes) (This)->lpVtbl->get_baseTypes(This,baseTypes)
#define ISchemaComplexType_get_final(This,final) (This)->lpVtbl->get_final(This,final)
#define ISchemaComplexType_get_variety(This,variety) (This)->lpVtbl->get_variety(This,variety)
#define ISchemaComplexType_get_derivedBy(This,derivedBy) (This)->lpVtbl->get_derivedBy(This,derivedBy)
#define ISchemaComplexType_isValid(This,data,valid) (This)->lpVtbl->isValid(This,data,valid)
#define ISchemaComplexType_get_minExclusive(This,minExclusive) (This)->lpVtbl->get_minExclusive(This,minExclusive)
#define ISchemaComplexType_get_minInclusive(This,minInclusive) (This)->lpVtbl->get_minInclusive(This,minInclusive)
#define ISchemaComplexType_get_maxExclusive(This,maxExclusive) (This)->lpVtbl->get_maxExclusive(This,maxExclusive)
#define ISchemaComplexType_get_maxInclusive(This,maxInclusive) (This)->lpVtbl->get_maxInclusive(This,maxInclusive)
#define ISchemaComplexType_get_totalDigits(This,totalDigits) (This)->lpVtbl->get_totalDigits(This,totalDigits)
#define ISchemaComplexType_get_fractionDigits(This,fractionDigits) (This)->lpVtbl->get_fractionDigits(This,fractionDigits)
#define ISchemaComplexType_get_length(This,length) (This)->lpVtbl->get_length(This,length)
#define ISchemaComplexType_get_minLength(This,minLength) (This)->lpVtbl->get_minLength(This,minLength)
#define ISchemaComplexType_get_maxLength(This,maxLength) (This)->lpVtbl->get_maxLength(This,maxLength)
#define ISchemaComplexType_get_enumeration(This,enumeration) (This)->lpVtbl->get_enumeration(This,enumeration)
#define ISchemaComplexType_get_whitespace(This,whitespace) (This)->lpVtbl->get_whitespace(This,whitespace)
#define ISchemaComplexType_get_patterns(This,patterns) (This)->lpVtbl->get_patterns(This,patterns)
/*** ISchemaComplexType methods ***/
#define ISchemaComplexType_get_isAbstract(This,abstract) (This)->lpVtbl->get_isAbstract(This,abstract)
#define ISchemaComplexType_get_anyAttribute(This,anyAttribute) (This)->lpVtbl->get_anyAttribute(This,anyAttribute)
#define ISchemaComplexType_get_attributes(This,attributes) (This)->lpVtbl->get_attributes(This,attributes)
#define ISchemaComplexType_get_contentType(This,contentType) (This)->lpVtbl->get_contentType(This,contentType)
#define ISchemaComplexType_get_contentModel(This,contentModel) (This)->lpVtbl->get_contentModel(This,contentModel)
#define ISchemaComplexType_get_prohibitedSubstitutions(This,prohibited) (This)->lpVtbl->get_prohibitedSubstitutions(This,prohibited)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISchemaComplexType_QueryInterface(ISchemaComplexType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISchemaComplexType_AddRef(ISchemaComplexType* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISchemaComplexType_Release(ISchemaComplexType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISchemaComplexType_GetTypeInfoCount(ISchemaComplexType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_GetTypeInfo(ISchemaComplexType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_GetIDsOfNames(ISchemaComplexType* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_Invoke(ISchemaComplexType* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISchemaItem methods ***/
static __WIDL_INLINE HRESULT ISchemaComplexType_get_name(ISchemaComplexType* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_namespaceURI(ISchemaComplexType* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_schema(ISchemaComplexType* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_id(ISchemaComplexType* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_itemType(ISchemaComplexType* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_unhandledAttributes(ISchemaComplexType* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_writeAnnotation(ISchemaComplexType* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaType methods ***/
static __WIDL_INLINE HRESULT ISchemaComplexType_get_baseTypes(ISchemaComplexType* This,ISchemaItemCollection **baseTypes) {
    return This->lpVtbl->get_baseTypes(This,baseTypes);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_final(ISchemaComplexType* This,SCHEMADERIVATIONMETHOD *final) {
    return This->lpVtbl->get_final(This,final);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_variety(ISchemaComplexType* This,SCHEMATYPEVARIETY *variety) {
    return This->lpVtbl->get_variety(This,variety);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_derivedBy(ISchemaComplexType* This,SCHEMADERIVATIONMETHOD *derivedBy) {
    return This->lpVtbl->get_derivedBy(This,derivedBy);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_isValid(ISchemaComplexType* This,BSTR data,VARIANT_BOOL *valid) {
    return This->lpVtbl->isValid(This,data,valid);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_minExclusive(ISchemaComplexType* This,BSTR *minExclusive) {
    return This->lpVtbl->get_minExclusive(This,minExclusive);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_minInclusive(ISchemaComplexType* This,BSTR *minInclusive) {
    return This->lpVtbl->get_minInclusive(This,minInclusive);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_maxExclusive(ISchemaComplexType* This,BSTR *maxExclusive) {
    return This->lpVtbl->get_maxExclusive(This,maxExclusive);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_maxInclusive(ISchemaComplexType* This,BSTR *maxInclusive) {
    return This->lpVtbl->get_maxInclusive(This,maxInclusive);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_totalDigits(ISchemaComplexType* This,VARIANT *totalDigits) {
    return This->lpVtbl->get_totalDigits(This,totalDigits);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_fractionDigits(ISchemaComplexType* This,VARIANT *fractionDigits) {
    return This->lpVtbl->get_fractionDigits(This,fractionDigits);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_length(ISchemaComplexType* This,VARIANT *length) {
    return This->lpVtbl->get_length(This,length);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_minLength(ISchemaComplexType* This,VARIANT *minLength) {
    return This->lpVtbl->get_minLength(This,minLength);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_maxLength(ISchemaComplexType* This,VARIANT *maxLength) {
    return This->lpVtbl->get_maxLength(This,maxLength);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_enumeration(ISchemaComplexType* This,ISchemaStringCollection **enumeration) {
    return This->lpVtbl->get_enumeration(This,enumeration);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_whitespace(ISchemaComplexType* This,SCHEMAWHITESPACE *whitespace) {
    return This->lpVtbl->get_whitespace(This,whitespace);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_patterns(ISchemaComplexType* This,ISchemaStringCollection **patterns) {
    return This->lpVtbl->get_patterns(This,patterns);
}
/*** ISchemaComplexType methods ***/
static __WIDL_INLINE HRESULT ISchemaComplexType_get_isAbstract(ISchemaComplexType* This,VARIANT_BOOL *abstract) {
    return This->lpVtbl->get_isAbstract(This,abstract);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_anyAttribute(ISchemaComplexType* This,ISchemaAny **anyAttribute) {
    return This->lpVtbl->get_anyAttribute(This,anyAttribute);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_attributes(ISchemaComplexType* This,ISchemaItemCollection **attributes) {
    return This->lpVtbl->get_attributes(This,attributes);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_contentType(ISchemaComplexType* This,SCHEMACONTENTTYPE *contentType) {
    return This->lpVtbl->get_contentType(This,contentType);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_contentModel(ISchemaComplexType* This,ISchemaModelGroup **contentModel) {
    return This->lpVtbl->get_contentModel(This,contentModel);
}
static __WIDL_INLINE HRESULT ISchemaComplexType_get_prohibitedSubstitutions(ISchemaComplexType* This,SCHEMADERIVATIONMETHOD *prohibited) {
    return This->lpVtbl->get_prohibitedSubstitutions(This,prohibited);
}
#endif
#endif

#endif


#endif  /* __ISchemaComplexType_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISchemaAttributeGroup interface
 */
#ifndef __ISchemaAttributeGroup_INTERFACE_DEFINED__
#define __ISchemaAttributeGroup_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISchemaAttributeGroup, 0x50ea08ba, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08ba-dd1b-4664-9a50-c2f40f4bd79a")
ISchemaAttributeGroup : public ISchemaItem
{
    virtual HRESULT STDMETHODCALLTYPE get_anyAttribute(
        ISchemaAny **anyAttribute) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_attributes(
        ISchemaItemCollection **attributes) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISchemaAttributeGroup, 0x50ea08ba, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct ISchemaAttributeGroupVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISchemaAttributeGroup *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISchemaAttributeGroup *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISchemaAttributeGroup *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISchemaAttributeGroup *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISchemaAttributeGroup *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISchemaAttributeGroup *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISchemaAttributeGroup *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISchemaItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        ISchemaAttributeGroup *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        ISchemaAttributeGroup *This,
        BSTR *namespaceURI);

    HRESULT (STDMETHODCALLTYPE *get_schema)(
        ISchemaAttributeGroup *This,
        ISchema **schema);

    HRESULT (STDMETHODCALLTYPE *get_id)(
        ISchemaAttributeGroup *This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *get_itemType)(
        ISchemaAttributeGroup *This,
        SOMITEMTYPE *itemType);

    HRESULT (STDMETHODCALLTYPE *get_unhandledAttributes)(
        ISchemaAttributeGroup *This,
        IVBSAXAttributes **attributes);

    HRESULT (STDMETHODCALLTYPE *writeAnnotation)(
        ISchemaAttributeGroup *This,
        IUnknown *annotationSink,
        VARIANT_BOOL *isWritten);

    /*** ISchemaAttributeGroup methods ***/
    HRESULT (STDMETHODCALLTYPE *get_anyAttribute)(
        ISchemaAttributeGroup *This,
        ISchemaAny **anyAttribute);

    HRESULT (STDMETHODCALLTYPE *get_attributes)(
        ISchemaAttributeGroup *This,
        ISchemaItemCollection **attributes);

    END_INTERFACE
} ISchemaAttributeGroupVtbl;

interface ISchemaAttributeGroup {
    CONST_VTBL ISchemaAttributeGroupVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISchemaAttributeGroup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchemaAttributeGroup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchemaAttributeGroup_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISchemaAttributeGroup_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISchemaAttributeGroup_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISchemaAttributeGroup_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISchemaAttributeGroup_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISchemaItem methods ***/
#define ISchemaAttributeGroup_get_name(This,name) (This)->lpVtbl->get_name(This,name)
#define ISchemaAttributeGroup_get_namespaceURI(This,namespaceURI) (This)->lpVtbl->get_namespaceURI(This,namespaceURI)
#define ISchemaAttributeGroup_get_schema(This,schema) (This)->lpVtbl->get_schema(This,schema)
#define ISchemaAttributeGroup_get_id(This,id) (This)->lpVtbl->get_id(This,id)
#define ISchemaAttributeGroup_get_itemType(This,itemType) (This)->lpVtbl->get_itemType(This,itemType)
#define ISchemaAttributeGroup_get_unhandledAttributes(This,attributes) (This)->lpVtbl->get_unhandledAttributes(This,attributes)
#define ISchemaAttributeGroup_writeAnnotation(This,annotationSink,isWritten) (This)->lpVtbl->writeAnnotation(This,annotationSink,isWritten)
/*** ISchemaAttributeGroup methods ***/
#define ISchemaAttributeGroup_get_anyAttribute(This,anyAttribute) (This)->lpVtbl->get_anyAttribute(This,anyAttribute)
#define ISchemaAttributeGroup_get_attributes(This,attributes) (This)->lpVtbl->get_attributes(This,attributes)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISchemaAttributeGroup_QueryInterface(ISchemaAttributeGroup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISchemaAttributeGroup_AddRef(ISchemaAttributeGroup* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISchemaAttributeGroup_Release(ISchemaAttributeGroup* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISchemaAttributeGroup_GetTypeInfoCount(ISchemaAttributeGroup* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISchemaAttributeGroup_GetTypeInfo(ISchemaAttributeGroup* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT ISchemaAttributeGroup_GetIDsOfNames(ISchemaAttributeGroup* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT ISchemaAttributeGroup_Invoke(ISchemaAttributeGroup* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISchemaItem methods ***/
static __WIDL_INLINE HRESULT ISchemaAttributeGroup_get_name(ISchemaAttributeGroup* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static __WIDL_INLINE HRESULT ISchemaAttributeGroup_get_namespaceURI(ISchemaAttributeGroup* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static __WIDL_INLINE HRESULT ISchemaAttributeGroup_get_schema(ISchemaAttributeGroup* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static __WIDL_INLINE HRESULT ISchemaAttributeGroup_get_id(ISchemaAttributeGroup* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static __WIDL_INLINE HRESULT ISchemaAttributeGroup_get_itemType(ISchemaAttributeGroup* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static __WIDL_INLINE HRESULT ISchemaAttributeGroup_get_unhandledAttributes(ISchemaAttributeGroup* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static __WIDL_INLINE HRESULT ISchemaAttributeGroup_writeAnnotation(ISchemaAttributeGroup* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaAttributeGroup methods ***/
static __WIDL_INLINE HRESULT ISchemaAttributeGroup_get_anyAttribute(ISchemaAttributeGroup* This,ISchemaAny **anyAttribute) {
    return This->lpVtbl->get_anyAttribute(This,anyAttribute);
}
static __WIDL_INLINE HRESULT ISchemaAttributeGroup_get_attributes(ISchemaAttributeGroup* This,ISchemaItemCollection **attributes) {
    return This->lpVtbl->get_attributes(This,attributes);
}
#endif
#endif

#endif


#endif  /* __ISchemaAttributeGroup_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISchemaModelGroup interface
 */
#ifndef __ISchemaModelGroup_INTERFACE_DEFINED__
#define __ISchemaModelGroup_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISchemaModelGroup, 0x50ea08bb, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08bb-dd1b-4664-9a50-c2f40f4bd79a")
ISchemaModelGroup : public ISchemaParticle
{
    virtual HRESULT STDMETHODCALLTYPE get_particles(
        ISchemaItemCollection **particles) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISchemaModelGroup, 0x50ea08bb, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct ISchemaModelGroupVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISchemaModelGroup *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISchemaModelGroup *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISchemaModelGroup *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISchemaModelGroup *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISchemaModelGroup *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISchemaModelGroup *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISchemaModelGroup *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISchemaItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        ISchemaModelGroup *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        ISchemaModelGroup *This,
        BSTR *namespaceURI);

    HRESULT (STDMETHODCALLTYPE *get_schema)(
        ISchemaModelGroup *This,
        ISchema **schema);

    HRESULT (STDMETHODCALLTYPE *get_id)(
        ISchemaModelGroup *This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *get_itemType)(
        ISchemaModelGroup *This,
        SOMITEMTYPE *itemType);

    HRESULT (STDMETHODCALLTYPE *get_unhandledAttributes)(
        ISchemaModelGroup *This,
        IVBSAXAttributes **attributes);

    HRESULT (STDMETHODCALLTYPE *writeAnnotation)(
        ISchemaModelGroup *This,
        IUnknown *annotationSink,
        VARIANT_BOOL *isWritten);

    /*** ISchemaParticle methods ***/
    HRESULT (STDMETHODCALLTYPE *get_minOccurs)(
        ISchemaModelGroup *This,
        VARIANT *minOccurs);

    HRESULT (STDMETHODCALLTYPE *get_maxOccurs)(
        ISchemaModelGroup *This,
        VARIANT *maxOccurs);

    /*** ISchemaModelGroup methods ***/
    HRESULT (STDMETHODCALLTYPE *get_particles)(
        ISchemaModelGroup *This,
        ISchemaItemCollection **particles);

    END_INTERFACE
} ISchemaModelGroupVtbl;

interface ISchemaModelGroup {
    CONST_VTBL ISchemaModelGroupVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISchemaModelGroup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchemaModelGroup_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchemaModelGroup_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISchemaModelGroup_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISchemaModelGroup_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISchemaModelGroup_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISchemaModelGroup_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISchemaItem methods ***/
#define ISchemaModelGroup_get_name(This,name) (This)->lpVtbl->get_name(This,name)
#define ISchemaModelGroup_get_namespaceURI(This,namespaceURI) (This)->lpVtbl->get_namespaceURI(This,namespaceURI)
#define ISchemaModelGroup_get_schema(This,schema) (This)->lpVtbl->get_schema(This,schema)
#define ISchemaModelGroup_get_id(This,id) (This)->lpVtbl->get_id(This,id)
#define ISchemaModelGroup_get_itemType(This,itemType) (This)->lpVtbl->get_itemType(This,itemType)
#define ISchemaModelGroup_get_unhandledAttributes(This,attributes) (This)->lpVtbl->get_unhandledAttributes(This,attributes)
#define ISchemaModelGroup_writeAnnotation(This,annotationSink,isWritten) (This)->lpVtbl->writeAnnotation(This,annotationSink,isWritten)
/*** ISchemaParticle methods ***/
#define ISchemaModelGroup_get_minOccurs(This,minOccurs) (This)->lpVtbl->get_minOccurs(This,minOccurs)
#define ISchemaModelGroup_get_maxOccurs(This,maxOccurs) (This)->lpVtbl->get_maxOccurs(This,maxOccurs)
/*** ISchemaModelGroup methods ***/
#define ISchemaModelGroup_get_particles(This,particles) (This)->lpVtbl->get_particles(This,particles)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISchemaModelGroup_QueryInterface(ISchemaModelGroup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISchemaModelGroup_AddRef(ISchemaModelGroup* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISchemaModelGroup_Release(ISchemaModelGroup* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISchemaModelGroup_GetTypeInfoCount(ISchemaModelGroup* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISchemaModelGroup_GetTypeInfo(ISchemaModelGroup* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT ISchemaModelGroup_GetIDsOfNames(ISchemaModelGroup* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT ISchemaModelGroup_Invoke(ISchemaModelGroup* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISchemaItem methods ***/
static __WIDL_INLINE HRESULT ISchemaModelGroup_get_name(ISchemaModelGroup* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static __WIDL_INLINE HRESULT ISchemaModelGroup_get_namespaceURI(ISchemaModelGroup* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static __WIDL_INLINE HRESULT ISchemaModelGroup_get_schema(ISchemaModelGroup* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static __WIDL_INLINE HRESULT ISchemaModelGroup_get_id(ISchemaModelGroup* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static __WIDL_INLINE HRESULT ISchemaModelGroup_get_itemType(ISchemaModelGroup* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static __WIDL_INLINE HRESULT ISchemaModelGroup_get_unhandledAttributes(ISchemaModelGroup* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static __WIDL_INLINE HRESULT ISchemaModelGroup_writeAnnotation(ISchemaModelGroup* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaParticle methods ***/
static __WIDL_INLINE HRESULT ISchemaModelGroup_get_minOccurs(ISchemaModelGroup* This,VARIANT *minOccurs) {
    return This->lpVtbl->get_minOccurs(This,minOccurs);
}
static __WIDL_INLINE HRESULT ISchemaModelGroup_get_maxOccurs(ISchemaModelGroup* This,VARIANT *maxOccurs) {
    return This->lpVtbl->get_maxOccurs(This,maxOccurs);
}
/*** ISchemaModelGroup methods ***/
static __WIDL_INLINE HRESULT ISchemaModelGroup_get_particles(ISchemaModelGroup* This,ISchemaItemCollection **particles) {
    return This->lpVtbl->get_particles(This,particles);
}
#endif
#endif

#endif


#endif  /* __ISchemaModelGroup_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISchemaAny interface
 */
#ifndef __ISchemaAny_INTERFACE_DEFINED__
#define __ISchemaAny_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISchemaAny, 0x50ea08bc, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08bc-dd1b-4664-9a50-c2f40f4bd79a")
ISchemaAny : public ISchemaParticle
{
    virtual HRESULT STDMETHODCALLTYPE get_namespaces(
        ISchemaStringCollection **namespaces) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_processContents(
        SCHEMAPROCESSCONTENTS *processContents) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISchemaAny, 0x50ea08bc, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct ISchemaAnyVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISchemaAny *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISchemaAny *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISchemaAny *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISchemaAny *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISchemaAny *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISchemaAny *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISchemaAny *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISchemaItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        ISchemaAny *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        ISchemaAny *This,
        BSTR *namespaceURI);

    HRESULT (STDMETHODCALLTYPE *get_schema)(
        ISchemaAny *This,
        ISchema **schema);

    HRESULT (STDMETHODCALLTYPE *get_id)(
        ISchemaAny *This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *get_itemType)(
        ISchemaAny *This,
        SOMITEMTYPE *itemType);

    HRESULT (STDMETHODCALLTYPE *get_unhandledAttributes)(
        ISchemaAny *This,
        IVBSAXAttributes **attributes);

    HRESULT (STDMETHODCALLTYPE *writeAnnotation)(
        ISchemaAny *This,
        IUnknown *annotationSink,
        VARIANT_BOOL *isWritten);

    /*** ISchemaParticle methods ***/
    HRESULT (STDMETHODCALLTYPE *get_minOccurs)(
        ISchemaAny *This,
        VARIANT *minOccurs);

    HRESULT (STDMETHODCALLTYPE *get_maxOccurs)(
        ISchemaAny *This,
        VARIANT *maxOccurs);

    /*** ISchemaAny methods ***/
    HRESULT (STDMETHODCALLTYPE *get_namespaces)(
        ISchemaAny *This,
        ISchemaStringCollection **namespaces);

    HRESULT (STDMETHODCALLTYPE *get_processContents)(
        ISchemaAny *This,
        SCHEMAPROCESSCONTENTS *processContents);

    END_INTERFACE
} ISchemaAnyVtbl;

interface ISchemaAny {
    CONST_VTBL ISchemaAnyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISchemaAny_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchemaAny_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchemaAny_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISchemaAny_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISchemaAny_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISchemaAny_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISchemaAny_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISchemaItem methods ***/
#define ISchemaAny_get_name(This,name) (This)->lpVtbl->get_name(This,name)
#define ISchemaAny_get_namespaceURI(This,namespaceURI) (This)->lpVtbl->get_namespaceURI(This,namespaceURI)
#define ISchemaAny_get_schema(This,schema) (This)->lpVtbl->get_schema(This,schema)
#define ISchemaAny_get_id(This,id) (This)->lpVtbl->get_id(This,id)
#define ISchemaAny_get_itemType(This,itemType) (This)->lpVtbl->get_itemType(This,itemType)
#define ISchemaAny_get_unhandledAttributes(This,attributes) (This)->lpVtbl->get_unhandledAttributes(This,attributes)
#define ISchemaAny_writeAnnotation(This,annotationSink,isWritten) (This)->lpVtbl->writeAnnotation(This,annotationSink,isWritten)
/*** ISchemaParticle methods ***/
#define ISchemaAny_get_minOccurs(This,minOccurs) (This)->lpVtbl->get_minOccurs(This,minOccurs)
#define ISchemaAny_get_maxOccurs(This,maxOccurs) (This)->lpVtbl->get_maxOccurs(This,maxOccurs)
/*** ISchemaAny methods ***/
#define ISchemaAny_get_namespaces(This,namespaces) (This)->lpVtbl->get_namespaces(This,namespaces)
#define ISchemaAny_get_processContents(This,processContents) (This)->lpVtbl->get_processContents(This,processContents)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISchemaAny_QueryInterface(ISchemaAny* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISchemaAny_AddRef(ISchemaAny* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISchemaAny_Release(ISchemaAny* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISchemaAny_GetTypeInfoCount(ISchemaAny* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISchemaAny_GetTypeInfo(ISchemaAny* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT ISchemaAny_GetIDsOfNames(ISchemaAny* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT ISchemaAny_Invoke(ISchemaAny* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISchemaItem methods ***/
static __WIDL_INLINE HRESULT ISchemaAny_get_name(ISchemaAny* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static __WIDL_INLINE HRESULT ISchemaAny_get_namespaceURI(ISchemaAny* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static __WIDL_INLINE HRESULT ISchemaAny_get_schema(ISchemaAny* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static __WIDL_INLINE HRESULT ISchemaAny_get_id(ISchemaAny* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static __WIDL_INLINE HRESULT ISchemaAny_get_itemType(ISchemaAny* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static __WIDL_INLINE HRESULT ISchemaAny_get_unhandledAttributes(ISchemaAny* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static __WIDL_INLINE HRESULT ISchemaAny_writeAnnotation(ISchemaAny* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaParticle methods ***/
static __WIDL_INLINE HRESULT ISchemaAny_get_minOccurs(ISchemaAny* This,VARIANT *minOccurs) {
    return This->lpVtbl->get_minOccurs(This,minOccurs);
}
static __WIDL_INLINE HRESULT ISchemaAny_get_maxOccurs(ISchemaAny* This,VARIANT *maxOccurs) {
    return This->lpVtbl->get_maxOccurs(This,maxOccurs);
}
/*** ISchemaAny methods ***/
static __WIDL_INLINE HRESULT ISchemaAny_get_namespaces(ISchemaAny* This,ISchemaStringCollection **namespaces) {
    return This->lpVtbl->get_namespaces(This,namespaces);
}
static __WIDL_INLINE HRESULT ISchemaAny_get_processContents(ISchemaAny* This,SCHEMAPROCESSCONTENTS *processContents) {
    return This->lpVtbl->get_processContents(This,processContents);
}
#endif
#endif

#endif


#endif  /* __ISchemaAny_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISchemaIdentityConstraint interface
 */
#ifndef __ISchemaIdentityConstraint_INTERFACE_DEFINED__
#define __ISchemaIdentityConstraint_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISchemaIdentityConstraint, 0x50ea08bd, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08bd-dd1b-4664-9a50-c2f40f4bd79a")
ISchemaIdentityConstraint : public ISchemaItem
{
    virtual HRESULT STDMETHODCALLTYPE get_selector(
        BSTR *selector) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_fields(
        ISchemaStringCollection **fields) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_referencedKey(
        ISchemaIdentityConstraint **key) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISchemaIdentityConstraint, 0x50ea08bd, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct ISchemaIdentityConstraintVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISchemaIdentityConstraint *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISchemaIdentityConstraint *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISchemaIdentityConstraint *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISchemaIdentityConstraint *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISchemaIdentityConstraint *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISchemaIdentityConstraint *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISchemaIdentityConstraint *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISchemaItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        ISchemaIdentityConstraint *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        ISchemaIdentityConstraint *This,
        BSTR *namespaceURI);

    HRESULT (STDMETHODCALLTYPE *get_schema)(
        ISchemaIdentityConstraint *This,
        ISchema **schema);

    HRESULT (STDMETHODCALLTYPE *get_id)(
        ISchemaIdentityConstraint *This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *get_itemType)(
        ISchemaIdentityConstraint *This,
        SOMITEMTYPE *itemType);

    HRESULT (STDMETHODCALLTYPE *get_unhandledAttributes)(
        ISchemaIdentityConstraint *This,
        IVBSAXAttributes **attributes);

    HRESULT (STDMETHODCALLTYPE *writeAnnotation)(
        ISchemaIdentityConstraint *This,
        IUnknown *annotationSink,
        VARIANT_BOOL *isWritten);

    /*** ISchemaIdentityConstraint methods ***/
    HRESULT (STDMETHODCALLTYPE *get_selector)(
        ISchemaIdentityConstraint *This,
        BSTR *selector);

    HRESULT (STDMETHODCALLTYPE *get_fields)(
        ISchemaIdentityConstraint *This,
        ISchemaStringCollection **fields);

    HRESULT (STDMETHODCALLTYPE *get_referencedKey)(
        ISchemaIdentityConstraint *This,
        ISchemaIdentityConstraint **key);

    END_INTERFACE
} ISchemaIdentityConstraintVtbl;

interface ISchemaIdentityConstraint {
    CONST_VTBL ISchemaIdentityConstraintVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISchemaIdentityConstraint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchemaIdentityConstraint_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchemaIdentityConstraint_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISchemaIdentityConstraint_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISchemaIdentityConstraint_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISchemaIdentityConstraint_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISchemaIdentityConstraint_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISchemaItem methods ***/
#define ISchemaIdentityConstraint_get_name(This,name) (This)->lpVtbl->get_name(This,name)
#define ISchemaIdentityConstraint_get_namespaceURI(This,namespaceURI) (This)->lpVtbl->get_namespaceURI(This,namespaceURI)
#define ISchemaIdentityConstraint_get_schema(This,schema) (This)->lpVtbl->get_schema(This,schema)
#define ISchemaIdentityConstraint_get_id(This,id) (This)->lpVtbl->get_id(This,id)
#define ISchemaIdentityConstraint_get_itemType(This,itemType) (This)->lpVtbl->get_itemType(This,itemType)
#define ISchemaIdentityConstraint_get_unhandledAttributes(This,attributes) (This)->lpVtbl->get_unhandledAttributes(This,attributes)
#define ISchemaIdentityConstraint_writeAnnotation(This,annotationSink,isWritten) (This)->lpVtbl->writeAnnotation(This,annotationSink,isWritten)
/*** ISchemaIdentityConstraint methods ***/
#define ISchemaIdentityConstraint_get_selector(This,selector) (This)->lpVtbl->get_selector(This,selector)
#define ISchemaIdentityConstraint_get_fields(This,fields) (This)->lpVtbl->get_fields(This,fields)
#define ISchemaIdentityConstraint_get_referencedKey(This,key) (This)->lpVtbl->get_referencedKey(This,key)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_QueryInterface(ISchemaIdentityConstraint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISchemaIdentityConstraint_AddRef(ISchemaIdentityConstraint* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISchemaIdentityConstraint_Release(ISchemaIdentityConstraint* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_GetTypeInfoCount(ISchemaIdentityConstraint* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_GetTypeInfo(ISchemaIdentityConstraint* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_GetIDsOfNames(ISchemaIdentityConstraint* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_Invoke(ISchemaIdentityConstraint* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISchemaItem methods ***/
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_get_name(ISchemaIdentityConstraint* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_get_namespaceURI(ISchemaIdentityConstraint* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_get_schema(ISchemaIdentityConstraint* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_get_id(ISchemaIdentityConstraint* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_get_itemType(ISchemaIdentityConstraint* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_get_unhandledAttributes(ISchemaIdentityConstraint* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_writeAnnotation(ISchemaIdentityConstraint* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaIdentityConstraint methods ***/
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_get_selector(ISchemaIdentityConstraint* This,BSTR *selector) {
    return This->lpVtbl->get_selector(This,selector);
}
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_get_fields(ISchemaIdentityConstraint* This,ISchemaStringCollection **fields) {
    return This->lpVtbl->get_fields(This,fields);
}
static __WIDL_INLINE HRESULT ISchemaIdentityConstraint_get_referencedKey(ISchemaIdentityConstraint* This,ISchemaIdentityConstraint **key) {
    return This->lpVtbl->get_referencedKey(This,key);
}
#endif
#endif

#endif


#endif  /* __ISchemaIdentityConstraint_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISchemaNotation interface
 */
#ifndef __ISchemaNotation_INTERFACE_DEFINED__
#define __ISchemaNotation_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISchemaNotation, 0x50ea08be, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("50ea08be-dd1b-4664-9a50-c2f40f4bd79a")
ISchemaNotation : public ISchemaItem
{
    virtual HRESULT STDMETHODCALLTYPE get_systemIdentifier(
        BSTR *uri) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_publicIdentifier(
        BSTR *uri) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISchemaNotation, 0x50ea08be, 0xdd1b, 0x4664, 0x9a,0x50, 0xc2,0xf4,0x0f,0x4b,0xd7,0x9a)
#endif
#else
typedef struct ISchemaNotationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        ISchemaNotation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        ISchemaNotation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        ISchemaNotation *This);

    /*** IDispatch methods ***/
    HRESULT (STDMETHODCALLTYPE *GetTypeInfoCount)(
        ISchemaNotation *This,
        UINT *pctinfo);

    HRESULT (STDMETHODCALLTYPE *GetTypeInfo)(
        ISchemaNotation *This,
        UINT iTInfo,
        LCID lcid,
        ITypeInfo **ppTInfo);

    HRESULT (STDMETHODCALLTYPE *GetIDsOfNames)(
        ISchemaNotation *This,
        REFIID riid,
        LPOLESTR *rgszNames,
        UINT cNames,
        LCID lcid,
        DISPID *rgDispId);

    HRESULT (STDMETHODCALLTYPE *Invoke)(
        ISchemaNotation *This,
        DISPID dispIdMember,
        REFIID riid,
        LCID lcid,
        WORD wFlags,
        DISPPARAMS *pDispParams,
        VARIANT *pVarResult,
        EXCEPINFO *pExcepInfo,
        UINT *puArgErr);

    /*** ISchemaItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_name)(
        ISchemaNotation *This,
        BSTR *name);

    HRESULT (STDMETHODCALLTYPE *get_namespaceURI)(
        ISchemaNotation *This,
        BSTR *namespaceURI);

    HRESULT (STDMETHODCALLTYPE *get_schema)(
        ISchemaNotation *This,
        ISchema **schema);

    HRESULT (STDMETHODCALLTYPE *get_id)(
        ISchemaNotation *This,
        BSTR *id);

    HRESULT (STDMETHODCALLTYPE *get_itemType)(
        ISchemaNotation *This,
        SOMITEMTYPE *itemType);

    HRESULT (STDMETHODCALLTYPE *get_unhandledAttributes)(
        ISchemaNotation *This,
        IVBSAXAttributes **attributes);

    HRESULT (STDMETHODCALLTYPE *writeAnnotation)(
        ISchemaNotation *This,
        IUnknown *annotationSink,
        VARIANT_BOOL *isWritten);

    /*** ISchemaNotation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_systemIdentifier)(
        ISchemaNotation *This,
        BSTR *uri);

    HRESULT (STDMETHODCALLTYPE *get_publicIdentifier)(
        ISchemaNotation *This,
        BSTR *uri);

    END_INTERFACE
} ISchemaNotationVtbl;

interface ISchemaNotation {
    CONST_VTBL ISchemaNotationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISchemaNotation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISchemaNotation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISchemaNotation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISchemaNotation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISchemaNotation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISchemaNotation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISchemaNotation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISchemaItem methods ***/
#define ISchemaNotation_get_name(This,name) (This)->lpVtbl->get_name(This,name)
#define ISchemaNotation_get_namespaceURI(This,namespaceURI) (This)->lpVtbl->get_namespaceURI(This,namespaceURI)
#define ISchemaNotation_get_schema(This,schema) (This)->lpVtbl->get_schema(This,schema)
#define ISchemaNotation_get_id(This,id) (This)->lpVtbl->get_id(This,id)
#define ISchemaNotation_get_itemType(This,itemType) (This)->lpVtbl->get_itemType(This,itemType)
#define ISchemaNotation_get_unhandledAttributes(This,attributes) (This)->lpVtbl->get_unhandledAttributes(This,attributes)
#define ISchemaNotation_writeAnnotation(This,annotationSink,isWritten) (This)->lpVtbl->writeAnnotation(This,annotationSink,isWritten)
/*** ISchemaNotation methods ***/
#define ISchemaNotation_get_systemIdentifier(This,uri) (This)->lpVtbl->get_systemIdentifier(This,uri)
#define ISchemaNotation_get_publicIdentifier(This,uri) (This)->lpVtbl->get_publicIdentifier(This,uri)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT ISchemaNotation_QueryInterface(ISchemaNotation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG ISchemaNotation_AddRef(ISchemaNotation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG ISchemaNotation_Release(ISchemaNotation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static __WIDL_INLINE HRESULT ISchemaNotation_GetTypeInfoCount(ISchemaNotation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static __WIDL_INLINE HRESULT ISchemaNotation_GetTypeInfo(ISchemaNotation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static __WIDL_INLINE HRESULT ISchemaNotation_GetIDsOfNames(ISchemaNotation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static __WIDL_INLINE HRESULT ISchemaNotation_Invoke(ISchemaNotation* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISchemaItem methods ***/
static __WIDL_INLINE HRESULT ISchemaNotation_get_name(ISchemaNotation* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static __WIDL_INLINE HRESULT ISchemaNotation_get_namespaceURI(ISchemaNotation* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static __WIDL_INLINE HRESULT ISchemaNotation_get_schema(ISchemaNotation* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static __WIDL_INLINE HRESULT ISchemaNotation_get_id(ISchemaNotation* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static __WIDL_INLINE HRESULT ISchemaNotation_get_itemType(ISchemaNotation* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static __WIDL_INLINE HRESULT ISchemaNotation_get_unhandledAttributes(ISchemaNotation* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static __WIDL_INLINE HRESULT ISchemaNotation_writeAnnotation(ISchemaNotation* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaNotation methods ***/
static __WIDL_INLINE HRESULT ISchemaNotation_get_systemIdentifier(ISchemaNotation* This,BSTR *uri) {
    return This->lpVtbl->get_systemIdentifier(This,uri);
}
static __WIDL_INLINE HRESULT ISchemaNotation_get_publicIdentifier(ISchemaNotation* This,BSTR *uri) {
    return This->lpVtbl->get_publicIdentifier(This,uri);
}
#endif
#endif

#endif


#endif  /* __ISchemaNotation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * SAXXMLReader30 coclass
 */

DEFINE_GUID(CLSID_SAXXMLReader30, 0x3124c396, 0xfb13, 0x4836, 0xa6,0xad, 0x13,0x17,0xf1,0x71,0x36,0x88);

#ifdef __cplusplus
class DECLSPEC_UUID("3124c396-fb13-4836-a6ad-1317f1713688") SAXXMLReader30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SAXXMLReader30, 0x3124c396, 0xfb13, 0x4836, 0xa6,0xad, 0x13,0x17,0xf1,0x71,0x36,0x88)
#endif
#endif

/*****************************************************************************
 * SAXXMLReader40 coclass
 */

DEFINE_GUID(CLSID_SAXXMLReader40, 0x7c6e29bc, 0x8b8b, 0x4c3d, 0x85,0x9e, 0xaf,0x6c,0xd1,0x58,0xbe,0x0f);

#ifdef __cplusplus
class DECLSPEC_UUID("7c6e29bc-8b8b-4c3d-859e-af6cd158be0f") SAXXMLReader40;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SAXXMLReader40, 0x7c6e29bc, 0x8b8b, 0x4c3d, 0x85,0x9e, 0xaf,0x6c,0xd1,0x58,0xbe,0x0f)
#endif
#endif

/*****************************************************************************
 * SAXXMLReader60 coclass
 */

DEFINE_GUID(CLSID_SAXXMLReader60, 0x88d96a0c, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d96a0c-f192-11d4-a65f-0040963251e5") SAXXMLReader60;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SAXXMLReader60, 0x88d96a0c, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * SAXXMLReader coclass
 */

DEFINE_GUID(CLSID_SAXXMLReader, 0x079aa557, 0x4a18, 0x424a, 0x8e,0xee, 0xe3,0x9f,0x0a,0x8d,0x41,0xb9);

#ifdef __cplusplus
class DECLSPEC_UUID("079aa557-4a18-424a-8eee-e39f0a8d41b9") SAXXMLReader;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SAXXMLReader, 0x079aa557, 0x4a18, 0x424a, 0x8e,0xee, 0xe3,0x9f,0x0a,0x8d,0x41,0xb9)
#endif
#endif

/*****************************************************************************
 * MXHTMLWriter coclass
 */

DEFINE_GUID(CLSID_MXHTMLWriter, 0xa4c23ec3, 0x6b70, 0x4466, 0x91,0x27, 0x55,0x00,0x77,0x23,0x99,0x78);

#ifdef __cplusplus
class DECLSPEC_UUID("a4c23ec3-6b70-4466-9127-550077239978") MXHTMLWriter;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXHTMLWriter, 0xa4c23ec3, 0x6b70, 0x4466, 0x91,0x27, 0x55,0x00,0x77,0x23,0x99,0x78)
#endif
#endif

/*****************************************************************************
 * MXHTMLWriter30 coclass
 */

DEFINE_GUID(CLSID_MXHTMLWriter30, 0x853d1540, 0xc1a7, 0x4aa9, 0xa2,0x26, 0x4d,0x3b,0xd3,0x01,0x14,0x6d);

#ifdef __cplusplus
class DECLSPEC_UUID("853d1540-c1a7-4aa9-a226-4d3bd301146d") MXHTMLWriter30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXHTMLWriter30, 0x853d1540, 0xc1a7, 0x4aa9, 0xa2,0x26, 0x4d,0x3b,0xd3,0x01,0x14,0x6d)
#endif
#endif

/*****************************************************************************
 * MXHTMLWriter40 coclass
 */

DEFINE_GUID(CLSID_MXHTMLWriter40, 0x88d969c9, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d969c9-f192-11d4-a65f-0040963251e5") MXHTMLWriter40;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXHTMLWriter40, 0x88d969c9, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * MXHTMLWriter60 coclass
 */

DEFINE_GUID(CLSID_MXHTMLWriter60, 0x88d96a10, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d96a10-f192-11d4-a65f-0040963251e5") MXHTMLWriter60;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXHTMLWriter60, 0x88d96a10, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * MXXMLWriter30 coclass
 */

DEFINE_GUID(CLSID_MXXMLWriter30, 0x3d813dfe, 0x6c91, 0x4a4e, 0x8f,0x41, 0x04,0x34,0x6a,0x84,0x1d,0x9c);

#ifdef __cplusplus
class DECLSPEC_UUID("3d813dfe-6c91-4a4e-8f41-04346a841d9c") MXXMLWriter30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXXMLWriter30, 0x3d813dfe, 0x6c91, 0x4a4e, 0x8f,0x41, 0x04,0x34,0x6a,0x84,0x1d,0x9c)
#endif
#endif

/*****************************************************************************
 * MXXMLWriter40 coclass
 */

DEFINE_GUID(CLSID_MXXMLWriter40, 0x88d969c8, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d969c8-f192-11d4-a65f-0040963251e5") MXXMLWriter40;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXXMLWriter40, 0x88d969c8, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * MXXMLWriter60 coclass
 */

DEFINE_GUID(CLSID_MXXMLWriter60, 0x88d96a0f, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d96a0f-f192-11d4-a65f-0040963251e5") MXXMLWriter60;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXXMLWriter60, 0x88d96a0f, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * MXXMLWriter coclass
 */

DEFINE_GUID(CLSID_MXXMLWriter, 0xfc220ad8, 0xa72a, 0x4ee8, 0x92,0x6e, 0x0b,0x7a,0xd1,0x52,0xa0,0x20);

#ifdef __cplusplus
class DECLSPEC_UUID("fc220ad8-a72a-4ee8-926e-0b7ad152a020") MXXMLWriter;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXXMLWriter, 0xfc220ad8, 0xa72a, 0x4ee8, 0x92,0x6e, 0x0b,0x7a,0xd1,0x52,0xa0,0x20)
#endif
#endif

/*****************************************************************************
 * MXNamespaceManager coclass
 */

DEFINE_GUID(CLSID_MXNamespaceManager, 0x88d969d5, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d969d5-f192-11d4-a65f-0040963251e5") MXNamespaceManager;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXNamespaceManager, 0x88d969d5, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * MXNamespaceManager40 coclass
 */

DEFINE_GUID(CLSID_MXNamespaceManager40, 0x88d969d6, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d969d6-f192-11d4-a65f-0040963251e5") MXNamespaceManager40;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXNamespaceManager40, 0x88d969d6, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * MXNamespaceManager60 coclass
 */

DEFINE_GUID(CLSID_MXNamespaceManager60, 0x88d96a11, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d96a11-f192-11d4-a65f-0040963251e5") MXNamespaceManager60;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXNamespaceManager60, 0x88d96a11, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * SAXAttributes30 coclass
 */

DEFINE_GUID(CLSID_SAXAttributes30, 0x3e784a01, 0xf3ae, 0x4dc0, 0x93,0x54, 0x95,0x26,0xb9,0x37,0x0e,0xba);

#ifdef __cplusplus
class DECLSPEC_UUID("3e784a01-f3ae-4dc0-9354-9526b9370eba") SAXAttributes30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SAXAttributes30, 0x3e784a01, 0xf3ae, 0x4dc0, 0x93,0x54, 0x95,0x26,0xb9,0x37,0x0e,0xba)
#endif
#endif

/*****************************************************************************
 * SAXAttributes40 coclass
 */

DEFINE_GUID(CLSID_SAXAttributes40, 0x88d969ca, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d969ca-f192-11d4-a65f-0040963251e5") SAXAttributes40;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SAXAttributes40, 0x88d969ca, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * SAXAttributes60 coclass
 */

DEFINE_GUID(CLSID_SAXAttributes60, 0x88d96a0e, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d96a0e-f192-11d4-a65f-0040963251e5") SAXAttributes60;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SAXAttributes60, 0x88d96a0e, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * SAXAttributes coclass
 */

DEFINE_GUID(CLSID_SAXAttributes, 0x4dd441ad, 0x526d, 0x4a77, 0x9f,0x1b, 0x98,0x41,0xed,0x80,0x2f,0xb0);

#ifdef __cplusplus
class DECLSPEC_UUID("4dd441ad-526d-4a77-9f1b-9841ed802fb0") SAXAttributes;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SAXAttributes, 0x4dd441ad, 0x526d, 0x4a77, 0x9f,0x1b, 0x98,0x41,0xed,0x80,0x2f,0xb0)
#endif
#endif

#define E_XML_NOTWF              0xC00CE223
#define E_XML_NODTD              0xC00CE224
#define E_XML_INVALID            0xC00CE225
#define E_XML_BUFFERTOOSMALL     0xC00CE226
#endif /* __MSXML2_LIBRARY_DEFINED__ */
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __msxml2_h__ */
