/*** Autogenerated by WIDL 10.11 from include/msxml6.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 __msxml6_h__
#define __msxml6_h__

/* Forward declarations */

#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 __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 __IXMLHTTPRequest2_FWD_DEFINED__
#define __IXMLHTTPRequest2_FWD_DEFINED__
typedef interface IXMLHTTPRequest2 IXMLHTTPRequest2;
#ifdef __cplusplus
interface IXMLHTTPRequest2;
#endif /* __cplusplus */
#endif

#ifndef __IXMLHTTPRequest3_FWD_DEFINED__
#define __IXMLHTTPRequest3_FWD_DEFINED__
typedef interface IXMLHTTPRequest3 IXMLHTTPRequest3;
#ifdef __cplusplus
interface IXMLHTTPRequest3;
#endif /* __cplusplus */
#endif

#ifndef __IXMLHTTPRequest2Callback_FWD_DEFINED__
#define __IXMLHTTPRequest2Callback_FWD_DEFINED__
typedef interface IXMLHTTPRequest2Callback IXMLHTTPRequest2Callback;
#ifdef __cplusplus
interface IXMLHTTPRequest2Callback;
#endif /* __cplusplus */
#endif

#ifndef __IXMLHTTPRequest3Callback_FWD_DEFINED__
#define __IXMLHTTPRequest3Callback_FWD_DEFINED__
typedef interface IXMLHTTPRequest3Callback IXMLHTTPRequest3Callback;
#ifdef __cplusplus
interface IXMLHTTPRequest3Callback;
#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 __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 __FreeThreadedXMLHTTP60_FWD_DEFINED__
#define __FreeThreadedXMLHTTP60_FWD_DEFINED__
#ifdef __cplusplus
typedef class FreeThreadedXMLHTTP60 FreeThreadedXMLHTTP60;
#else
typedef struct FreeThreadedXMLHTTP60 FreeThreadedXMLHTTP60;
#endif /* defined __cplusplus */
#endif /* defined __FreeThreadedXMLHTTP60_FWD_DEFINED__ */

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

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

#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 __IXMLHTTPRequest2Callback_FWD_DEFINED__
#define __IXMLHTTPRequest2Callback_FWD_DEFINED__
typedef interface IXMLHTTPRequest2Callback IXMLHTTPRequest2Callback;
#ifdef __cplusplus
interface IXMLHTTPRequest2Callback;
#endif /* __cplusplus */
#endif

#ifndef __IXMLHTTPRequest3Callback_FWD_DEFINED__
#define __IXMLHTTPRequest3Callback_FWD_DEFINED__
typedef interface IXMLHTTPRequest3Callback IXMLHTTPRequest3Callback;
#ifdef __cplusplus
interface IXMLHTTPRequest3Callback;
#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

#ifdef __ISAXXMLReader_INTERFACE_DEFINED__
#undef __MSXML2_LIBRARY_DEFINED__
#endif
#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__ */
typedef enum _XHR_CRED_PROMPT {
    XHR_CRED_PROMPT_ALL = 0,
    XHR_CRED_PROMPT_NONE = 1,
    XHR_CRED_PROMPT_PROXY = 2
} XHR_CRED_PROMPT;
typedef enum _XHR_AUTH {
    XHR_AUTH_ALL = 0,
    XHR_AUTH_NONE = 1,
    XHR_AUTH_PROXY = 2
} XHR_AUTH;
typedef enum _XHR_PROPERTY {
    XHR_PROP_NO_CRED_PROMPT = 0,
    XHR_PROP_NO_AUTH = 1,
    XHR_PROP_TIMEOUT = 2,
    XHR_PROP_NO_DEFAULT_HEADERS = 3,
    XHR_PROP_REPORT_REDIRECT_STATUS = 4,
    XHR_PROP_NO_CACHE = 5,
    XHR_PROP_EXTENDED_ERROR = 6,
    XHR_PROP_QUERY_STRING_UTF8 = 7,
    XHR_PROP_IGNORE_CERT_ERRORS = 8,
    XHR_PROP_ONDATA_THRESHOLD = 9,
    XHR_PROP_SET_ENTERPRISEID = 10,
    XHR_PROP_MAX_CONNECTIONS = 11
} XHR_PROPERTY;
typedef struct tagXHR_COOKIE {
    WCHAR *pwszUrl;
    WCHAR *pwszName;
    WCHAR *pwszValue;
    WCHAR *pwszP3PPolicy;
    FILETIME ftExpires;
    DWORD dwFlags;
} XHR_COOKIE;
typedef struct tagXHR_CERT {
    DWORD cbCert;
    BYTE *pbCert;
} XHR_CERT;
/*****************************************************************************
 * 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 inline HRESULT IXMLDOMNode_QueryInterface(IXMLDOMNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMNode_AddRef(IXMLDOMNode* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMNode_Release(IXMLDOMNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMNode_GetTypeInfoCount(IXMLDOMNode* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMNode_GetTypeInfo(IXMLDOMNode* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMNode_get_nodeName(IXMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMNode_get_nodeValue(IXMLDOMNode* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMNode_put_nodeValue(IXMLDOMNode* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMNode_get_nodeType(IXMLDOMNode* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMNode_get_parentNode(IXMLDOMNode* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMNode_get_childNodes(IXMLDOMNode* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMNode_get_firstChild(IXMLDOMNode* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMNode_get_lastChild(IXMLDOMNode* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMNode_get_previousSibling(IXMLDOMNode* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMNode_get_nextSibling(IXMLDOMNode* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMNode_get_attributes(IXMLDOMNode* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMNode_insertBefore(IXMLDOMNode* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMNode_replaceChild(IXMLDOMNode* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMNode_removeChild(IXMLDOMNode* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMNode_appendChild(IXMLDOMNode* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMNode_hasChildNodes(IXMLDOMNode* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMNode_get_ownerDocument(IXMLDOMNode* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMNode_cloneNode(IXMLDOMNode* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMNode_get_nodeTypeString(IXMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMNode_get_text(IXMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMNode_put_text(IXMLDOMNode* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMNode_get_specified(IXMLDOMNode* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMNode_get_definition(IXMLDOMNode* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMNode_get_nodeTypedValue(IXMLDOMNode* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMNode_put_nodeTypedValue(IXMLDOMNode* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMNode_get_dataType(IXMLDOMNode* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMNode_put_dataType(IXMLDOMNode* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMNode_get_xml(IXMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMNode_transformNode(IXMLDOMNode* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMNode_selectNodes(IXMLDOMNode* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMNode_selectSingleNode(IXMLDOMNode* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMNode_get_parsed(IXMLDOMNode* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMNode_get_namespaceURI(IXMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMNode_get_prefix(IXMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMNode_get_baseName(IXMLDOMNode* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static 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 inline HRESULT IXMLDOMDocument_QueryInterface(IXMLDOMDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMDocument_AddRef(IXMLDOMDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMDocument_Release(IXMLDOMDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMDocument_GetTypeInfoCount(IXMLDOMDocument* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMDocument_GetTypeInfo(IXMLDOMDocument* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMDocument_get_nodeName(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMDocument_get_nodeValue(IXMLDOMDocument* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMDocument_put_nodeValue(IXMLDOMDocument* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMDocument_get_nodeType(IXMLDOMDocument* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMDocument_get_parentNode(IXMLDOMDocument* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMDocument_get_childNodes(IXMLDOMDocument* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMDocument_get_firstChild(IXMLDOMDocument* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMDocument_get_lastChild(IXMLDOMDocument* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMDocument_get_previousSibling(IXMLDOMDocument* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMDocument_get_nextSibling(IXMLDOMDocument* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMDocument_get_attributes(IXMLDOMDocument* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMDocument_insertBefore(IXMLDOMDocument* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMDocument_replaceChild(IXMLDOMDocument* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMDocument_removeChild(IXMLDOMDocument* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMDocument_appendChild(IXMLDOMDocument* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMDocument_hasChildNodes(IXMLDOMDocument* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMDocument_get_ownerDocument(IXMLDOMDocument* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMDocument_cloneNode(IXMLDOMDocument* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMDocument_get_nodeTypeString(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMDocument_get_text(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMDocument_put_text(IXMLDOMDocument* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMDocument_get_specified(IXMLDOMDocument* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMDocument_get_definition(IXMLDOMDocument* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMDocument_get_nodeTypedValue(IXMLDOMDocument* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMDocument_put_nodeTypedValue(IXMLDOMDocument* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMDocument_get_dataType(IXMLDOMDocument* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMDocument_put_dataType(IXMLDOMDocument* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMDocument_get_xml(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMDocument_transformNode(IXMLDOMDocument* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMDocument_selectNodes(IXMLDOMDocument* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMDocument_selectSingleNode(IXMLDOMDocument* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMDocument_get_parsed(IXMLDOMDocument* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMDocument_get_namespaceURI(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMDocument_get_prefix(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMDocument_get_baseName(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static inline HRESULT IXMLDOMDocument_transformNodeToObject(IXMLDOMDocument* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMDocument methods ***/
static inline HRESULT IXMLDOMDocument_get_doctype(IXMLDOMDocument* This,IXMLDOMDocumentType **docType) {
    return This->lpVtbl->get_doctype(This,docType);
}
static inline HRESULT IXMLDOMDocument_get_implementation(IXMLDOMDocument* This,IXMLDOMImplementation **impl) {
    return This->lpVtbl->get_implementation(This,impl);
}
static inline HRESULT IXMLDOMDocument_get_documentElement(IXMLDOMDocument* This,IXMLDOMElement **domElement) {
    return This->lpVtbl->get_documentElement(This,domElement);
}
static inline HRESULT IXMLDOMDocument_putref_documentElement(IXMLDOMDocument* This,IXMLDOMElement *domElement) {
    return This->lpVtbl->putref_documentElement(This,domElement);
}
static inline HRESULT IXMLDOMDocument_createElement(IXMLDOMDocument* This,BSTR p,IXMLDOMElement **domElement) {
    return This->lpVtbl->createElement(This,p,domElement);
}
static inline HRESULT IXMLDOMDocument_createDocumentFragment(IXMLDOMDocument* This,IXMLDOMDocumentFragment **docFrag) {
    return This->lpVtbl->createDocumentFragment(This,docFrag);
}
static inline HRESULT IXMLDOMDocument_createTextNode(IXMLDOMDocument* This,BSTR p,IXMLDOMText **text) {
    return This->lpVtbl->createTextNode(This,p,text);
}
static inline HRESULT IXMLDOMDocument_createComment(IXMLDOMDocument* This,BSTR p,IXMLDOMComment **comment) {
    return This->lpVtbl->createComment(This,p,comment);
}
static inline HRESULT IXMLDOMDocument_createCDATASection(IXMLDOMDocument* This,BSTR p,IXMLDOMCDATASection **cdata) {
    return This->lpVtbl->createCDATASection(This,p,cdata);
}
static inline HRESULT IXMLDOMDocument_createProcessingInstruction(IXMLDOMDocument* This,BSTR target,BSTR data,IXMLDOMProcessingInstruction **pi) {
    return This->lpVtbl->createProcessingInstruction(This,target,data,pi);
}
static inline HRESULT IXMLDOMDocument_createAttribute(IXMLDOMDocument* This,BSTR p,IXMLDOMAttribute **attribute) {
    return This->lpVtbl->createAttribute(This,p,attribute);
}
static inline HRESULT IXMLDOMDocument_createEntityReference(IXMLDOMDocument* This,BSTR p,IXMLDOMEntityReference **entityRef) {
    return This->lpVtbl->createEntityReference(This,p,entityRef);
}
static inline HRESULT IXMLDOMDocument_getElementsByTagName(IXMLDOMDocument* This,BSTR p,IXMLDOMNodeList **resultList) {
    return This->lpVtbl->getElementsByTagName(This,p,resultList);
}
static inline HRESULT IXMLDOMDocument_createNode(IXMLDOMDocument* This,VARIANT var,BSTR name,BSTR uri,IXMLDOMNode **node) {
    return This->lpVtbl->createNode(This,var,name,uri,node);
}
static inline HRESULT IXMLDOMDocument_nodeFromID(IXMLDOMDocument* This,BSTR id,IXMLDOMNode **node) {
    return This->lpVtbl->nodeFromID(This,id,node);
}
static inline HRESULT IXMLDOMDocument_load(IXMLDOMDocument* This,VARIANT var1,VARIANT_BOOL *pbool) {
    return This->lpVtbl->load(This,var1,pbool);
}
static inline HRESULT IXMLDOMDocument_get_readyState(IXMLDOMDocument* This,LONG *value) {
    return This->lpVtbl->get_readyState(This,value);
}
static inline HRESULT IXMLDOMDocument_get_parseError(IXMLDOMDocument* This,IXMLDOMParseError **err) {
    return This->lpVtbl->get_parseError(This,err);
}
static inline HRESULT IXMLDOMDocument_get_url(IXMLDOMDocument* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static inline HRESULT IXMLDOMDocument_get_async(IXMLDOMDocument* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_async(This,pbool);
}
static inline HRESULT IXMLDOMDocument_put_async(IXMLDOMDocument* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_async(This,pbool);
}
static inline HRESULT IXMLDOMDocument_abort(IXMLDOMDocument* This) {
    return This->lpVtbl->abort(This);
}
static inline HRESULT IXMLDOMDocument_loadXML(IXMLDOMDocument* This,BSTR p,VARIANT_BOOL *pbool) {
    return This->lpVtbl->loadXML(This,p,pbool);
}
static inline HRESULT IXMLDOMDocument_save(IXMLDOMDocument* This,VARIANT var1) {
    return This->lpVtbl->save(This,var1);
}
static inline HRESULT IXMLDOMDocument_get_validateOnParse(IXMLDOMDocument* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_validateOnParse(This,pbool);
}
static inline HRESULT IXMLDOMDocument_put_validateOnParse(IXMLDOMDocument* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_validateOnParse(This,pbool);
}
static inline HRESULT IXMLDOMDocument_get_resolveExternals(IXMLDOMDocument* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_resolveExternals(This,pbool);
}
static inline HRESULT IXMLDOMDocument_put_resolveExternals(IXMLDOMDocument* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_resolveExternals(This,pbool);
}
static inline HRESULT IXMLDOMDocument_get_preserveWhiteSpace(IXMLDOMDocument* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_preserveWhiteSpace(This,pbool);
}
static inline HRESULT IXMLDOMDocument_put_preserveWhiteSpace(IXMLDOMDocument* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_preserveWhiteSpace(This,pbool);
}
static inline HRESULT IXMLDOMDocument_put_onreadystatechange(IXMLDOMDocument* This,VARIANT var1) {
    return This->lpVtbl->put_onreadystatechange(This,var1);
}
static inline HRESULT IXMLDOMDocument_put_ondataavailable(IXMLDOMDocument* This,VARIANT var1) {
    return This->lpVtbl->put_ondataavailable(This,var1);
}
static 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 inline HRESULT IXMLDOMSchemaCollection_QueryInterface(IXMLDOMSchemaCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMSchemaCollection_AddRef(IXMLDOMSchemaCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMSchemaCollection_Release(IXMLDOMSchemaCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMSchemaCollection_GetTypeInfoCount(IXMLDOMSchemaCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMSchemaCollection_GetTypeInfo(IXMLDOMSchemaCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMSchemaCollection_add(IXMLDOMSchemaCollection* This,BSTR uri,VARIANT var) {
    return This->lpVtbl->add(This,uri,var);
}
static inline HRESULT IXMLDOMSchemaCollection_get(IXMLDOMSchemaCollection* This,BSTR uri,IXMLDOMNode **node) {
    return This->lpVtbl->get(This,uri,node);
}
static inline HRESULT IXMLDOMSchemaCollection_remove(IXMLDOMSchemaCollection* This,BSTR uri) {
    return This->lpVtbl->remove(This,uri);
}
static inline HRESULT IXMLDOMSchemaCollection_get_length(IXMLDOMSchemaCollection* This,LONG *length) {
    return This->lpVtbl->get_length(This,length);
}
static inline HRESULT IXMLDOMSchemaCollection_get_namespaceURI(IXMLDOMSchemaCollection* This,LONG index,BSTR *len) {
    return This->lpVtbl->get_namespaceURI(This,index,len);
}
static inline HRESULT IXMLDOMSchemaCollection_addCollection(IXMLDOMSchemaCollection* This,IXMLDOMSchemaCollection *otherCollection) {
    return This->lpVtbl->addCollection(This,otherCollection);
}
static 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 inline HRESULT IXMLDOMSchemaCollection2_QueryInterface(IXMLDOMSchemaCollection2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMSchemaCollection2_AddRef(IXMLDOMSchemaCollection2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMSchemaCollection2_Release(IXMLDOMSchemaCollection2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMSchemaCollection2_GetTypeInfoCount(IXMLDOMSchemaCollection2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMSchemaCollection2_GetTypeInfo(IXMLDOMSchemaCollection2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMSchemaCollection2_add(IXMLDOMSchemaCollection2* This,BSTR uri,VARIANT var) {
    return This->lpVtbl->add(This,uri,var);
}
static inline HRESULT IXMLDOMSchemaCollection2_get(IXMLDOMSchemaCollection2* This,BSTR uri,IXMLDOMNode **node) {
    return This->lpVtbl->get(This,uri,node);
}
static inline HRESULT IXMLDOMSchemaCollection2_remove(IXMLDOMSchemaCollection2* This,BSTR uri) {
    return This->lpVtbl->remove(This,uri);
}
static inline HRESULT IXMLDOMSchemaCollection2_get_length(IXMLDOMSchemaCollection2* This,LONG *length) {
    return This->lpVtbl->get_length(This,length);
}
static inline HRESULT IXMLDOMSchemaCollection2_get_namespaceURI(IXMLDOMSchemaCollection2* This,LONG index,BSTR *len) {
    return This->lpVtbl->get_namespaceURI(This,index,len);
}
static inline HRESULT IXMLDOMSchemaCollection2_addCollection(IXMLDOMSchemaCollection2* This,IXMLDOMSchemaCollection *otherCollection) {
    return This->lpVtbl->addCollection(This,otherCollection);
}
static inline HRESULT IXMLDOMSchemaCollection2_get__newEnum(IXMLDOMSchemaCollection2* This,IUnknown **ppUnk) {
    return This->lpVtbl->get__newEnum(This,ppUnk);
}
/*** IXMLDOMSchemaCollection2 methods ***/
static inline HRESULT IXMLDOMSchemaCollection2_validate(IXMLDOMSchemaCollection2* This) {
    return This->lpVtbl->validate(This);
}
static inline HRESULT IXMLDOMSchemaCollection2_put_validateOnLoad(IXMLDOMSchemaCollection2* This,VARIANT_BOOL validateOnLoad) {
    return This->lpVtbl->put_validateOnLoad(This,validateOnLoad);
}
static inline HRESULT IXMLDOMSchemaCollection2_get_validateOnLoad(IXMLDOMSchemaCollection2* This,VARIANT_BOOL *validateOnLoad) {
    return This->lpVtbl->get_validateOnLoad(This,validateOnLoad);
}
static inline HRESULT IXMLDOMSchemaCollection2_getSchema(IXMLDOMSchemaCollection2* This,BSTR namespaceURI,ISchema **schema) {
    return This->lpVtbl->getSchema(This,namespaceURI,schema);
}
static 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 inline HRESULT IXMLDOMDocument2_QueryInterface(IXMLDOMDocument2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMDocument2_AddRef(IXMLDOMDocument2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMDocument2_Release(IXMLDOMDocument2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMDocument2_GetTypeInfoCount(IXMLDOMDocument2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMDocument2_GetTypeInfo(IXMLDOMDocument2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMDocument2_get_nodeName(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMDocument2_get_nodeValue(IXMLDOMDocument2* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMDocument2_put_nodeValue(IXMLDOMDocument2* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMDocument2_get_nodeType(IXMLDOMDocument2* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMDocument2_get_parentNode(IXMLDOMDocument2* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMDocument2_get_childNodes(IXMLDOMDocument2* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMDocument2_get_firstChild(IXMLDOMDocument2* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMDocument2_get_lastChild(IXMLDOMDocument2* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMDocument2_get_previousSibling(IXMLDOMDocument2* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMDocument2_get_nextSibling(IXMLDOMDocument2* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMDocument2_get_attributes(IXMLDOMDocument2* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMDocument2_insertBefore(IXMLDOMDocument2* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMDocument2_replaceChild(IXMLDOMDocument2* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMDocument2_removeChild(IXMLDOMDocument2* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMDocument2_appendChild(IXMLDOMDocument2* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMDocument2_hasChildNodes(IXMLDOMDocument2* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMDocument2_get_ownerDocument(IXMLDOMDocument2* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMDocument2_cloneNode(IXMLDOMDocument2* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMDocument2_get_nodeTypeString(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMDocument2_get_text(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMDocument2_put_text(IXMLDOMDocument2* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMDocument2_get_specified(IXMLDOMDocument2* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMDocument2_get_definition(IXMLDOMDocument2* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMDocument2_get_nodeTypedValue(IXMLDOMDocument2* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMDocument2_put_nodeTypedValue(IXMLDOMDocument2* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMDocument2_get_dataType(IXMLDOMDocument2* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMDocument2_put_dataType(IXMLDOMDocument2* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMDocument2_get_xml(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMDocument2_transformNode(IXMLDOMDocument2* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMDocument2_selectNodes(IXMLDOMDocument2* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMDocument2_selectSingleNode(IXMLDOMDocument2* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMDocument2_get_parsed(IXMLDOMDocument2* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMDocument2_get_namespaceURI(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMDocument2_get_prefix(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMDocument2_get_baseName(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static inline HRESULT IXMLDOMDocument2_transformNodeToObject(IXMLDOMDocument2* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMDocument methods ***/
static inline HRESULT IXMLDOMDocument2_get_doctype(IXMLDOMDocument2* This,IXMLDOMDocumentType **docType) {
    return This->lpVtbl->get_doctype(This,docType);
}
static inline HRESULT IXMLDOMDocument2_get_implementation(IXMLDOMDocument2* This,IXMLDOMImplementation **impl) {
    return This->lpVtbl->get_implementation(This,impl);
}
static inline HRESULT IXMLDOMDocument2_get_documentElement(IXMLDOMDocument2* This,IXMLDOMElement **domElement) {
    return This->lpVtbl->get_documentElement(This,domElement);
}
static inline HRESULT IXMLDOMDocument2_putref_documentElement(IXMLDOMDocument2* This,IXMLDOMElement *domElement) {
    return This->lpVtbl->putref_documentElement(This,domElement);
}
static inline HRESULT IXMLDOMDocument2_createElement(IXMLDOMDocument2* This,BSTR p,IXMLDOMElement **domElement) {
    return This->lpVtbl->createElement(This,p,domElement);
}
static inline HRESULT IXMLDOMDocument2_createDocumentFragment(IXMLDOMDocument2* This,IXMLDOMDocumentFragment **docFrag) {
    return This->lpVtbl->createDocumentFragment(This,docFrag);
}
static inline HRESULT IXMLDOMDocument2_createTextNode(IXMLDOMDocument2* This,BSTR p,IXMLDOMText **text) {
    return This->lpVtbl->createTextNode(This,p,text);
}
static inline HRESULT IXMLDOMDocument2_createComment(IXMLDOMDocument2* This,BSTR p,IXMLDOMComment **comment) {
    return This->lpVtbl->createComment(This,p,comment);
}
static inline HRESULT IXMLDOMDocument2_createCDATASection(IXMLDOMDocument2* This,BSTR p,IXMLDOMCDATASection **cdata) {
    return This->lpVtbl->createCDATASection(This,p,cdata);
}
static inline HRESULT IXMLDOMDocument2_createProcessingInstruction(IXMLDOMDocument2* This,BSTR target,BSTR data,IXMLDOMProcessingInstruction **pi) {
    return This->lpVtbl->createProcessingInstruction(This,target,data,pi);
}
static inline HRESULT IXMLDOMDocument2_createAttribute(IXMLDOMDocument2* This,BSTR p,IXMLDOMAttribute **attribute) {
    return This->lpVtbl->createAttribute(This,p,attribute);
}
static inline HRESULT IXMLDOMDocument2_createEntityReference(IXMLDOMDocument2* This,BSTR p,IXMLDOMEntityReference **entityRef) {
    return This->lpVtbl->createEntityReference(This,p,entityRef);
}
static inline HRESULT IXMLDOMDocument2_getElementsByTagName(IXMLDOMDocument2* This,BSTR p,IXMLDOMNodeList **resultList) {
    return This->lpVtbl->getElementsByTagName(This,p,resultList);
}
static inline HRESULT IXMLDOMDocument2_createNode(IXMLDOMDocument2* This,VARIANT var,BSTR name,BSTR uri,IXMLDOMNode **node) {
    return This->lpVtbl->createNode(This,var,name,uri,node);
}
static inline HRESULT IXMLDOMDocument2_nodeFromID(IXMLDOMDocument2* This,BSTR id,IXMLDOMNode **node) {
    return This->lpVtbl->nodeFromID(This,id,node);
}
static inline HRESULT IXMLDOMDocument2_load(IXMLDOMDocument2* This,VARIANT var1,VARIANT_BOOL *pbool) {
    return This->lpVtbl->load(This,var1,pbool);
}
static inline HRESULT IXMLDOMDocument2_get_readyState(IXMLDOMDocument2* This,LONG *value) {
    return This->lpVtbl->get_readyState(This,value);
}
static inline HRESULT IXMLDOMDocument2_get_parseError(IXMLDOMDocument2* This,IXMLDOMParseError **err) {
    return This->lpVtbl->get_parseError(This,err);
}
static inline HRESULT IXMLDOMDocument2_get_url(IXMLDOMDocument2* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static inline HRESULT IXMLDOMDocument2_get_async(IXMLDOMDocument2* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_async(This,pbool);
}
static inline HRESULT IXMLDOMDocument2_put_async(IXMLDOMDocument2* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_async(This,pbool);
}
static inline HRESULT IXMLDOMDocument2_abort(IXMLDOMDocument2* This) {
    return This->lpVtbl->abort(This);
}
static inline HRESULT IXMLDOMDocument2_loadXML(IXMLDOMDocument2* This,BSTR p,VARIANT_BOOL *pbool) {
    return This->lpVtbl->loadXML(This,p,pbool);
}
static inline HRESULT IXMLDOMDocument2_save(IXMLDOMDocument2* This,VARIANT var1) {
    return This->lpVtbl->save(This,var1);
}
static inline HRESULT IXMLDOMDocument2_get_validateOnParse(IXMLDOMDocument2* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_validateOnParse(This,pbool);
}
static inline HRESULT IXMLDOMDocument2_put_validateOnParse(IXMLDOMDocument2* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_validateOnParse(This,pbool);
}
static inline HRESULT IXMLDOMDocument2_get_resolveExternals(IXMLDOMDocument2* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_resolveExternals(This,pbool);
}
static inline HRESULT IXMLDOMDocument2_put_resolveExternals(IXMLDOMDocument2* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_resolveExternals(This,pbool);
}
static inline HRESULT IXMLDOMDocument2_get_preserveWhiteSpace(IXMLDOMDocument2* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_preserveWhiteSpace(This,pbool);
}
static inline HRESULT IXMLDOMDocument2_put_preserveWhiteSpace(IXMLDOMDocument2* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_preserveWhiteSpace(This,pbool);
}
static inline HRESULT IXMLDOMDocument2_put_onreadystatechange(IXMLDOMDocument2* This,VARIANT var1) {
    return This->lpVtbl->put_onreadystatechange(This,var1);
}
static inline HRESULT IXMLDOMDocument2_put_ondataavailable(IXMLDOMDocument2* This,VARIANT var1) {
    return This->lpVtbl->put_ondataavailable(This,var1);
}
static inline HRESULT IXMLDOMDocument2_put_ontransformnode(IXMLDOMDocument2* This,VARIANT var1) {
    return This->lpVtbl->put_ontransformnode(This,var1);
}
/*** IXMLDOMDocument2 methods ***/
static inline HRESULT IXMLDOMDocument2_get_namespaces(IXMLDOMDocument2* This,IXMLDOMSchemaCollection **schemaCollection) {
    return This->lpVtbl->get_namespaces(This,schemaCollection);
}
static inline HRESULT IXMLDOMDocument2_get_schemas(IXMLDOMDocument2* This,VARIANT *var1) {
    return This->lpVtbl->get_schemas(This,var1);
}
static inline HRESULT IXMLDOMDocument2_putref_schemas(IXMLDOMDocument2* This,VARIANT var1) {
    return This->lpVtbl->putref_schemas(This,var1);
}
static inline HRESULT IXMLDOMDocument2_validate(IXMLDOMDocument2* This,IXMLDOMParseError **err) {
    return This->lpVtbl->validate(This,err);
}
static inline HRESULT IXMLDOMDocument2_setProperty(IXMLDOMDocument2* This,BSTR p,VARIANT var) {
    return This->lpVtbl->setProperty(This,p,var);
}
static 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 inline HRESULT IXMLDOMDocument3_QueryInterface(IXMLDOMDocument3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMDocument3_AddRef(IXMLDOMDocument3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMDocument3_Release(IXMLDOMDocument3* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMDocument3_GetTypeInfoCount(IXMLDOMDocument3* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMDocument3_GetTypeInfo(IXMLDOMDocument3* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMDocument3_get_nodeName(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMDocument3_get_nodeValue(IXMLDOMDocument3* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMDocument3_put_nodeValue(IXMLDOMDocument3* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMDocument3_get_nodeType(IXMLDOMDocument3* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMDocument3_get_parentNode(IXMLDOMDocument3* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMDocument3_get_childNodes(IXMLDOMDocument3* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMDocument3_get_firstChild(IXMLDOMDocument3* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMDocument3_get_lastChild(IXMLDOMDocument3* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMDocument3_get_previousSibling(IXMLDOMDocument3* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMDocument3_get_nextSibling(IXMLDOMDocument3* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMDocument3_get_attributes(IXMLDOMDocument3* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMDocument3_insertBefore(IXMLDOMDocument3* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMDocument3_replaceChild(IXMLDOMDocument3* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMDocument3_removeChild(IXMLDOMDocument3* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMDocument3_appendChild(IXMLDOMDocument3* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMDocument3_hasChildNodes(IXMLDOMDocument3* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMDocument3_get_ownerDocument(IXMLDOMDocument3* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMDocument3_cloneNode(IXMLDOMDocument3* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMDocument3_get_nodeTypeString(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMDocument3_get_text(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMDocument3_put_text(IXMLDOMDocument3* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMDocument3_get_specified(IXMLDOMDocument3* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMDocument3_get_definition(IXMLDOMDocument3* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMDocument3_get_nodeTypedValue(IXMLDOMDocument3* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMDocument3_put_nodeTypedValue(IXMLDOMDocument3* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMDocument3_get_dataType(IXMLDOMDocument3* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMDocument3_put_dataType(IXMLDOMDocument3* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMDocument3_get_xml(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMDocument3_transformNode(IXMLDOMDocument3* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMDocument3_selectNodes(IXMLDOMDocument3* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMDocument3_selectSingleNode(IXMLDOMDocument3* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMDocument3_get_parsed(IXMLDOMDocument3* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMDocument3_get_namespaceURI(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMDocument3_get_prefix(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMDocument3_get_baseName(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static inline HRESULT IXMLDOMDocument3_transformNodeToObject(IXMLDOMDocument3* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMDocument methods ***/
static inline HRESULT IXMLDOMDocument3_get_doctype(IXMLDOMDocument3* This,IXMLDOMDocumentType **docType) {
    return This->lpVtbl->get_doctype(This,docType);
}
static inline HRESULT IXMLDOMDocument3_get_implementation(IXMLDOMDocument3* This,IXMLDOMImplementation **impl) {
    return This->lpVtbl->get_implementation(This,impl);
}
static inline HRESULT IXMLDOMDocument3_get_documentElement(IXMLDOMDocument3* This,IXMLDOMElement **domElement) {
    return This->lpVtbl->get_documentElement(This,domElement);
}
static inline HRESULT IXMLDOMDocument3_putref_documentElement(IXMLDOMDocument3* This,IXMLDOMElement *domElement) {
    return This->lpVtbl->putref_documentElement(This,domElement);
}
static inline HRESULT IXMLDOMDocument3_createElement(IXMLDOMDocument3* This,BSTR p,IXMLDOMElement **domElement) {
    return This->lpVtbl->createElement(This,p,domElement);
}
static inline HRESULT IXMLDOMDocument3_createDocumentFragment(IXMLDOMDocument3* This,IXMLDOMDocumentFragment **docFrag) {
    return This->lpVtbl->createDocumentFragment(This,docFrag);
}
static inline HRESULT IXMLDOMDocument3_createTextNode(IXMLDOMDocument3* This,BSTR p,IXMLDOMText **text) {
    return This->lpVtbl->createTextNode(This,p,text);
}
static inline HRESULT IXMLDOMDocument3_createComment(IXMLDOMDocument3* This,BSTR p,IXMLDOMComment **comment) {
    return This->lpVtbl->createComment(This,p,comment);
}
static inline HRESULT IXMLDOMDocument3_createCDATASection(IXMLDOMDocument3* This,BSTR p,IXMLDOMCDATASection **cdata) {
    return This->lpVtbl->createCDATASection(This,p,cdata);
}
static inline HRESULT IXMLDOMDocument3_createProcessingInstruction(IXMLDOMDocument3* This,BSTR target,BSTR data,IXMLDOMProcessingInstruction **pi) {
    return This->lpVtbl->createProcessingInstruction(This,target,data,pi);
}
static inline HRESULT IXMLDOMDocument3_createAttribute(IXMLDOMDocument3* This,BSTR p,IXMLDOMAttribute **attribute) {
    return This->lpVtbl->createAttribute(This,p,attribute);
}
static inline HRESULT IXMLDOMDocument3_createEntityReference(IXMLDOMDocument3* This,BSTR p,IXMLDOMEntityReference **entityRef) {
    return This->lpVtbl->createEntityReference(This,p,entityRef);
}
static inline HRESULT IXMLDOMDocument3_getElementsByTagName(IXMLDOMDocument3* This,BSTR p,IXMLDOMNodeList **resultList) {
    return This->lpVtbl->getElementsByTagName(This,p,resultList);
}
static inline HRESULT IXMLDOMDocument3_createNode(IXMLDOMDocument3* This,VARIANT var,BSTR name,BSTR uri,IXMLDOMNode **node) {
    return This->lpVtbl->createNode(This,var,name,uri,node);
}
static inline HRESULT IXMLDOMDocument3_nodeFromID(IXMLDOMDocument3* This,BSTR id,IXMLDOMNode **node) {
    return This->lpVtbl->nodeFromID(This,id,node);
}
static inline HRESULT IXMLDOMDocument3_load(IXMLDOMDocument3* This,VARIANT var1,VARIANT_BOOL *pbool) {
    return This->lpVtbl->load(This,var1,pbool);
}
static inline HRESULT IXMLDOMDocument3_get_readyState(IXMLDOMDocument3* This,LONG *value) {
    return This->lpVtbl->get_readyState(This,value);
}
static inline HRESULT IXMLDOMDocument3_get_parseError(IXMLDOMDocument3* This,IXMLDOMParseError **err) {
    return This->lpVtbl->get_parseError(This,err);
}
static inline HRESULT IXMLDOMDocument3_get_url(IXMLDOMDocument3* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static inline HRESULT IXMLDOMDocument3_get_async(IXMLDOMDocument3* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_async(This,pbool);
}
static inline HRESULT IXMLDOMDocument3_put_async(IXMLDOMDocument3* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_async(This,pbool);
}
static inline HRESULT IXMLDOMDocument3_abort(IXMLDOMDocument3* This) {
    return This->lpVtbl->abort(This);
}
static inline HRESULT IXMLDOMDocument3_loadXML(IXMLDOMDocument3* This,BSTR p,VARIANT_BOOL *pbool) {
    return This->lpVtbl->loadXML(This,p,pbool);
}
static inline HRESULT IXMLDOMDocument3_save(IXMLDOMDocument3* This,VARIANT var1) {
    return This->lpVtbl->save(This,var1);
}
static inline HRESULT IXMLDOMDocument3_get_validateOnParse(IXMLDOMDocument3* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_validateOnParse(This,pbool);
}
static inline HRESULT IXMLDOMDocument3_put_validateOnParse(IXMLDOMDocument3* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_validateOnParse(This,pbool);
}
static inline HRESULT IXMLDOMDocument3_get_resolveExternals(IXMLDOMDocument3* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_resolveExternals(This,pbool);
}
static inline HRESULT IXMLDOMDocument3_put_resolveExternals(IXMLDOMDocument3* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_resolveExternals(This,pbool);
}
static inline HRESULT IXMLDOMDocument3_get_preserveWhiteSpace(IXMLDOMDocument3* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_preserveWhiteSpace(This,pbool);
}
static inline HRESULT IXMLDOMDocument3_put_preserveWhiteSpace(IXMLDOMDocument3* This,VARIANT_BOOL pbool) {
    return This->lpVtbl->put_preserveWhiteSpace(This,pbool);
}
static inline HRESULT IXMLDOMDocument3_put_onreadystatechange(IXMLDOMDocument3* This,VARIANT var1) {
    return This->lpVtbl->put_onreadystatechange(This,var1);
}
static inline HRESULT IXMLDOMDocument3_put_ondataavailable(IXMLDOMDocument3* This,VARIANT var1) {
    return This->lpVtbl->put_ondataavailable(This,var1);
}
static inline HRESULT IXMLDOMDocument3_put_ontransformnode(IXMLDOMDocument3* This,VARIANT var1) {
    return This->lpVtbl->put_ontransformnode(This,var1);
}
/*** IXMLDOMDocument2 methods ***/
static inline HRESULT IXMLDOMDocument3_get_namespaces(IXMLDOMDocument3* This,IXMLDOMSchemaCollection **schemaCollection) {
    return This->lpVtbl->get_namespaces(This,schemaCollection);
}
static inline HRESULT IXMLDOMDocument3_get_schemas(IXMLDOMDocument3* This,VARIANT *var1) {
    return This->lpVtbl->get_schemas(This,var1);
}
static inline HRESULT IXMLDOMDocument3_putref_schemas(IXMLDOMDocument3* This,VARIANT var1) {
    return This->lpVtbl->putref_schemas(This,var1);
}
static inline HRESULT IXMLDOMDocument3_validate(IXMLDOMDocument3* This,IXMLDOMParseError **err) {
    return This->lpVtbl->validate(This,err);
}
static inline HRESULT IXMLDOMDocument3_setProperty(IXMLDOMDocument3* This,BSTR p,VARIANT var) {
    return This->lpVtbl->setProperty(This,p,var);
}
static inline HRESULT IXMLDOMDocument3_getProperty(IXMLDOMDocument3* This,BSTR p,VARIANT *var) {
    return This->lpVtbl->getProperty(This,p,var);
}
/*** IXMLDOMDocument3 methods ***/
static inline HRESULT IXMLDOMDocument3_validateNode(IXMLDOMDocument3* This,IXMLDOMNode *node,IXMLDOMParseError **error) {
    return This->lpVtbl->validateNode(This,node,error);
}
static 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 inline HRESULT IXMLDOMNodeList_QueryInterface(IXMLDOMNodeList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMNodeList_AddRef(IXMLDOMNodeList* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMNodeList_Release(IXMLDOMNodeList* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMNodeList_GetTypeInfoCount(IXMLDOMNodeList* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMNodeList_GetTypeInfo(IXMLDOMNodeList* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMNodeList_get_item(IXMLDOMNodeList* This,LONG lIndex,IXMLDOMNode **outNode) {
    return This->lpVtbl->get_item(This,lIndex,outNode);
}
static inline HRESULT IXMLDOMNodeList_get_length(IXMLDOMNodeList* This,LONG *lLength) {
    return This->lpVtbl->get_length(This,lLength);
}
static inline HRESULT IXMLDOMNodeList_nextNode(IXMLDOMNodeList* This,IXMLDOMNode **outNode) {
    return This->lpVtbl->nextNode(This,outNode);
}
static inline HRESULT IXMLDOMNodeList_reset(IXMLDOMNodeList* This) {
    return This->lpVtbl->reset(This);
}
static 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 inline HRESULT IXMLDOMSelection_QueryInterface(IXMLDOMSelection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMSelection_AddRef(IXMLDOMSelection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMSelection_Release(IXMLDOMSelection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMSelection_GetTypeInfoCount(IXMLDOMSelection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMSelection_GetTypeInfo(IXMLDOMSelection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMSelection_get_item(IXMLDOMSelection* This,LONG lIndex,IXMLDOMNode **outNode) {
    return This->lpVtbl->get_item(This,lIndex,outNode);
}
static inline HRESULT IXMLDOMSelection_get_length(IXMLDOMSelection* This,LONG *lLength) {
    return This->lpVtbl->get_length(This,lLength);
}
static inline HRESULT IXMLDOMSelection_nextNode(IXMLDOMSelection* This,IXMLDOMNode **outNode) {
    return This->lpVtbl->nextNode(This,outNode);
}
static inline HRESULT IXMLDOMSelection_reset(IXMLDOMSelection* This) {
    return This->lpVtbl->reset(This);
}
static inline HRESULT IXMLDOMSelection_get__newEnum(IXMLDOMSelection* This,IUnknown **ppUnk) {
    return This->lpVtbl->get__newEnum(This,ppUnk);
}
/*** IXMLDOMSelection methods ***/
static inline HRESULT IXMLDOMSelection_get_expr(IXMLDOMSelection* This,BSTR *p) {
    return This->lpVtbl->get_expr(This,p);
}
static inline HRESULT IXMLDOMSelection_put_expr(IXMLDOMSelection* This,BSTR p) {
    return This->lpVtbl->put_expr(This,p);
}
static inline HRESULT IXMLDOMSelection_get_context(IXMLDOMSelection* This,IXMLDOMNode **ppNode) {
    return This->lpVtbl->get_context(This,ppNode);
}
static inline HRESULT IXMLDOMSelection_putref_context(IXMLDOMSelection* This,IXMLDOMNode *pNode) {
    return This->lpVtbl->putref_context(This,pNode);
}
static inline HRESULT IXMLDOMSelection_peekNode(IXMLDOMSelection* This,IXMLDOMNode **ppNode) {
    return This->lpVtbl->peekNode(This,ppNode);
}
static inline HRESULT IXMLDOMSelection_matches(IXMLDOMSelection* This,IXMLDOMNode *pNode,IXMLDOMNode **ppNode) {
    return This->lpVtbl->matches(This,pNode,ppNode);
}
static inline HRESULT IXMLDOMSelection_removeNext(IXMLDOMSelection* This,IXMLDOMNode **ppNode) {
    return This->lpVtbl->removeNext(This,ppNode);
}
static inline HRESULT IXMLDOMSelection_removeAll(IXMLDOMSelection* This) {
    return This->lpVtbl->removeAll(This);
}
static inline HRESULT IXMLDOMSelection_clone(IXMLDOMSelection* This,IXMLDOMSelection **ppNode) {
    return This->lpVtbl->clone(This,ppNode);
}
static inline HRESULT IXMLDOMSelection_getProperty(IXMLDOMSelection* This,BSTR p,VARIANT *var) {
    return This->lpVtbl->getProperty(This,p,var);
}
static 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 inline HRESULT IXMLDOMNamedNodeMap_QueryInterface(IXMLDOMNamedNodeMap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMNamedNodeMap_AddRef(IXMLDOMNamedNodeMap* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMNamedNodeMap_Release(IXMLDOMNamedNodeMap* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMNamedNodeMap_GetTypeInfoCount(IXMLDOMNamedNodeMap* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMNamedNodeMap_GetTypeInfo(IXMLDOMNamedNodeMap* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMNamedNodeMap_getNamedItem(IXMLDOMNamedNodeMap* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->getNamedItem(This,p,outNode);
}
static inline HRESULT IXMLDOMNamedNodeMap_setNamedItem(IXMLDOMNamedNodeMap* This,IXMLDOMNode *newNode,IXMLDOMNode **outNode) {
    return This->lpVtbl->setNamedItem(This,newNode,outNode);
}
static inline HRESULT IXMLDOMNamedNodeMap_removeNamedItem(IXMLDOMNamedNodeMap* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->removeNamedItem(This,p,outNode);
}
static inline HRESULT IXMLDOMNamedNodeMap_get_item(IXMLDOMNamedNodeMap* This,LONG lIndex,IXMLDOMNode **outNode) {
    return This->lpVtbl->get_item(This,lIndex,outNode);
}
static inline HRESULT IXMLDOMNamedNodeMap_get_length(IXMLDOMNamedNodeMap* This,LONG *lLength) {
    return This->lpVtbl->get_length(This,lLength);
}
static inline HRESULT IXMLDOMNamedNodeMap_getQualifiedItem(IXMLDOMNamedNodeMap* This,BSTR name,BSTR uri,IXMLDOMNode **outNode) {
    return This->lpVtbl->getQualifiedItem(This,name,uri,outNode);
}
static inline HRESULT IXMLDOMNamedNodeMap_removeQualifiedItem(IXMLDOMNamedNodeMap* This,BSTR name,BSTR uri,IXMLDOMNode **outNode) {
    return This->lpVtbl->removeQualifiedItem(This,name,uri,outNode);
}
static inline HRESULT IXMLDOMNamedNodeMap_nextNode(IXMLDOMNamedNodeMap* This,IXMLDOMNode **outNode) {
    return This->lpVtbl->nextNode(This,outNode);
}
static inline HRESULT IXMLDOMNamedNodeMap_reset(IXMLDOMNamedNodeMap* This) {
    return This->lpVtbl->reset(This);
}
static 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 inline HRESULT IXMLDOMDocumentFragment_QueryInterface(IXMLDOMDocumentFragment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMDocumentFragment_AddRef(IXMLDOMDocumentFragment* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMDocumentFragment_Release(IXMLDOMDocumentFragment* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMDocumentFragment_GetTypeInfoCount(IXMLDOMDocumentFragment* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMDocumentFragment_GetTypeInfo(IXMLDOMDocumentFragment* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMDocumentFragment_get_nodeName(IXMLDOMDocumentFragment* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMDocumentFragment_get_nodeValue(IXMLDOMDocumentFragment* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMDocumentFragment_put_nodeValue(IXMLDOMDocumentFragment* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMDocumentFragment_get_nodeType(IXMLDOMDocumentFragment* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMDocumentFragment_get_parentNode(IXMLDOMDocumentFragment* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMDocumentFragment_get_childNodes(IXMLDOMDocumentFragment* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMDocumentFragment_get_firstChild(IXMLDOMDocumentFragment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMDocumentFragment_get_lastChild(IXMLDOMDocumentFragment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMDocumentFragment_get_previousSibling(IXMLDOMDocumentFragment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMDocumentFragment_get_nextSibling(IXMLDOMDocumentFragment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMDocumentFragment_get_attributes(IXMLDOMDocumentFragment* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMDocumentFragment_insertBefore(IXMLDOMDocumentFragment* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMDocumentFragment_replaceChild(IXMLDOMDocumentFragment* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMDocumentFragment_removeChild(IXMLDOMDocumentFragment* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMDocumentFragment_appendChild(IXMLDOMDocumentFragment* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMDocumentFragment_hasChildNodes(IXMLDOMDocumentFragment* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMDocumentFragment_get_ownerDocument(IXMLDOMDocumentFragment* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMDocumentFragment_cloneNode(IXMLDOMDocumentFragment* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMDocumentFragment_get_nodeTypeString(IXMLDOMDocumentFragment* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMDocumentFragment_get_text(IXMLDOMDocumentFragment* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMDocumentFragment_put_text(IXMLDOMDocumentFragment* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMDocumentFragment_get_specified(IXMLDOMDocumentFragment* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMDocumentFragment_get_definition(IXMLDOMDocumentFragment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMDocumentFragment_get_nodeTypedValue(IXMLDOMDocumentFragment* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMDocumentFragment_put_nodeTypedValue(IXMLDOMDocumentFragment* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMDocumentFragment_get_dataType(IXMLDOMDocumentFragment* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMDocumentFragment_put_dataType(IXMLDOMDocumentFragment* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMDocumentFragment_get_xml(IXMLDOMDocumentFragment* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMDocumentFragment_transformNode(IXMLDOMDocumentFragment* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMDocumentFragment_selectNodes(IXMLDOMDocumentFragment* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMDocumentFragment_selectSingleNode(IXMLDOMDocumentFragment* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMDocumentFragment_get_parsed(IXMLDOMDocumentFragment* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMDocumentFragment_get_namespaceURI(IXMLDOMDocumentFragment* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMDocumentFragment_get_prefix(IXMLDOMDocumentFragment* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMDocumentFragment_get_baseName(IXMLDOMDocumentFragment* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static 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 inline HRESULT IXMLDOMCharacterData_QueryInterface(IXMLDOMCharacterData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMCharacterData_AddRef(IXMLDOMCharacterData* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMCharacterData_Release(IXMLDOMCharacterData* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMCharacterData_GetTypeInfoCount(IXMLDOMCharacterData* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMCharacterData_GetTypeInfo(IXMLDOMCharacterData* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMCharacterData_get_nodeName(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMCharacterData_get_nodeValue(IXMLDOMCharacterData* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMCharacterData_put_nodeValue(IXMLDOMCharacterData* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMCharacterData_get_nodeType(IXMLDOMCharacterData* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMCharacterData_get_parentNode(IXMLDOMCharacterData* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMCharacterData_get_childNodes(IXMLDOMCharacterData* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMCharacterData_get_firstChild(IXMLDOMCharacterData* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMCharacterData_get_lastChild(IXMLDOMCharacterData* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMCharacterData_get_previousSibling(IXMLDOMCharacterData* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMCharacterData_get_nextSibling(IXMLDOMCharacterData* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMCharacterData_get_attributes(IXMLDOMCharacterData* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMCharacterData_insertBefore(IXMLDOMCharacterData* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMCharacterData_replaceChild(IXMLDOMCharacterData* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMCharacterData_removeChild(IXMLDOMCharacterData* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMCharacterData_appendChild(IXMLDOMCharacterData* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMCharacterData_hasChildNodes(IXMLDOMCharacterData* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMCharacterData_get_ownerDocument(IXMLDOMCharacterData* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMCharacterData_cloneNode(IXMLDOMCharacterData* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMCharacterData_get_nodeTypeString(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMCharacterData_get_text(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMCharacterData_put_text(IXMLDOMCharacterData* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMCharacterData_get_specified(IXMLDOMCharacterData* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMCharacterData_get_definition(IXMLDOMCharacterData* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMCharacterData_get_nodeTypedValue(IXMLDOMCharacterData* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMCharacterData_put_nodeTypedValue(IXMLDOMCharacterData* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMCharacterData_get_dataType(IXMLDOMCharacterData* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMCharacterData_put_dataType(IXMLDOMCharacterData* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMCharacterData_get_xml(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMCharacterData_transformNode(IXMLDOMCharacterData* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMCharacterData_selectNodes(IXMLDOMCharacterData* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMCharacterData_selectSingleNode(IXMLDOMCharacterData* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMCharacterData_get_parsed(IXMLDOMCharacterData* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMCharacterData_get_namespaceURI(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMCharacterData_get_prefix(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMCharacterData_get_baseName(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static inline HRESULT IXMLDOMCharacterData_transformNodeToObject(IXMLDOMCharacterData* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMCharacterData methods ***/
static inline HRESULT IXMLDOMCharacterData_get_data(IXMLDOMCharacterData* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static inline HRESULT IXMLDOMCharacterData_put_data(IXMLDOMCharacterData* This,BSTR data) {
    return This->lpVtbl->put_data(This,data);
}
static inline HRESULT IXMLDOMCharacterData_get_length(IXMLDOMCharacterData* This,LONG *len) {
    return This->lpVtbl->get_length(This,len);
}
static inline HRESULT IXMLDOMCharacterData_substringData(IXMLDOMCharacterData* This,LONG offset,LONG count,BSTR *p) {
    return This->lpVtbl->substringData(This,offset,count,p);
}
static inline HRESULT IXMLDOMCharacterData_appendData(IXMLDOMCharacterData* This,BSTR p) {
    return This->lpVtbl->appendData(This,p);
}
static inline HRESULT IXMLDOMCharacterData_insertData(IXMLDOMCharacterData* This,LONG offset,BSTR p) {
    return This->lpVtbl->insertData(This,offset,p);
}
static inline HRESULT IXMLDOMCharacterData_deleteData(IXMLDOMCharacterData* This,LONG offset,LONG count) {
    return This->lpVtbl->deleteData(This,offset,count);
}
static 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 inline HRESULT IXMLDOMAttribute_QueryInterface(IXMLDOMAttribute* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMAttribute_AddRef(IXMLDOMAttribute* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMAttribute_Release(IXMLDOMAttribute* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMAttribute_GetTypeInfoCount(IXMLDOMAttribute* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMAttribute_GetTypeInfo(IXMLDOMAttribute* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMAttribute_get_nodeName(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMAttribute_get_nodeValue(IXMLDOMAttribute* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMAttribute_put_nodeValue(IXMLDOMAttribute* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMAttribute_get_nodeType(IXMLDOMAttribute* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMAttribute_get_parentNode(IXMLDOMAttribute* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMAttribute_get_childNodes(IXMLDOMAttribute* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMAttribute_get_firstChild(IXMLDOMAttribute* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMAttribute_get_lastChild(IXMLDOMAttribute* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMAttribute_get_previousSibling(IXMLDOMAttribute* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMAttribute_get_nextSibling(IXMLDOMAttribute* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMAttribute_get_attributes(IXMLDOMAttribute* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMAttribute_insertBefore(IXMLDOMAttribute* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMAttribute_replaceChild(IXMLDOMAttribute* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMAttribute_removeChild(IXMLDOMAttribute* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMAttribute_appendChild(IXMLDOMAttribute* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMAttribute_hasChildNodes(IXMLDOMAttribute* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMAttribute_get_ownerDocument(IXMLDOMAttribute* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMAttribute_cloneNode(IXMLDOMAttribute* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMAttribute_get_nodeTypeString(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMAttribute_get_text(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMAttribute_put_text(IXMLDOMAttribute* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMAttribute_get_specified(IXMLDOMAttribute* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMAttribute_get_definition(IXMLDOMAttribute* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMAttribute_get_nodeTypedValue(IXMLDOMAttribute* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMAttribute_put_nodeTypedValue(IXMLDOMAttribute* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMAttribute_get_dataType(IXMLDOMAttribute* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMAttribute_put_dataType(IXMLDOMAttribute* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMAttribute_get_xml(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMAttribute_transformNode(IXMLDOMAttribute* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMAttribute_selectNodes(IXMLDOMAttribute* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMAttribute_selectSingleNode(IXMLDOMAttribute* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMAttribute_get_parsed(IXMLDOMAttribute* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMAttribute_get_namespaceURI(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMAttribute_get_prefix(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMAttribute_get_baseName(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static inline HRESULT IXMLDOMAttribute_transformNodeToObject(IXMLDOMAttribute* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMAttribute methods ***/
static inline HRESULT IXMLDOMAttribute_get_name(IXMLDOMAttribute* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static inline HRESULT IXMLDOMAttribute_get_value(IXMLDOMAttribute* This,VARIANT *var1) {
    return This->lpVtbl->get_value(This,var1);
}
static 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 inline HRESULT IXMLDOMElement_QueryInterface(IXMLDOMElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMElement_AddRef(IXMLDOMElement* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMElement_Release(IXMLDOMElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMElement_GetTypeInfoCount(IXMLDOMElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMElement_GetTypeInfo(IXMLDOMElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMElement_get_nodeName(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMElement_get_nodeValue(IXMLDOMElement* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMElement_put_nodeValue(IXMLDOMElement* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMElement_get_nodeType(IXMLDOMElement* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMElement_get_parentNode(IXMLDOMElement* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMElement_get_childNodes(IXMLDOMElement* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMElement_get_firstChild(IXMLDOMElement* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMElement_get_lastChild(IXMLDOMElement* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMElement_get_previousSibling(IXMLDOMElement* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMElement_get_nextSibling(IXMLDOMElement* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMElement_get_attributes(IXMLDOMElement* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMElement_insertBefore(IXMLDOMElement* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMElement_replaceChild(IXMLDOMElement* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMElement_removeChild(IXMLDOMElement* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMElement_appendChild(IXMLDOMElement* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMElement_hasChildNodes(IXMLDOMElement* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMElement_get_ownerDocument(IXMLDOMElement* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMElement_cloneNode(IXMLDOMElement* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMElement_get_nodeTypeString(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMElement_get_text(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMElement_put_text(IXMLDOMElement* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMElement_get_specified(IXMLDOMElement* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMElement_get_definition(IXMLDOMElement* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMElement_get_nodeTypedValue(IXMLDOMElement* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMElement_put_nodeTypedValue(IXMLDOMElement* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMElement_get_dataType(IXMLDOMElement* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMElement_put_dataType(IXMLDOMElement* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMElement_get_xml(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMElement_transformNode(IXMLDOMElement* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMElement_selectNodes(IXMLDOMElement* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMElement_selectSingleNode(IXMLDOMElement* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMElement_get_parsed(IXMLDOMElement* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMElement_get_namespaceURI(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMElement_get_prefix(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMElement_get_baseName(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static inline HRESULT IXMLDOMElement_transformNodeToObject(IXMLDOMElement* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMElement methods ***/
static inline HRESULT IXMLDOMElement_get_tagName(IXMLDOMElement* This,BSTR *p) {
    return This->lpVtbl->get_tagName(This,p);
}
static inline HRESULT IXMLDOMElement_getAttribute(IXMLDOMElement* This,BSTR p,VARIANT *var) {
    return This->lpVtbl->getAttribute(This,p,var);
}
static inline HRESULT IXMLDOMElement_setAttribute(IXMLDOMElement* This,BSTR p,VARIANT var) {
    return This->lpVtbl->setAttribute(This,p,var);
}
static inline HRESULT IXMLDOMElement_removeAttribute(IXMLDOMElement* This,BSTR p) {
    return This->lpVtbl->removeAttribute(This,p);
}
static inline HRESULT IXMLDOMElement_getAttributeNode(IXMLDOMElement* This,BSTR p,IXMLDOMAttribute **attributeNode) {
    return This->lpVtbl->getAttributeNode(This,p,attributeNode);
}
static inline HRESULT IXMLDOMElement_setAttributeNode(IXMLDOMElement* This,IXMLDOMAttribute *domAttribute,IXMLDOMAttribute **attributeNode) {
    return This->lpVtbl->setAttributeNode(This,domAttribute,attributeNode);
}
static inline HRESULT IXMLDOMElement_removeAttributeNode(IXMLDOMElement* This,IXMLDOMAttribute *domAttribute,IXMLDOMAttribute **attributeNode) {
    return This->lpVtbl->removeAttributeNode(This,domAttribute,attributeNode);
}
static inline HRESULT IXMLDOMElement_getElementsByTagName(IXMLDOMElement* This,BSTR p,IXMLDOMNodeList **resultList) {
    return This->lpVtbl->getElementsByTagName(This,p,resultList);
}
static 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 inline HRESULT IXMLDOMText_QueryInterface(IXMLDOMText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMText_AddRef(IXMLDOMText* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMText_Release(IXMLDOMText* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMText_GetTypeInfoCount(IXMLDOMText* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMText_GetTypeInfo(IXMLDOMText* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMText_get_nodeName(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMText_get_nodeValue(IXMLDOMText* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMText_put_nodeValue(IXMLDOMText* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMText_get_nodeType(IXMLDOMText* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMText_get_parentNode(IXMLDOMText* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMText_get_childNodes(IXMLDOMText* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMText_get_firstChild(IXMLDOMText* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMText_get_lastChild(IXMLDOMText* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMText_get_previousSibling(IXMLDOMText* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMText_get_nextSibling(IXMLDOMText* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMText_get_attributes(IXMLDOMText* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMText_insertBefore(IXMLDOMText* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMText_replaceChild(IXMLDOMText* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMText_removeChild(IXMLDOMText* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMText_appendChild(IXMLDOMText* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMText_hasChildNodes(IXMLDOMText* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMText_get_ownerDocument(IXMLDOMText* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMText_cloneNode(IXMLDOMText* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMText_get_nodeTypeString(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMText_get_text(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMText_put_text(IXMLDOMText* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMText_get_specified(IXMLDOMText* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMText_get_definition(IXMLDOMText* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMText_get_nodeTypedValue(IXMLDOMText* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMText_put_nodeTypedValue(IXMLDOMText* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMText_get_dataType(IXMLDOMText* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMText_put_dataType(IXMLDOMText* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMText_get_xml(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMText_transformNode(IXMLDOMText* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMText_selectNodes(IXMLDOMText* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMText_selectSingleNode(IXMLDOMText* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMText_get_parsed(IXMLDOMText* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMText_get_namespaceURI(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMText_get_prefix(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMText_get_baseName(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static inline HRESULT IXMLDOMText_transformNodeToObject(IXMLDOMText* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMCharacterData methods ***/
static inline HRESULT IXMLDOMText_get_data(IXMLDOMText* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static inline HRESULT IXMLDOMText_put_data(IXMLDOMText* This,BSTR data) {
    return This->lpVtbl->put_data(This,data);
}
static inline HRESULT IXMLDOMText_get_length(IXMLDOMText* This,LONG *len) {
    return This->lpVtbl->get_length(This,len);
}
static inline HRESULT IXMLDOMText_substringData(IXMLDOMText* This,LONG offset,LONG count,BSTR *p) {
    return This->lpVtbl->substringData(This,offset,count,p);
}
static inline HRESULT IXMLDOMText_appendData(IXMLDOMText* This,BSTR p) {
    return This->lpVtbl->appendData(This,p);
}
static inline HRESULT IXMLDOMText_insertData(IXMLDOMText* This,LONG offset,BSTR p) {
    return This->lpVtbl->insertData(This,offset,p);
}
static inline HRESULT IXMLDOMText_deleteData(IXMLDOMText* This,LONG offset,LONG count) {
    return This->lpVtbl->deleteData(This,offset,count);
}
static inline HRESULT IXMLDOMText_replaceData(IXMLDOMText* This,LONG offset,LONG count,BSTR p) {
    return This->lpVtbl->replaceData(This,offset,count,p);
}
/*** IXMLDOMText methods ***/
static 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 inline HRESULT IXMLDOMComment_QueryInterface(IXMLDOMComment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMComment_AddRef(IXMLDOMComment* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMComment_Release(IXMLDOMComment* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMComment_GetTypeInfoCount(IXMLDOMComment* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMComment_GetTypeInfo(IXMLDOMComment* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMComment_get_nodeName(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMComment_get_nodeValue(IXMLDOMComment* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMComment_put_nodeValue(IXMLDOMComment* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMComment_get_nodeType(IXMLDOMComment* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMComment_get_parentNode(IXMLDOMComment* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMComment_get_childNodes(IXMLDOMComment* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMComment_get_firstChild(IXMLDOMComment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMComment_get_lastChild(IXMLDOMComment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMComment_get_previousSibling(IXMLDOMComment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMComment_get_nextSibling(IXMLDOMComment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMComment_get_attributes(IXMLDOMComment* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMComment_insertBefore(IXMLDOMComment* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMComment_replaceChild(IXMLDOMComment* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMComment_removeChild(IXMLDOMComment* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMComment_appendChild(IXMLDOMComment* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMComment_hasChildNodes(IXMLDOMComment* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMComment_get_ownerDocument(IXMLDOMComment* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMComment_cloneNode(IXMLDOMComment* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMComment_get_nodeTypeString(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMComment_get_text(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMComment_put_text(IXMLDOMComment* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMComment_get_specified(IXMLDOMComment* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMComment_get_definition(IXMLDOMComment* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMComment_get_nodeTypedValue(IXMLDOMComment* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMComment_put_nodeTypedValue(IXMLDOMComment* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMComment_get_dataType(IXMLDOMComment* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMComment_put_dataType(IXMLDOMComment* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMComment_get_xml(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMComment_transformNode(IXMLDOMComment* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMComment_selectNodes(IXMLDOMComment* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMComment_selectSingleNode(IXMLDOMComment* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMComment_get_parsed(IXMLDOMComment* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMComment_get_namespaceURI(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMComment_get_prefix(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMComment_get_baseName(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static inline HRESULT IXMLDOMComment_transformNodeToObject(IXMLDOMComment* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMCharacterData methods ***/
static inline HRESULT IXMLDOMComment_get_data(IXMLDOMComment* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static inline HRESULT IXMLDOMComment_put_data(IXMLDOMComment* This,BSTR data) {
    return This->lpVtbl->put_data(This,data);
}
static inline HRESULT IXMLDOMComment_get_length(IXMLDOMComment* This,LONG *len) {
    return This->lpVtbl->get_length(This,len);
}
static inline HRESULT IXMLDOMComment_substringData(IXMLDOMComment* This,LONG offset,LONG count,BSTR *p) {
    return This->lpVtbl->substringData(This,offset,count,p);
}
static inline HRESULT IXMLDOMComment_appendData(IXMLDOMComment* This,BSTR p) {
    return This->lpVtbl->appendData(This,p);
}
static inline HRESULT IXMLDOMComment_insertData(IXMLDOMComment* This,LONG offset,BSTR p) {
    return This->lpVtbl->insertData(This,offset,p);
}
static inline HRESULT IXMLDOMComment_deleteData(IXMLDOMComment* This,LONG offset,LONG count) {
    return This->lpVtbl->deleteData(This,offset,count);
}
static 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 inline HRESULT IXMLDOMProcessingInstruction_QueryInterface(IXMLDOMProcessingInstruction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMProcessingInstruction_AddRef(IXMLDOMProcessingInstruction* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMProcessingInstruction_Release(IXMLDOMProcessingInstruction* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMProcessingInstruction_GetTypeInfoCount(IXMLDOMProcessingInstruction* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMProcessingInstruction_GetTypeInfo(IXMLDOMProcessingInstruction* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMProcessingInstruction_get_nodeName(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_nodeValue(IXMLDOMProcessingInstruction* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMProcessingInstruction_put_nodeValue(IXMLDOMProcessingInstruction* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_nodeType(IXMLDOMProcessingInstruction* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_parentNode(IXMLDOMProcessingInstruction* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_childNodes(IXMLDOMProcessingInstruction* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_firstChild(IXMLDOMProcessingInstruction* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_lastChild(IXMLDOMProcessingInstruction* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_previousSibling(IXMLDOMProcessingInstruction* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_nextSibling(IXMLDOMProcessingInstruction* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_attributes(IXMLDOMProcessingInstruction* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMProcessingInstruction_insertBefore(IXMLDOMProcessingInstruction* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMProcessingInstruction_replaceChild(IXMLDOMProcessingInstruction* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMProcessingInstruction_removeChild(IXMLDOMProcessingInstruction* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMProcessingInstruction_appendChild(IXMLDOMProcessingInstruction* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMProcessingInstruction_hasChildNodes(IXMLDOMProcessingInstruction* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_ownerDocument(IXMLDOMProcessingInstruction* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMProcessingInstruction_cloneNode(IXMLDOMProcessingInstruction* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_nodeTypeString(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_text(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMProcessingInstruction_put_text(IXMLDOMProcessingInstruction* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_specified(IXMLDOMProcessingInstruction* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_definition(IXMLDOMProcessingInstruction* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_nodeTypedValue(IXMLDOMProcessingInstruction* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMProcessingInstruction_put_nodeTypedValue(IXMLDOMProcessingInstruction* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_dataType(IXMLDOMProcessingInstruction* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMProcessingInstruction_put_dataType(IXMLDOMProcessingInstruction* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_xml(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMProcessingInstruction_transformNode(IXMLDOMProcessingInstruction* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMProcessingInstruction_selectNodes(IXMLDOMProcessingInstruction* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMProcessingInstruction_selectSingleNode(IXMLDOMProcessingInstruction* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_parsed(IXMLDOMProcessingInstruction* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_namespaceURI(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_prefix(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_baseName(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static inline HRESULT IXMLDOMProcessingInstruction_transformNodeToObject(IXMLDOMProcessingInstruction* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMProcessingInstruction methods ***/
static inline HRESULT IXMLDOMProcessingInstruction_get_target(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_target(This,p);
}
static inline HRESULT IXMLDOMProcessingInstruction_get_data(IXMLDOMProcessingInstruction* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static 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 inline HRESULT IXMLDOMCDATASection_QueryInterface(IXMLDOMCDATASection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMCDATASection_AddRef(IXMLDOMCDATASection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMCDATASection_Release(IXMLDOMCDATASection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMCDATASection_GetTypeInfoCount(IXMLDOMCDATASection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMCDATASection_GetTypeInfo(IXMLDOMCDATASection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMCDATASection_get_nodeName(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMCDATASection_get_nodeValue(IXMLDOMCDATASection* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMCDATASection_put_nodeValue(IXMLDOMCDATASection* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMCDATASection_get_nodeType(IXMLDOMCDATASection* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMCDATASection_get_parentNode(IXMLDOMCDATASection* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMCDATASection_get_childNodes(IXMLDOMCDATASection* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMCDATASection_get_firstChild(IXMLDOMCDATASection* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMCDATASection_get_lastChild(IXMLDOMCDATASection* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMCDATASection_get_previousSibling(IXMLDOMCDATASection* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMCDATASection_get_nextSibling(IXMLDOMCDATASection* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMCDATASection_get_attributes(IXMLDOMCDATASection* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMCDATASection_insertBefore(IXMLDOMCDATASection* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMCDATASection_replaceChild(IXMLDOMCDATASection* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMCDATASection_removeChild(IXMLDOMCDATASection* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMCDATASection_appendChild(IXMLDOMCDATASection* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMCDATASection_hasChildNodes(IXMLDOMCDATASection* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMCDATASection_get_ownerDocument(IXMLDOMCDATASection* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMCDATASection_cloneNode(IXMLDOMCDATASection* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMCDATASection_get_nodeTypeString(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMCDATASection_get_text(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMCDATASection_put_text(IXMLDOMCDATASection* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMCDATASection_get_specified(IXMLDOMCDATASection* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMCDATASection_get_definition(IXMLDOMCDATASection* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMCDATASection_get_nodeTypedValue(IXMLDOMCDATASection* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMCDATASection_put_nodeTypedValue(IXMLDOMCDATASection* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMCDATASection_get_dataType(IXMLDOMCDATASection* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMCDATASection_put_dataType(IXMLDOMCDATASection* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMCDATASection_get_xml(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMCDATASection_transformNode(IXMLDOMCDATASection* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMCDATASection_selectNodes(IXMLDOMCDATASection* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMCDATASection_selectSingleNode(IXMLDOMCDATASection* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMCDATASection_get_parsed(IXMLDOMCDATASection* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMCDATASection_get_namespaceURI(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMCDATASection_get_prefix(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMCDATASection_get_baseName(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static inline HRESULT IXMLDOMCDATASection_transformNodeToObject(IXMLDOMCDATASection* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMCharacterData methods ***/
static inline HRESULT IXMLDOMCDATASection_get_data(IXMLDOMCDATASection* This,BSTR *p) {
    return This->lpVtbl->get_data(This,p);
}
static inline HRESULT IXMLDOMCDATASection_put_data(IXMLDOMCDATASection* This,BSTR data) {
    return This->lpVtbl->put_data(This,data);
}
static inline HRESULT IXMLDOMCDATASection_get_length(IXMLDOMCDATASection* This,LONG *len) {
    return This->lpVtbl->get_length(This,len);
}
static inline HRESULT IXMLDOMCDATASection_substringData(IXMLDOMCDATASection* This,LONG offset,LONG count,BSTR *p) {
    return This->lpVtbl->substringData(This,offset,count,p);
}
static inline HRESULT IXMLDOMCDATASection_appendData(IXMLDOMCDATASection* This,BSTR p) {
    return This->lpVtbl->appendData(This,p);
}
static inline HRESULT IXMLDOMCDATASection_insertData(IXMLDOMCDATASection* This,LONG offset,BSTR p) {
    return This->lpVtbl->insertData(This,offset,p);
}
static inline HRESULT IXMLDOMCDATASection_deleteData(IXMLDOMCDATASection* This,LONG offset,LONG count) {
    return This->lpVtbl->deleteData(This,offset,count);
}
static inline HRESULT IXMLDOMCDATASection_replaceData(IXMLDOMCDATASection* This,LONG offset,LONG count,BSTR p) {
    return This->lpVtbl->replaceData(This,offset,count,p);
}
/*** IXMLDOMText methods ***/
static 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 inline HRESULT IXMLDOMDocumentType_QueryInterface(IXMLDOMDocumentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMDocumentType_AddRef(IXMLDOMDocumentType* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMDocumentType_Release(IXMLDOMDocumentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMDocumentType_GetTypeInfoCount(IXMLDOMDocumentType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMDocumentType_GetTypeInfo(IXMLDOMDocumentType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMDocumentType_get_nodeName(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMDocumentType_get_nodeValue(IXMLDOMDocumentType* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMDocumentType_put_nodeValue(IXMLDOMDocumentType* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMDocumentType_get_nodeType(IXMLDOMDocumentType* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMDocumentType_get_parentNode(IXMLDOMDocumentType* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMDocumentType_get_childNodes(IXMLDOMDocumentType* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMDocumentType_get_firstChild(IXMLDOMDocumentType* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMDocumentType_get_lastChild(IXMLDOMDocumentType* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMDocumentType_get_previousSibling(IXMLDOMDocumentType* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMDocumentType_get_nextSibling(IXMLDOMDocumentType* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMDocumentType_get_attributes(IXMLDOMDocumentType* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMDocumentType_insertBefore(IXMLDOMDocumentType* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMDocumentType_replaceChild(IXMLDOMDocumentType* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMDocumentType_removeChild(IXMLDOMDocumentType* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMDocumentType_appendChild(IXMLDOMDocumentType* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMDocumentType_hasChildNodes(IXMLDOMDocumentType* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMDocumentType_get_ownerDocument(IXMLDOMDocumentType* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMDocumentType_cloneNode(IXMLDOMDocumentType* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMDocumentType_get_nodeTypeString(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMDocumentType_get_text(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMDocumentType_put_text(IXMLDOMDocumentType* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMDocumentType_get_specified(IXMLDOMDocumentType* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMDocumentType_get_definition(IXMLDOMDocumentType* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMDocumentType_get_nodeTypedValue(IXMLDOMDocumentType* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMDocumentType_put_nodeTypedValue(IXMLDOMDocumentType* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMDocumentType_get_dataType(IXMLDOMDocumentType* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMDocumentType_put_dataType(IXMLDOMDocumentType* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMDocumentType_get_xml(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMDocumentType_transformNode(IXMLDOMDocumentType* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMDocumentType_selectNodes(IXMLDOMDocumentType* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMDocumentType_selectSingleNode(IXMLDOMDocumentType* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMDocumentType_get_parsed(IXMLDOMDocumentType* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMDocumentType_get_namespaceURI(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMDocumentType_get_prefix(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMDocumentType_get_baseName(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static inline HRESULT IXMLDOMDocumentType_transformNodeToObject(IXMLDOMDocumentType* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMDocumentType methods ***/
static inline HRESULT IXMLDOMDocumentType_get_name(IXMLDOMDocumentType* This,BSTR *p) {
    return This->lpVtbl->get_name(This,p);
}
static inline HRESULT IXMLDOMDocumentType_get_entities(IXMLDOMDocumentType* This,IXMLDOMNamedNodeMap **entityMap) {
    return This->lpVtbl->get_entities(This,entityMap);
}
static 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 inline HRESULT IXMLDOMNotation_QueryInterface(IXMLDOMNotation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMNotation_AddRef(IXMLDOMNotation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMNotation_Release(IXMLDOMNotation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMNotation_GetTypeInfoCount(IXMLDOMNotation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMNotation_GetTypeInfo(IXMLDOMNotation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMNotation_get_nodeName(IXMLDOMNotation* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMNotation_get_nodeValue(IXMLDOMNotation* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMNotation_put_nodeValue(IXMLDOMNotation* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMNotation_get_nodeType(IXMLDOMNotation* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMNotation_get_parentNode(IXMLDOMNotation* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMNotation_get_childNodes(IXMLDOMNotation* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMNotation_get_firstChild(IXMLDOMNotation* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMNotation_get_lastChild(IXMLDOMNotation* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMNotation_get_previousSibling(IXMLDOMNotation* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMNotation_get_nextSibling(IXMLDOMNotation* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMNotation_get_attributes(IXMLDOMNotation* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMNotation_insertBefore(IXMLDOMNotation* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMNotation_replaceChild(IXMLDOMNotation* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMNotation_removeChild(IXMLDOMNotation* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMNotation_appendChild(IXMLDOMNotation* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMNotation_hasChildNodes(IXMLDOMNotation* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMNotation_get_ownerDocument(IXMLDOMNotation* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMNotation_cloneNode(IXMLDOMNotation* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMNotation_get_nodeTypeString(IXMLDOMNotation* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMNotation_get_text(IXMLDOMNotation* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMNotation_put_text(IXMLDOMNotation* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMNotation_get_specified(IXMLDOMNotation* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMNotation_get_definition(IXMLDOMNotation* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMNotation_get_nodeTypedValue(IXMLDOMNotation* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMNotation_put_nodeTypedValue(IXMLDOMNotation* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMNotation_get_dataType(IXMLDOMNotation* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMNotation_put_dataType(IXMLDOMNotation* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMNotation_get_xml(IXMLDOMNotation* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMNotation_transformNode(IXMLDOMNotation* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMNotation_selectNodes(IXMLDOMNotation* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMNotation_selectSingleNode(IXMLDOMNotation* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMNotation_get_parsed(IXMLDOMNotation* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMNotation_get_namespaceURI(IXMLDOMNotation* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMNotation_get_prefix(IXMLDOMNotation* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMNotation_get_baseName(IXMLDOMNotation* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static inline HRESULT IXMLDOMNotation_transformNodeToObject(IXMLDOMNotation* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMNotation methods ***/
static inline HRESULT IXMLDOMNotation_get_publicId(IXMLDOMNotation* This,VARIANT *id) {
    return This->lpVtbl->get_publicId(This,id);
}
static 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 inline HRESULT IXMLDOMEntity_QueryInterface(IXMLDOMEntity* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMEntity_AddRef(IXMLDOMEntity* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMEntity_Release(IXMLDOMEntity* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMEntity_GetTypeInfoCount(IXMLDOMEntity* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMEntity_GetTypeInfo(IXMLDOMEntity* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMEntity_get_nodeName(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMEntity_get_nodeValue(IXMLDOMEntity* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMEntity_put_nodeValue(IXMLDOMEntity* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMEntity_get_nodeType(IXMLDOMEntity* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMEntity_get_parentNode(IXMLDOMEntity* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMEntity_get_childNodes(IXMLDOMEntity* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMEntity_get_firstChild(IXMLDOMEntity* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMEntity_get_lastChild(IXMLDOMEntity* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMEntity_get_previousSibling(IXMLDOMEntity* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMEntity_get_nextSibling(IXMLDOMEntity* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMEntity_get_attributes(IXMLDOMEntity* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMEntity_insertBefore(IXMLDOMEntity* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMEntity_replaceChild(IXMLDOMEntity* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMEntity_removeChild(IXMLDOMEntity* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMEntity_appendChild(IXMLDOMEntity* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMEntity_hasChildNodes(IXMLDOMEntity* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMEntity_get_ownerDocument(IXMLDOMEntity* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMEntity_cloneNode(IXMLDOMEntity* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMEntity_get_nodeTypeString(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMEntity_get_text(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMEntity_put_text(IXMLDOMEntity* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMEntity_get_specified(IXMLDOMEntity* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMEntity_get_definition(IXMLDOMEntity* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMEntity_get_nodeTypedValue(IXMLDOMEntity* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMEntity_put_nodeTypedValue(IXMLDOMEntity* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMEntity_get_dataType(IXMLDOMEntity* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMEntity_put_dataType(IXMLDOMEntity* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMEntity_get_xml(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMEntity_transformNode(IXMLDOMEntity* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMEntity_selectNodes(IXMLDOMEntity* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMEntity_selectSingleNode(IXMLDOMEntity* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMEntity_get_parsed(IXMLDOMEntity* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMEntity_get_namespaceURI(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMEntity_get_prefix(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMEntity_get_baseName(IXMLDOMEntity* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static inline HRESULT IXMLDOMEntity_transformNodeToObject(IXMLDOMEntity* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXMLDOMEntity methods ***/
static inline HRESULT IXMLDOMEntity_get_publicId(IXMLDOMEntity* This,VARIANT *id1) {
    return This->lpVtbl->get_publicId(This,id1);
}
static inline HRESULT IXMLDOMEntity_get_systemId(IXMLDOMEntity* This,VARIANT *id1) {
    return This->lpVtbl->get_systemId(This,id1);
}
static 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 inline HRESULT IXMLDOMEntityReference_QueryInterface(IXMLDOMEntityReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMEntityReference_AddRef(IXMLDOMEntityReference* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMEntityReference_Release(IXMLDOMEntityReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMEntityReference_GetTypeInfoCount(IXMLDOMEntityReference* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMEntityReference_GetTypeInfo(IXMLDOMEntityReference* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMEntityReference_get_nodeName(IXMLDOMEntityReference* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXMLDOMEntityReference_get_nodeValue(IXMLDOMEntityReference* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMEntityReference_put_nodeValue(IXMLDOMEntityReference* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXMLDOMEntityReference_get_nodeType(IXMLDOMEntityReference* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXMLDOMEntityReference_get_parentNode(IXMLDOMEntityReference* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXMLDOMEntityReference_get_childNodes(IXMLDOMEntityReference* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXMLDOMEntityReference_get_firstChild(IXMLDOMEntityReference* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXMLDOMEntityReference_get_lastChild(IXMLDOMEntityReference* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXMLDOMEntityReference_get_previousSibling(IXMLDOMEntityReference* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXMLDOMEntityReference_get_nextSibling(IXMLDOMEntityReference* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXMLDOMEntityReference_get_attributes(IXMLDOMEntityReference* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXMLDOMEntityReference_insertBefore(IXMLDOMEntityReference* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXMLDOMEntityReference_replaceChild(IXMLDOMEntityReference* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXMLDOMEntityReference_removeChild(IXMLDOMEntityReference* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXMLDOMEntityReference_appendChild(IXMLDOMEntityReference* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXMLDOMEntityReference_hasChildNodes(IXMLDOMEntityReference* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXMLDOMEntityReference_get_ownerDocument(IXMLDOMEntityReference* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXMLDOMEntityReference_cloneNode(IXMLDOMEntityReference* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXMLDOMEntityReference_get_nodeTypeString(IXMLDOMEntityReference* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXMLDOMEntityReference_get_text(IXMLDOMEntityReference* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXMLDOMEntityReference_put_text(IXMLDOMEntityReference* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXMLDOMEntityReference_get_specified(IXMLDOMEntityReference* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXMLDOMEntityReference_get_definition(IXMLDOMEntityReference* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXMLDOMEntityReference_get_nodeTypedValue(IXMLDOMEntityReference* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMEntityReference_put_nodeTypedValue(IXMLDOMEntityReference* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXMLDOMEntityReference_get_dataType(IXMLDOMEntityReference* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXMLDOMEntityReference_put_dataType(IXMLDOMEntityReference* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXMLDOMEntityReference_get_xml(IXMLDOMEntityReference* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXMLDOMEntityReference_transformNode(IXMLDOMEntityReference* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXMLDOMEntityReference_selectNodes(IXMLDOMEntityReference* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXMLDOMEntityReference_selectSingleNode(IXMLDOMEntityReference* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXMLDOMEntityReference_get_parsed(IXMLDOMEntityReference* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXMLDOMEntityReference_get_namespaceURI(IXMLDOMEntityReference* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXMLDOMEntityReference_get_prefix(IXMLDOMEntityReference* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXMLDOMEntityReference_get_baseName(IXMLDOMEntityReference* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static 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 inline HRESULT IXMLDOMImplementation_QueryInterface(IXMLDOMImplementation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMImplementation_AddRef(IXMLDOMImplementation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMImplementation_Release(IXMLDOMImplementation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMImplementation_GetTypeInfoCount(IXMLDOMImplementation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMImplementation_GetTypeInfo(IXMLDOMImplementation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 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 inline HRESULT IXTLRuntime_QueryInterface(IXTLRuntime* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXTLRuntime_AddRef(IXTLRuntime* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXTLRuntime_Release(IXTLRuntime* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXTLRuntime_GetTypeInfoCount(IXTLRuntime* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXTLRuntime_GetTypeInfo(IXTLRuntime* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXTLRuntime_get_nodeName(IXTLRuntime* This,BSTR *p) {
    return This->lpVtbl->get_nodeName(This,p);
}
static inline HRESULT IXTLRuntime_get_nodeValue(IXTLRuntime* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeValue(This,var1);
}
static inline HRESULT IXTLRuntime_put_nodeValue(IXTLRuntime* This,VARIANT var1) {
    return This->lpVtbl->put_nodeValue(This,var1);
}
static inline HRESULT IXTLRuntime_get_nodeType(IXTLRuntime* This,DOMNodeType *domNodeType) {
    return This->lpVtbl->get_nodeType(This,domNodeType);
}
static inline HRESULT IXTLRuntime_get_parentNode(IXTLRuntime* This,IXMLDOMNode **parent) {
    return This->lpVtbl->get_parentNode(This,parent);
}
static inline HRESULT IXTLRuntime_get_childNodes(IXTLRuntime* This,IXMLDOMNodeList **outList) {
    return This->lpVtbl->get_childNodes(This,outList);
}
static inline HRESULT IXTLRuntime_get_firstChild(IXTLRuntime* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_firstChild(This,domNode);
}
static inline HRESULT IXTLRuntime_get_lastChild(IXTLRuntime* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_lastChild(This,domNode);
}
static inline HRESULT IXTLRuntime_get_previousSibling(IXTLRuntime* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_previousSibling(This,domNode);
}
static inline HRESULT IXTLRuntime_get_nextSibling(IXTLRuntime* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_nextSibling(This,domNode);
}
static inline HRESULT IXTLRuntime_get_attributes(IXTLRuntime* This,IXMLDOMNamedNodeMap **attributeMap) {
    return This->lpVtbl->get_attributes(This,attributeMap);
}
static inline HRESULT IXTLRuntime_insertBefore(IXTLRuntime* This,IXMLDOMNode *newNode,VARIANT var1,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->insertBefore(This,newNode,var1,outOldNode);
}
static inline HRESULT IXTLRuntime_replaceChild(IXTLRuntime* This,IXMLDOMNode *newNode,IXMLDOMNode *oldNode,IXMLDOMNode **outOldNode) {
    return This->lpVtbl->replaceChild(This,newNode,oldNode,outOldNode);
}
static inline HRESULT IXTLRuntime_removeChild(IXTLRuntime* This,IXMLDOMNode *domNode,IXMLDOMNode **oldNode) {
    return This->lpVtbl->removeChild(This,domNode,oldNode);
}
static inline HRESULT IXTLRuntime_appendChild(IXTLRuntime* This,IXMLDOMNode *newNode,IXMLDOMNode **outNewNode) {
    return This->lpVtbl->appendChild(This,newNode,outNewNode);
}
static inline HRESULT IXTLRuntime_hasChildNodes(IXTLRuntime* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->hasChildNodes(This,pbool);
}
static inline HRESULT IXTLRuntime_get_ownerDocument(IXTLRuntime* This,IXMLDOMDocument **domDocument) {
    return This->lpVtbl->get_ownerDocument(This,domDocument);
}
static inline HRESULT IXTLRuntime_cloneNode(IXTLRuntime* This,VARIANT_BOOL pbool,IXMLDOMNode **outNode) {
    return This->lpVtbl->cloneNode(This,pbool,outNode);
}
static inline HRESULT IXTLRuntime_get_nodeTypeString(IXTLRuntime* This,BSTR *p) {
    return This->lpVtbl->get_nodeTypeString(This,p);
}
static inline HRESULT IXTLRuntime_get_text(IXTLRuntime* This,BSTR *p) {
    return This->lpVtbl->get_text(This,p);
}
static inline HRESULT IXTLRuntime_put_text(IXTLRuntime* This,BSTR p) {
    return This->lpVtbl->put_text(This,p);
}
static inline HRESULT IXTLRuntime_get_specified(IXTLRuntime* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_specified(This,pbool);
}
static inline HRESULT IXTLRuntime_get_definition(IXTLRuntime* This,IXMLDOMNode **domNode) {
    return This->lpVtbl->get_definition(This,domNode);
}
static inline HRESULT IXTLRuntime_get_nodeTypedValue(IXTLRuntime* This,VARIANT *var1) {
    return This->lpVtbl->get_nodeTypedValue(This,var1);
}
static inline HRESULT IXTLRuntime_put_nodeTypedValue(IXTLRuntime* This,VARIANT var1) {
    return This->lpVtbl->put_nodeTypedValue(This,var1);
}
static inline HRESULT IXTLRuntime_get_dataType(IXTLRuntime* This,VARIANT *var1) {
    return This->lpVtbl->get_dataType(This,var1);
}
static inline HRESULT IXTLRuntime_put_dataType(IXTLRuntime* This,BSTR p) {
    return This->lpVtbl->put_dataType(This,p);
}
static inline HRESULT IXTLRuntime_get_xml(IXTLRuntime* This,BSTR *p) {
    return This->lpVtbl->get_xml(This,p);
}
static inline HRESULT IXTLRuntime_transformNode(IXTLRuntime* This,IXMLDOMNode *domNode,BSTR *p) {
    return This->lpVtbl->transformNode(This,domNode,p);
}
static inline HRESULT IXTLRuntime_selectNodes(IXTLRuntime* This,BSTR p,IXMLDOMNodeList **outList) {
    return This->lpVtbl->selectNodes(This,p,outList);
}
static inline HRESULT IXTLRuntime_selectSingleNode(IXTLRuntime* This,BSTR p,IXMLDOMNode **outNode) {
    return This->lpVtbl->selectSingleNode(This,p,outNode);
}
static inline HRESULT IXTLRuntime_get_parsed(IXTLRuntime* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->get_parsed(This,pbool);
}
static inline HRESULT IXTLRuntime_get_namespaceURI(IXTLRuntime* This,BSTR *p) {
    return This->lpVtbl->get_namespaceURI(This,p);
}
static inline HRESULT IXTLRuntime_get_prefix(IXTLRuntime* This,BSTR *p) {
    return This->lpVtbl->get_prefix(This,p);
}
static inline HRESULT IXTLRuntime_get_baseName(IXTLRuntime* This,BSTR *p) {
    return This->lpVtbl->get_baseName(This,p);
}
static inline HRESULT IXTLRuntime_transformNodeToObject(IXTLRuntime* This,IXMLDOMNode *domNode,VARIANT var1) {
    return This->lpVtbl->transformNodeToObject(This,domNode,var1);
}
/*** IXTLRuntime methods ***/
static inline HRESULT IXTLRuntime_uniqueID(IXTLRuntime* This,IXMLDOMNode *pNode,LONG *pID) {
    return This->lpVtbl->uniqueID(This,pNode,pID);
}
static inline HRESULT IXTLRuntime_depth(IXTLRuntime* This,IXMLDOMNode *pNode,LONG *pDepth) {
    return This->lpVtbl->depth(This,pNode,pDepth);
}
static inline HRESULT IXTLRuntime_childNumber(IXTLRuntime* This,IXMLDOMNode *pNode,LONG *pNumber) {
    return This->lpVtbl->childNumber(This,pNode,pNumber);
}
static inline HRESULT IXTLRuntime_ancestorChildNumber(IXTLRuntime* This,BSTR bstr,IXMLDOMNode *pNode,LONG *pNumber) {
    return This->lpVtbl->ancestorChildNumber(This,bstr,pNode,pNumber);
}
static inline HRESULT IXTLRuntime_absoluteChildNumber(IXTLRuntime* This,IXMLDOMNode *pNode,LONG *pNumber) {
    return This->lpVtbl->absoluteChildNumber(This,pNode,pNumber);
}
static inline HRESULT IXTLRuntime_formatIndex(IXTLRuntime* This,LONG lIndex,BSTR bstr,BSTR *pbstr) {
    return This->lpVtbl->formatIndex(This,lIndex,bstr,pbstr);
}
static inline HRESULT IXTLRuntime_formatNumber(IXTLRuntime* This,double dblNumber,BSTR bstr,BSTR *pbstr) {
    return This->lpVtbl->formatNumber(This,dblNumber,bstr,pbstr);
}
static inline HRESULT IXTLRuntime_formatDate(IXTLRuntime* This,VARIANT var1,BSTR bstr,VARIANT var2,BSTR *pbstr) {
    return This->lpVtbl->formatDate(This,var1,bstr,var2,pbstr);
}
static 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__ */

/*****************************************************************************
 * 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 inline HRESULT XMLDOMDocumentEvents_QueryInterface(XMLDOMDocumentEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG XMLDOMDocumentEvents_AddRef(XMLDOMDocumentEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG XMLDOMDocumentEvents_Release(XMLDOMDocumentEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT XMLDOMDocumentEvents_GetTypeInfoCount(XMLDOMDocumentEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT XMLDOMDocumentEvents_GetTypeInfo(XMLDOMDocumentEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXSLProcessor_QueryInterface(IXSLProcessor* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXSLProcessor_AddRef(IXSLProcessor* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXSLProcessor_Release(IXSLProcessor* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXSLProcessor_GetTypeInfoCount(IXSLProcessor* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXSLProcessor_GetTypeInfo(IXSLProcessor* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXSLProcessor_put_input(IXSLProcessor* This,VARIANT var) {
    return This->lpVtbl->put_input(This,var);
}
static inline HRESULT IXSLProcessor_get_input(IXSLProcessor* This,VARIANT *var) {
    return This->lpVtbl->get_input(This,var);
}
static inline HRESULT IXSLProcessor_get_ownerTemplate(IXSLProcessor* This,IXSLTemplate **ppTemplate) {
    return This->lpVtbl->get_ownerTemplate(This,ppTemplate);
}
static inline HRESULT IXSLProcessor_setStartMode(IXSLProcessor* This,BSTR p,BSTR uri) {
    return This->lpVtbl->setStartMode(This,p,uri);
}
static inline HRESULT IXSLProcessor_get_startMode(IXSLProcessor* This,BSTR *p) {
    return This->lpVtbl->get_startMode(This,p);
}
static inline HRESULT IXSLProcessor_get_startModeURI(IXSLProcessor* This,BSTR *uri) {
    return This->lpVtbl->get_startModeURI(This,uri);
}
static inline HRESULT IXSLProcessor_put_output(IXSLProcessor* This,VARIANT var) {
    return This->lpVtbl->put_output(This,var);
}
static inline HRESULT IXSLProcessor_get_output(IXSLProcessor* This,VARIANT *var) {
    return This->lpVtbl->get_output(This,var);
}
static inline HRESULT IXSLProcessor_transform(IXSLProcessor* This,VARIANT_BOOL *pbool) {
    return This->lpVtbl->transform(This,pbool);
}
static inline HRESULT IXSLProcessor_reset(IXSLProcessor* This) {
    return This->lpVtbl->reset(This);
}
static inline HRESULT IXSLProcessor_get_readyState(IXSLProcessor* This,LONG *pstate) {
    return This->lpVtbl->get_readyState(This,pstate);
}
static inline HRESULT IXSLProcessor_addParameter(IXSLProcessor* This,BSTR p,VARIANT var,BSTR uri) {
    return This->lpVtbl->addParameter(This,p,var,uri);
}
static inline HRESULT IXSLProcessor_addObject(IXSLProcessor* This,IDispatch *obj,BSTR uri) {
    return This->lpVtbl->addObject(This,obj,uri);
}
static 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 inline HRESULT IXSLTemplate_QueryInterface(IXSLTemplate* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXSLTemplate_AddRef(IXSLTemplate* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXSLTemplate_Release(IXSLTemplate* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXSLTemplate_GetTypeInfoCount(IXSLTemplate* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXSLTemplate_GetTypeInfo(IXSLTemplate* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXSLTemplate_putref_stylesheet(IXSLTemplate* This,IXMLDOMNode *node) {
    return This->lpVtbl->putref_stylesheet(This,node);
}
static inline HRESULT IXSLTemplate_get_stylesheet(IXSLTemplate* This,IXMLDOMNode **node) {
    return This->lpVtbl->get_stylesheet(This,node);
}
static 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 inline HRESULT IXMLHTTPRequest_QueryInterface(IXMLHTTPRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLHTTPRequest_AddRef(IXMLHTTPRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLHTTPRequest_Release(IXMLHTTPRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLHTTPRequest_GetTypeInfoCount(IXMLHTTPRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLHTTPRequest_GetTypeInfo(IXMLHTTPRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 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 inline HRESULT IXMLHTTPRequest_setRequestHeader(IXMLHTTPRequest* This,BSTR bstrHeader,BSTR bstrValue) {
    return This->lpVtbl->setRequestHeader(This,bstrHeader,bstrValue);
}
static inline HRESULT IXMLHTTPRequest_getResponseHeader(IXMLHTTPRequest* This,BSTR bstrHeader,BSTR *value) {
    return This->lpVtbl->getResponseHeader(This,bstrHeader,value);
}
static inline HRESULT IXMLHTTPRequest_getAllResponseHeaders(IXMLHTTPRequest* This,BSTR *pbstrHeaders) {
    return This->lpVtbl->getAllResponseHeaders(This,pbstrHeaders);
}
static inline HRESULT IXMLHTTPRequest_send(IXMLHTTPRequest* This,VARIANT body) {
    return This->lpVtbl->send(This,body);
}
static inline HRESULT IXMLHTTPRequest_abort(IXMLHTTPRequest* This) {
    return This->lpVtbl->abort(This);
}
static inline HRESULT IXMLHTTPRequest_get_status(IXMLHTTPRequest* This,LONG *pStatus) {
    return This->lpVtbl->get_status(This,pStatus);
}
static inline HRESULT IXMLHTTPRequest_get_statusText(IXMLHTTPRequest* This,BSTR *pStatus) {
    return This->lpVtbl->get_statusText(This,pStatus);
}
static inline HRESULT IXMLHTTPRequest_get_responseXML(IXMLHTTPRequest* This,IDispatch **pBody) {
    return This->lpVtbl->get_responseXML(This,pBody);
}
static inline HRESULT IXMLHTTPRequest_get_responseText(IXMLHTTPRequest* This,BSTR *pBody) {
    return This->lpVtbl->get_responseText(This,pBody);
}
static inline HRESULT IXMLHTTPRequest_get_responseBody(IXMLHTTPRequest* This,VARIANT *pBody) {
    return This->lpVtbl->get_responseBody(This,pBody);
}
static inline HRESULT IXMLHTTPRequest_get_responseStream(IXMLHTTPRequest* This,VARIANT *pBody) {
    return This->lpVtbl->get_responseStream(This,pBody);
}
static inline HRESULT IXMLHTTPRequest_get_readyState(IXMLHTTPRequest* This,LONG *pState) {
    return This->lpVtbl->get_readyState(This,pState);
}
static inline HRESULT IXMLHTTPRequest_put_onreadystatechange(IXMLHTTPRequest* This,IDispatch *pReadyStateSink) {
    return This->lpVtbl->put_onreadystatechange(This,pReadyStateSink);
}
#endif
#endif

#endif


#endif  /* __IXMLHTTPRequest_INTERFACE_DEFINED__ */

typedef enum _SXH_SERVER_CERT_OPTION {
    SXH_SERVER_CERT_IGNORE_UNKNOWN_CA = 0x100,
    SXH_SERVER_CERT_IGNORE_WRONG_USAGE = 0x200,
    SXH_SERVER_CERT_IGNORE_CERT_CN_INVALID = 0x1000,
    SXH_SERVER_CERT_IGNORE_CERT_DATE_INVALID = 0x2000,
    SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS = ((SXH_SERVER_CERT_IGNORE_UNKNOWN_CA | SXH_SERVER_CERT_IGNORE_WRONG_USAGE) | SXH_SERVER_CERT_IGNORE_CERT_CN_INVALID) | SXH_SERVER_CERT_IGNORE_CERT_DATE_INVALID
} SXH_SERVER_CERT_OPTION;
/*****************************************************************************
 * 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 inline HRESULT IServerXMLHTTPRequest_QueryInterface(IServerXMLHTTPRequest* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IServerXMLHTTPRequest_AddRef(IServerXMLHTTPRequest* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IServerXMLHTTPRequest_Release(IServerXMLHTTPRequest* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IServerXMLHTTPRequest_GetTypeInfoCount(IServerXMLHTTPRequest* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IServerXMLHTTPRequest_GetTypeInfo(IServerXMLHTTPRequest* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 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 inline HRESULT IServerXMLHTTPRequest_setRequestHeader(IServerXMLHTTPRequest* This,BSTR bstrHeader,BSTR bstrValue) {
    return This->lpVtbl->setRequestHeader(This,bstrHeader,bstrValue);
}
static inline HRESULT IServerXMLHTTPRequest_getResponseHeader(IServerXMLHTTPRequest* This,BSTR bstrHeader,BSTR *value) {
    return This->lpVtbl->getResponseHeader(This,bstrHeader,value);
}
static inline HRESULT IServerXMLHTTPRequest_getAllResponseHeaders(IServerXMLHTTPRequest* This,BSTR *pbstrHeaders) {
    return This->lpVtbl->getAllResponseHeaders(This,pbstrHeaders);
}
static inline HRESULT IServerXMLHTTPRequest_send(IServerXMLHTTPRequest* This,VARIANT body) {
    return This->lpVtbl->send(This,body);
}
static inline HRESULT IServerXMLHTTPRequest_abort(IServerXMLHTTPRequest* This) {
    return This->lpVtbl->abort(This);
}
static inline HRESULT IServerXMLHTTPRequest_get_status(IServerXMLHTTPRequest* This,LONG *pStatus) {
    return This->lpVtbl->get_status(This,pStatus);
}
static inline HRESULT IServerXMLHTTPRequest_get_statusText(IServerXMLHTTPRequest* This,BSTR *pStatus) {
    return This->lpVtbl->get_statusText(This,pStatus);
}
static inline HRESULT IServerXMLHTTPRequest_get_responseXML(IServerXMLHTTPRequest* This,IDispatch **pBody) {
    return This->lpVtbl->get_responseXML(This,pBody);
}
static inline HRESULT IServerXMLHTTPRequest_get_responseText(IServerXMLHTTPRequest* This,BSTR *pBody) {
    return This->lpVtbl->get_responseText(This,pBody);
}
static inline HRESULT IServerXMLHTTPRequest_get_responseBody(IServerXMLHTTPRequest* This,VARIANT *pBody) {
    return This->lpVtbl->get_responseBody(This,pBody);
}
static inline HRESULT IServerXMLHTTPRequest_get_responseStream(IServerXMLHTTPRequest* This,VARIANT *pBody) {
    return This->lpVtbl->get_responseStream(This,pBody);
}
static inline HRESULT IServerXMLHTTPRequest_get_readyState(IServerXMLHTTPRequest* This,LONG *pState) {
    return This->lpVtbl->get_readyState(This,pState);
}
static inline HRESULT IServerXMLHTTPRequest_put_onreadystatechange(IServerXMLHTTPRequest* This,IDispatch *pReadyStateSink) {
    return This->lpVtbl->put_onreadystatechange(This,pReadyStateSink);
}
/*** IServerXMLHTTPRequest methods ***/
static inline HRESULT IServerXMLHTTPRequest_setTimeouts(IServerXMLHTTPRequest* This,LONG resolveTimeout,LONG connectTimeout,LONG sendTimeout,LONG receiveTimeout) {
    return This->lpVtbl->setTimeouts(This,resolveTimeout,connectTimeout,sendTimeout,receiveTimeout);
}
static inline HRESULT IServerXMLHTTPRequest_waitForResponse(IServerXMLHTTPRequest* This,VARIANT timeoutInSeconds,VARIANT_BOOL *isSuccessful) {
    return This->lpVtbl->waitForResponse(This,timeoutInSeconds,isSuccessful);
}
static inline HRESULT IServerXMLHTTPRequest_getOption(IServerXMLHTTPRequest* This,SERVERXMLHTTP_OPTION option,VARIANT *value) {
    return This->lpVtbl->getOption(This,option,value);
}
static 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__ */

/*****************************************************************************
 * IXMLHTTPRequest2 interface
 */
#ifndef __IXMLHTTPRequest2_INTERFACE_DEFINED__
#define __IXMLHTTPRequest2_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLHTTPRequest2, 0xe5d37dc0, 0x552a, 0x4d52, 0x9c,0xc0, 0xa1,0x4d,0x54,0x6f,0xbd,0x04);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("e5d37dc0-552a-4d52-9cc0-a14d546fbd04")
IXMLHTTPRequest2 : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE Open(
        const WCHAR *method,
        const WCHAR *url,
        IXMLHTTPRequest2Callback *callback,
        const WCHAR *username,
        const WCHAR *password,
        const WCHAR *proxyuser,
        const WCHAR *proxypassword) = 0;

    virtual HRESULT STDMETHODCALLTYPE Send(
        ISequentialStream *body,
        ULONGLONG length) = 0;

    virtual HRESULT STDMETHODCALLTYPE Abort(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCookie(
        const XHR_COOKIE *cookie,
        DWORD *state) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetCustomResponseStream(
        ISequentialStream *stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetProperty(
        XHR_PROPERTY property,
        ULONGLONG value) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetRequestHeader(
        const WCHAR *header,
        const WCHAR *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAllResponseHeaders(
        WCHAR **headers) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCookie(
        const WCHAR *url,
        const WCHAR *name,
        DWORD flags,
        ULONG *cookies_cnt,
        XHR_COOKIE **cookies) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetResponseHeader(
        const WCHAR *header,
        WCHAR **value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLHTTPRequest2, 0xe5d37dc0, 0x552a, 0x4d52, 0x9c,0xc0, 0xa1,0x4d,0x54,0x6f,0xbd,0x04)
#endif
#else
typedef struct IXMLHTTPRequest2Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXMLHTTPRequest2 methods ***/
    HRESULT (STDMETHODCALLTYPE *Open)(
        IXMLHTTPRequest2 *This,
        const WCHAR *method,
        const WCHAR *url,
        IXMLHTTPRequest2Callback *callback,
        const WCHAR *username,
        const WCHAR *password,
        const WCHAR *proxyuser,
        const WCHAR *proxypassword);

    HRESULT (STDMETHODCALLTYPE *Send)(
        IXMLHTTPRequest2 *This,
        ISequentialStream *body,
        ULONGLONG length);

    HRESULT (STDMETHODCALLTYPE *Abort)(
        IXMLHTTPRequest2 *This);

    HRESULT (STDMETHODCALLTYPE *SetCookie)(
        IXMLHTTPRequest2 *This,
        const XHR_COOKIE *cookie,
        DWORD *state);

    HRESULT (STDMETHODCALLTYPE *SetCustomResponseStream)(
        IXMLHTTPRequest2 *This,
        ISequentialStream *stream);

    HRESULT (STDMETHODCALLTYPE *SetProperty)(
        IXMLHTTPRequest2 *This,
        XHR_PROPERTY property,
        ULONGLONG value);

    HRESULT (STDMETHODCALLTYPE *SetRequestHeader)(
        IXMLHTTPRequest2 *This,
        const WCHAR *header,
        const WCHAR *value);

    HRESULT (STDMETHODCALLTYPE *GetAllResponseHeaders)(
        IXMLHTTPRequest2 *This,
        WCHAR **headers);

    HRESULT (STDMETHODCALLTYPE *GetCookie)(
        IXMLHTTPRequest2 *This,
        const WCHAR *url,
        const WCHAR *name,
        DWORD flags,
        ULONG *cookies_cnt,
        XHR_COOKIE **cookies);

    HRESULT (STDMETHODCALLTYPE *GetResponseHeader)(
        IXMLHTTPRequest2 *This,
        const WCHAR *header,
        WCHAR **value);

    END_INTERFACE
} IXMLHTTPRequest2Vtbl;

interface IXMLHTTPRequest2 {
    CONST_VTBL IXMLHTTPRequest2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLHTTPRequest2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLHTTPRequest2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLHTTPRequest2_Release(This) (This)->lpVtbl->Release(This)
/*** IXMLHTTPRequest2 methods ***/
#define IXMLHTTPRequest2_Open(This,method,url,callback,username,password,proxyuser,proxypassword) (This)->lpVtbl->Open(This,method,url,callback,username,password,proxyuser,proxypassword)
#define IXMLHTTPRequest2_Send(This,body,length) (This)->lpVtbl->Send(This,body,length)
#define IXMLHTTPRequest2_Abort(This) (This)->lpVtbl->Abort(This)
#define IXMLHTTPRequest2_SetCookie(This,cookie,state) (This)->lpVtbl->SetCookie(This,cookie,state)
#define IXMLHTTPRequest2_SetCustomResponseStream(This,stream) (This)->lpVtbl->SetCustomResponseStream(This,stream)
#define IXMLHTTPRequest2_SetProperty(This,property,value) (This)->lpVtbl->SetProperty(This,property,value)
#define IXMLHTTPRequest2_SetRequestHeader(This,header,value) (This)->lpVtbl->SetRequestHeader(This,header,value)
#define IXMLHTTPRequest2_GetAllResponseHeaders(This,headers) (This)->lpVtbl->GetAllResponseHeaders(This,headers)
#define IXMLHTTPRequest2_GetCookie(This,url,name,flags,cookies_cnt,cookies) (This)->lpVtbl->GetCookie(This,url,name,flags,cookies_cnt,cookies)
#define IXMLHTTPRequest2_GetResponseHeader(This,header,value) (This)->lpVtbl->GetResponseHeader(This,header,value)
#else
/*** IUnknown methods ***/
static inline HRESULT IXMLHTTPRequest2_QueryInterface(IXMLHTTPRequest2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLHTTPRequest2_AddRef(IXMLHTTPRequest2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLHTTPRequest2_Release(IXMLHTTPRequest2* This) {
    return This->lpVtbl->Release(This);
}
/*** IXMLHTTPRequest2 methods ***/
static inline HRESULT IXMLHTTPRequest2_Open(IXMLHTTPRequest2* This,const WCHAR *method,const WCHAR *url,IXMLHTTPRequest2Callback *callback,const WCHAR *username,const WCHAR *password,const WCHAR *proxyuser,const WCHAR *proxypassword) {
    return This->lpVtbl->Open(This,method,url,callback,username,password,proxyuser,proxypassword);
}
static inline HRESULT IXMLHTTPRequest2_Send(IXMLHTTPRequest2* This,ISequentialStream *body,ULONGLONG length) {
    return This->lpVtbl->Send(This,body,length);
}
static inline HRESULT IXMLHTTPRequest2_Abort(IXMLHTTPRequest2* This) {
    return This->lpVtbl->Abort(This);
}
static inline HRESULT IXMLHTTPRequest2_SetCookie(IXMLHTTPRequest2* This,const XHR_COOKIE *cookie,DWORD *state) {
    return This->lpVtbl->SetCookie(This,cookie,state);
}
static inline HRESULT IXMLHTTPRequest2_SetCustomResponseStream(IXMLHTTPRequest2* This,ISequentialStream *stream) {
    return This->lpVtbl->SetCustomResponseStream(This,stream);
}
static inline HRESULT IXMLHTTPRequest2_SetProperty(IXMLHTTPRequest2* This,XHR_PROPERTY property,ULONGLONG value) {
    return This->lpVtbl->SetProperty(This,property,value);
}
static inline HRESULT IXMLHTTPRequest2_SetRequestHeader(IXMLHTTPRequest2* This,const WCHAR *header,const WCHAR *value) {
    return This->lpVtbl->SetRequestHeader(This,header,value);
}
static inline HRESULT IXMLHTTPRequest2_GetAllResponseHeaders(IXMLHTTPRequest2* This,WCHAR **headers) {
    return This->lpVtbl->GetAllResponseHeaders(This,headers);
}
static inline HRESULT IXMLHTTPRequest2_GetCookie(IXMLHTTPRequest2* This,const WCHAR *url,const WCHAR *name,DWORD flags,ULONG *cookies_cnt,XHR_COOKIE **cookies) {
    return This->lpVtbl->GetCookie(This,url,name,flags,cookies_cnt,cookies);
}
static inline HRESULT IXMLHTTPRequest2_GetResponseHeader(IXMLHTTPRequest2* This,const WCHAR *header,WCHAR **value) {
    return This->lpVtbl->GetResponseHeader(This,header,value);
}
#endif
#endif

#endif


#endif  /* __IXMLHTTPRequest2_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLHTTPRequest3 interface
 */
#ifndef __IXMLHTTPRequest3_INTERFACE_DEFINED__
#define __IXMLHTTPRequest3_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLHTTPRequest3, 0xa1c9feee, 0x0617, 0x4f23, 0x9d,0x58, 0x89,0x61,0xea,0x43,0x56,0x7c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a1c9feee-0617-4f23-9d58-8961ea43567c")
IXMLHTTPRequest3 : public IXMLHTTPRequest2
{
    virtual HRESULT STDMETHODCALLTYPE SetClientCertificate(
        DWORD count,
        const BYTE *hashes,
        const WCHAR *pin) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLHTTPRequest3, 0xa1c9feee, 0x0617, 0x4f23, 0x9d,0x58, 0x89,0x61,0xea,0x43,0x56,0x7c)
#endif
#else
typedef struct IXMLHTTPRequest3Vtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXMLHTTPRequest2 methods ***/
    HRESULT (STDMETHODCALLTYPE *Open)(
        IXMLHTTPRequest3 *This,
        const WCHAR *method,
        const WCHAR *url,
        IXMLHTTPRequest2Callback *callback,
        const WCHAR *username,
        const WCHAR *password,
        const WCHAR *proxyuser,
        const WCHAR *proxypassword);

    HRESULT (STDMETHODCALLTYPE *Send)(
        IXMLHTTPRequest3 *This,
        ISequentialStream *body,
        ULONGLONG length);

    HRESULT (STDMETHODCALLTYPE *Abort)(
        IXMLHTTPRequest3 *This);

    HRESULT (STDMETHODCALLTYPE *SetCookie)(
        IXMLHTTPRequest3 *This,
        const XHR_COOKIE *cookie,
        DWORD *state);

    HRESULT (STDMETHODCALLTYPE *SetCustomResponseStream)(
        IXMLHTTPRequest3 *This,
        ISequentialStream *stream);

    HRESULT (STDMETHODCALLTYPE *SetProperty)(
        IXMLHTTPRequest3 *This,
        XHR_PROPERTY property,
        ULONGLONG value);

    HRESULT (STDMETHODCALLTYPE *SetRequestHeader)(
        IXMLHTTPRequest3 *This,
        const WCHAR *header,
        const WCHAR *value);

    HRESULT (STDMETHODCALLTYPE *GetAllResponseHeaders)(
        IXMLHTTPRequest3 *This,
        WCHAR **headers);

    HRESULT (STDMETHODCALLTYPE *GetCookie)(
        IXMLHTTPRequest3 *This,
        const WCHAR *url,
        const WCHAR *name,
        DWORD flags,
        ULONG *cookies_cnt,
        XHR_COOKIE **cookies);

    HRESULT (STDMETHODCALLTYPE *GetResponseHeader)(
        IXMLHTTPRequest3 *This,
        const WCHAR *header,
        WCHAR **value);

    /*** IXMLHTTPRequest3 methods ***/
    HRESULT (STDMETHODCALLTYPE *SetClientCertificate)(
        IXMLHTTPRequest3 *This,
        DWORD count,
        const BYTE *hashes,
        const WCHAR *pin);

    END_INTERFACE
} IXMLHTTPRequest3Vtbl;

interface IXMLHTTPRequest3 {
    CONST_VTBL IXMLHTTPRequest3Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLHTTPRequest3_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLHTTPRequest3_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLHTTPRequest3_Release(This) (This)->lpVtbl->Release(This)
/*** IXMLHTTPRequest2 methods ***/
#define IXMLHTTPRequest3_Open(This,method,url,callback,username,password,proxyuser,proxypassword) (This)->lpVtbl->Open(This,method,url,callback,username,password,proxyuser,proxypassword)
#define IXMLHTTPRequest3_Send(This,body,length) (This)->lpVtbl->Send(This,body,length)
#define IXMLHTTPRequest3_Abort(This) (This)->lpVtbl->Abort(This)
#define IXMLHTTPRequest3_SetCookie(This,cookie,state) (This)->lpVtbl->SetCookie(This,cookie,state)
#define IXMLHTTPRequest3_SetCustomResponseStream(This,stream) (This)->lpVtbl->SetCustomResponseStream(This,stream)
#define IXMLHTTPRequest3_SetProperty(This,property,value) (This)->lpVtbl->SetProperty(This,property,value)
#define IXMLHTTPRequest3_SetRequestHeader(This,header,value) (This)->lpVtbl->SetRequestHeader(This,header,value)
#define IXMLHTTPRequest3_GetAllResponseHeaders(This,headers) (This)->lpVtbl->GetAllResponseHeaders(This,headers)
#define IXMLHTTPRequest3_GetCookie(This,url,name,flags,cookies_cnt,cookies) (This)->lpVtbl->GetCookie(This,url,name,flags,cookies_cnt,cookies)
#define IXMLHTTPRequest3_GetResponseHeader(This,header,value) (This)->lpVtbl->GetResponseHeader(This,header,value)
/*** IXMLHTTPRequest3 methods ***/
#define IXMLHTTPRequest3_SetClientCertificate(This,count,hashes,pin) (This)->lpVtbl->SetClientCertificate(This,count,hashes,pin)
#else
/*** IUnknown methods ***/
static inline HRESULT IXMLHTTPRequest3_QueryInterface(IXMLHTTPRequest3* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLHTTPRequest3_AddRef(IXMLHTTPRequest3* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLHTTPRequest3_Release(IXMLHTTPRequest3* This) {
    return This->lpVtbl->Release(This);
}
/*** IXMLHTTPRequest2 methods ***/
static inline HRESULT IXMLHTTPRequest3_Open(IXMLHTTPRequest3* This,const WCHAR *method,const WCHAR *url,IXMLHTTPRequest2Callback *callback,const WCHAR *username,const WCHAR *password,const WCHAR *proxyuser,const WCHAR *proxypassword) {
    return This->lpVtbl->Open(This,method,url,callback,username,password,proxyuser,proxypassword);
}
static inline HRESULT IXMLHTTPRequest3_Send(IXMLHTTPRequest3* This,ISequentialStream *body,ULONGLONG length) {
    return This->lpVtbl->Send(This,body,length);
}
static inline HRESULT IXMLHTTPRequest3_Abort(IXMLHTTPRequest3* This) {
    return This->lpVtbl->Abort(This);
}
static inline HRESULT IXMLHTTPRequest3_SetCookie(IXMLHTTPRequest3* This,const XHR_COOKIE *cookie,DWORD *state) {
    return This->lpVtbl->SetCookie(This,cookie,state);
}
static inline HRESULT IXMLHTTPRequest3_SetCustomResponseStream(IXMLHTTPRequest3* This,ISequentialStream *stream) {
    return This->lpVtbl->SetCustomResponseStream(This,stream);
}
static inline HRESULT IXMLHTTPRequest3_SetProperty(IXMLHTTPRequest3* This,XHR_PROPERTY property,ULONGLONG value) {
    return This->lpVtbl->SetProperty(This,property,value);
}
static inline HRESULT IXMLHTTPRequest3_SetRequestHeader(IXMLHTTPRequest3* This,const WCHAR *header,const WCHAR *value) {
    return This->lpVtbl->SetRequestHeader(This,header,value);
}
static inline HRESULT IXMLHTTPRequest3_GetAllResponseHeaders(IXMLHTTPRequest3* This,WCHAR **headers) {
    return This->lpVtbl->GetAllResponseHeaders(This,headers);
}
static inline HRESULT IXMLHTTPRequest3_GetCookie(IXMLHTTPRequest3* This,const WCHAR *url,const WCHAR *name,DWORD flags,ULONG *cookies_cnt,XHR_COOKIE **cookies) {
    return This->lpVtbl->GetCookie(This,url,name,flags,cookies_cnt,cookies);
}
static inline HRESULT IXMLHTTPRequest3_GetResponseHeader(IXMLHTTPRequest3* This,const WCHAR *header,WCHAR **value) {
    return This->lpVtbl->GetResponseHeader(This,header,value);
}
/*** IXMLHTTPRequest3 methods ***/
static inline HRESULT IXMLHTTPRequest3_SetClientCertificate(IXMLHTTPRequest3* This,DWORD count,const BYTE *hashes,const WCHAR *pin) {
    return This->lpVtbl->SetClientCertificate(This,count,hashes,pin);
}
#endif
#endif

#endif


#endif  /* __IXMLHTTPRequest3_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLHTTPRequest2Callback interface
 */
#ifndef __IXMLHTTPRequest2Callback_INTERFACE_DEFINED__
#define __IXMLHTTPRequest2Callback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLHTTPRequest2Callback, 0xa44a9299, 0xe321, 0x40de, 0x88,0x66, 0x34,0x1b,0x41,0x66,0x91,0x62);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a44a9299-e321-40de-8866-341b41669162")
IXMLHTTPRequest2Callback : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE OnRedirect(
        IXMLHTTPRequest2 *xhr,
        const WCHAR *url) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnHeadersAvailable(
        IXMLHTTPRequest2 *xhr,
        DWORD status,
        const WCHAR *msg) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnDataAvailable(
        IXMLHTTPRequest2 *xhr,
        ISequentialStream *stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnResponseReceived(
        IXMLHTTPRequest2 *xhr,
        ISequentialStream *stream) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnError(
        IXMLHTTPRequest2 *xhr,
        HRESULT error) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLHTTPRequest2Callback, 0xa44a9299, 0xe321, 0x40de, 0x88,0x66, 0x34,0x1b,0x41,0x66,0x91,0x62)
#endif
#else
typedef struct IXMLHTTPRequest2CallbackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXMLHTTPRequest2Callback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnRedirect)(
        IXMLHTTPRequest2Callback *This,
        IXMLHTTPRequest2 *xhr,
        const WCHAR *url);

    HRESULT (STDMETHODCALLTYPE *OnHeadersAvailable)(
        IXMLHTTPRequest2Callback *This,
        IXMLHTTPRequest2 *xhr,
        DWORD status,
        const WCHAR *msg);

    HRESULT (STDMETHODCALLTYPE *OnDataAvailable)(
        IXMLHTTPRequest2Callback *This,
        IXMLHTTPRequest2 *xhr,
        ISequentialStream *stream);

    HRESULT (STDMETHODCALLTYPE *OnResponseReceived)(
        IXMLHTTPRequest2Callback *This,
        IXMLHTTPRequest2 *xhr,
        ISequentialStream *stream);

    HRESULT (STDMETHODCALLTYPE *OnError)(
        IXMLHTTPRequest2Callback *This,
        IXMLHTTPRequest2 *xhr,
        HRESULT error);

    END_INTERFACE
} IXMLHTTPRequest2CallbackVtbl;

interface IXMLHTTPRequest2Callback {
    CONST_VTBL IXMLHTTPRequest2CallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLHTTPRequest2Callback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLHTTPRequest2Callback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLHTTPRequest2Callback_Release(This) (This)->lpVtbl->Release(This)
/*** IXMLHTTPRequest2Callback methods ***/
#define IXMLHTTPRequest2Callback_OnRedirect(This,xhr,url) (This)->lpVtbl->OnRedirect(This,xhr,url)
#define IXMLHTTPRequest2Callback_OnHeadersAvailable(This,xhr,status,msg) (This)->lpVtbl->OnHeadersAvailable(This,xhr,status,msg)
#define IXMLHTTPRequest2Callback_OnDataAvailable(This,xhr,stream) (This)->lpVtbl->OnDataAvailable(This,xhr,stream)
#define IXMLHTTPRequest2Callback_OnResponseReceived(This,xhr,stream) (This)->lpVtbl->OnResponseReceived(This,xhr,stream)
#define IXMLHTTPRequest2Callback_OnError(This,xhr,error) (This)->lpVtbl->OnError(This,xhr,error)
#else
/*** IUnknown methods ***/
static inline HRESULT IXMLHTTPRequest2Callback_QueryInterface(IXMLHTTPRequest2Callback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLHTTPRequest2Callback_AddRef(IXMLHTTPRequest2Callback* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLHTTPRequest2Callback_Release(IXMLHTTPRequest2Callback* This) {
    return This->lpVtbl->Release(This);
}
/*** IXMLHTTPRequest2Callback methods ***/
static inline HRESULT IXMLHTTPRequest2Callback_OnRedirect(IXMLHTTPRequest2Callback* This,IXMLHTTPRequest2 *xhr,const WCHAR *url) {
    return This->lpVtbl->OnRedirect(This,xhr,url);
}
static inline HRESULT IXMLHTTPRequest2Callback_OnHeadersAvailable(IXMLHTTPRequest2Callback* This,IXMLHTTPRequest2 *xhr,DWORD status,const WCHAR *msg) {
    return This->lpVtbl->OnHeadersAvailable(This,xhr,status,msg);
}
static inline HRESULT IXMLHTTPRequest2Callback_OnDataAvailable(IXMLHTTPRequest2Callback* This,IXMLHTTPRequest2 *xhr,ISequentialStream *stream) {
    return This->lpVtbl->OnDataAvailable(This,xhr,stream);
}
static inline HRESULT IXMLHTTPRequest2Callback_OnResponseReceived(IXMLHTTPRequest2Callback* This,IXMLHTTPRequest2 *xhr,ISequentialStream *stream) {
    return This->lpVtbl->OnResponseReceived(This,xhr,stream);
}
static inline HRESULT IXMLHTTPRequest2Callback_OnError(IXMLHTTPRequest2Callback* This,IXMLHTTPRequest2 *xhr,HRESULT error) {
    return This->lpVtbl->OnError(This,xhr,error);
}
#endif
#endif

#endif


#endif  /* __IXMLHTTPRequest2Callback_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IXMLHTTPRequest3Callback interface
 */
#ifndef __IXMLHTTPRequest3Callback_INTERFACE_DEFINED__
#define __IXMLHTTPRequest3Callback_INTERFACE_DEFINED__

DEFINE_GUID(IID_IXMLHTTPRequest3Callback, 0xb9e57830, 0x8c6c, 0x4a6f, 0x9c,0x13, 0x47,0x77,0x2b,0xb0,0x47,0xbb);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b9e57830-8c6c-4a6f-9c13-47772bb047bb")
IXMLHTTPRequest3Callback : public IXMLHTTPRequest2Callback
{
    virtual HRESULT STDMETHODCALLTYPE OnServerCertificateReceived(
        IXMLHTTPRequest3 *xhr,
        DWORD errors,
        DWORD count,
        const XHR_CERT *certificates) = 0;

    virtual HRESULT STDMETHODCALLTYPE OnClientCertificateRequested(
        IXMLHTTPRequest3 *xhr,
        DWORD count,
        const WCHAR **list) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IXMLHTTPRequest3Callback, 0xb9e57830, 0x8c6c, 0x4a6f, 0x9c,0x13, 0x47,0x77,0x2b,0xb0,0x47,0xbb)
#endif
#else
typedef struct IXMLHTTPRequest3CallbackVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** IXMLHTTPRequest2Callback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnRedirect)(
        IXMLHTTPRequest3Callback *This,
        IXMLHTTPRequest2 *xhr,
        const WCHAR *url);

    HRESULT (STDMETHODCALLTYPE *OnHeadersAvailable)(
        IXMLHTTPRequest3Callback *This,
        IXMLHTTPRequest2 *xhr,
        DWORD status,
        const WCHAR *msg);

    HRESULT (STDMETHODCALLTYPE *OnDataAvailable)(
        IXMLHTTPRequest3Callback *This,
        IXMLHTTPRequest2 *xhr,
        ISequentialStream *stream);

    HRESULT (STDMETHODCALLTYPE *OnResponseReceived)(
        IXMLHTTPRequest3Callback *This,
        IXMLHTTPRequest2 *xhr,
        ISequentialStream *stream);

    HRESULT (STDMETHODCALLTYPE *OnError)(
        IXMLHTTPRequest3Callback *This,
        IXMLHTTPRequest2 *xhr,
        HRESULT error);

    /*** IXMLHTTPRequest3Callback methods ***/
    HRESULT (STDMETHODCALLTYPE *OnServerCertificateReceived)(
        IXMLHTTPRequest3Callback *This,
        IXMLHTTPRequest3 *xhr,
        DWORD errors,
        DWORD count,
        const XHR_CERT *certificates);

    HRESULT (STDMETHODCALLTYPE *OnClientCertificateRequested)(
        IXMLHTTPRequest3Callback *This,
        IXMLHTTPRequest3 *xhr,
        DWORD count,
        const WCHAR **list);

    END_INTERFACE
} IXMLHTTPRequest3CallbackVtbl;

interface IXMLHTTPRequest3Callback {
    CONST_VTBL IXMLHTTPRequest3CallbackVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IXMLHTTPRequest3Callback_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IXMLHTTPRequest3Callback_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IXMLHTTPRequest3Callback_Release(This) (This)->lpVtbl->Release(This)
/*** IXMLHTTPRequest2Callback methods ***/
#define IXMLHTTPRequest3Callback_OnRedirect(This,xhr,url) (This)->lpVtbl->OnRedirect(This,xhr,url)
#define IXMLHTTPRequest3Callback_OnHeadersAvailable(This,xhr,status,msg) (This)->lpVtbl->OnHeadersAvailable(This,xhr,status,msg)
#define IXMLHTTPRequest3Callback_OnDataAvailable(This,xhr,stream) (This)->lpVtbl->OnDataAvailable(This,xhr,stream)
#define IXMLHTTPRequest3Callback_OnResponseReceived(This,xhr,stream) (This)->lpVtbl->OnResponseReceived(This,xhr,stream)
#define IXMLHTTPRequest3Callback_OnError(This,xhr,error) (This)->lpVtbl->OnError(This,xhr,error)
/*** IXMLHTTPRequest3Callback methods ***/
#define IXMLHTTPRequest3Callback_OnServerCertificateReceived(This,xhr,errors,count,certificates) (This)->lpVtbl->OnServerCertificateReceived(This,xhr,errors,count,certificates)
#define IXMLHTTPRequest3Callback_OnClientCertificateRequested(This,xhr,count,list) (This)->lpVtbl->OnClientCertificateRequested(This,xhr,count,list)
#else
/*** IUnknown methods ***/
static inline HRESULT IXMLHTTPRequest3Callback_QueryInterface(IXMLHTTPRequest3Callback* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLHTTPRequest3Callback_AddRef(IXMLHTTPRequest3Callback* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLHTTPRequest3Callback_Release(IXMLHTTPRequest3Callback* This) {
    return This->lpVtbl->Release(This);
}
/*** IXMLHTTPRequest2Callback methods ***/
static inline HRESULT IXMLHTTPRequest3Callback_OnRedirect(IXMLHTTPRequest3Callback* This,IXMLHTTPRequest2 *xhr,const WCHAR *url) {
    return This->lpVtbl->OnRedirect(This,xhr,url);
}
static inline HRESULT IXMLHTTPRequest3Callback_OnHeadersAvailable(IXMLHTTPRequest3Callback* This,IXMLHTTPRequest2 *xhr,DWORD status,const WCHAR *msg) {
    return This->lpVtbl->OnHeadersAvailable(This,xhr,status,msg);
}
static inline HRESULT IXMLHTTPRequest3Callback_OnDataAvailable(IXMLHTTPRequest3Callback* This,IXMLHTTPRequest2 *xhr,ISequentialStream *stream) {
    return This->lpVtbl->OnDataAvailable(This,xhr,stream);
}
static inline HRESULT IXMLHTTPRequest3Callback_OnResponseReceived(IXMLHTTPRequest3Callback* This,IXMLHTTPRequest2 *xhr,ISequentialStream *stream) {
    return This->lpVtbl->OnResponseReceived(This,xhr,stream);
}
static inline HRESULT IXMLHTTPRequest3Callback_OnError(IXMLHTTPRequest3Callback* This,IXMLHTTPRequest2 *xhr,HRESULT error) {
    return This->lpVtbl->OnError(This,xhr,error);
}
/*** IXMLHTTPRequest3Callback methods ***/
static inline HRESULT IXMLHTTPRequest3Callback_OnServerCertificateReceived(IXMLHTTPRequest3Callback* This,IXMLHTTPRequest3 *xhr,DWORD errors,DWORD count,const XHR_CERT *certificates) {
    return This->lpVtbl->OnServerCertificateReceived(This,xhr,errors,count,certificates);
}
static inline HRESULT IXMLHTTPRequest3Callback_OnClientCertificateRequested(IXMLHTTPRequest3Callback* This,IXMLHTTPRequest3 *xhr,DWORD count,const WCHAR **list) {
    return This->lpVtbl->OnClientCertificateRequested(This,xhr,count,list);
}
#endif
#endif

#endif


#endif  /* __IXMLHTTPRequest3Callback_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 inline HRESULT IServerXMLHTTPRequest2_QueryInterface(IServerXMLHTTPRequest2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IServerXMLHTTPRequest2_AddRef(IServerXMLHTTPRequest2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IServerXMLHTTPRequest2_Release(IServerXMLHTTPRequest2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IServerXMLHTTPRequest2_GetTypeInfoCount(IServerXMLHTTPRequest2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IServerXMLHTTPRequest2_GetTypeInfo(IServerXMLHTTPRequest2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 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 inline HRESULT IServerXMLHTTPRequest2_setRequestHeader(IServerXMLHTTPRequest2* This,BSTR bstrHeader,BSTR bstrValue) {
    return This->lpVtbl->setRequestHeader(This,bstrHeader,bstrValue);
}
static inline HRESULT IServerXMLHTTPRequest2_getResponseHeader(IServerXMLHTTPRequest2* This,BSTR bstrHeader,BSTR *value) {
    return This->lpVtbl->getResponseHeader(This,bstrHeader,value);
}
static inline HRESULT IServerXMLHTTPRequest2_getAllResponseHeaders(IServerXMLHTTPRequest2* This,BSTR *pbstrHeaders) {
    return This->lpVtbl->getAllResponseHeaders(This,pbstrHeaders);
}
static inline HRESULT IServerXMLHTTPRequest2_send(IServerXMLHTTPRequest2* This,VARIANT body) {
    return This->lpVtbl->send(This,body);
}
static inline HRESULT IServerXMLHTTPRequest2_abort(IServerXMLHTTPRequest2* This) {
    return This->lpVtbl->abort(This);
}
static inline HRESULT IServerXMLHTTPRequest2_get_status(IServerXMLHTTPRequest2* This,LONG *pStatus) {
    return This->lpVtbl->get_status(This,pStatus);
}
static inline HRESULT IServerXMLHTTPRequest2_get_statusText(IServerXMLHTTPRequest2* This,BSTR *pStatus) {
    return This->lpVtbl->get_statusText(This,pStatus);
}
static inline HRESULT IServerXMLHTTPRequest2_get_responseXML(IServerXMLHTTPRequest2* This,IDispatch **pBody) {
    return This->lpVtbl->get_responseXML(This,pBody);
}
static inline HRESULT IServerXMLHTTPRequest2_get_responseText(IServerXMLHTTPRequest2* This,BSTR *pBody) {
    return This->lpVtbl->get_responseText(This,pBody);
}
static inline HRESULT IServerXMLHTTPRequest2_get_responseBody(IServerXMLHTTPRequest2* This,VARIANT *pBody) {
    return This->lpVtbl->get_responseBody(This,pBody);
}
static inline HRESULT IServerXMLHTTPRequest2_get_responseStream(IServerXMLHTTPRequest2* This,VARIANT *pBody) {
    return This->lpVtbl->get_responseStream(This,pBody);
}
static inline HRESULT IServerXMLHTTPRequest2_get_readyState(IServerXMLHTTPRequest2* This,LONG *pState) {
    return This->lpVtbl->get_readyState(This,pState);
}
static inline HRESULT IServerXMLHTTPRequest2_put_onreadystatechange(IServerXMLHTTPRequest2* This,IDispatch *pReadyStateSink) {
    return This->lpVtbl->put_onreadystatechange(This,pReadyStateSink);
}
/*** IServerXMLHTTPRequest methods ***/
static inline HRESULT IServerXMLHTTPRequest2_setTimeouts(IServerXMLHTTPRequest2* This,LONG resolveTimeout,LONG connectTimeout,LONG sendTimeout,LONG receiveTimeout) {
    return This->lpVtbl->setTimeouts(This,resolveTimeout,connectTimeout,sendTimeout,receiveTimeout);
}
static inline HRESULT IServerXMLHTTPRequest2_waitForResponse(IServerXMLHTTPRequest2* This,VARIANT timeoutInSeconds,VARIANT_BOOL *isSuccessful) {
    return This->lpVtbl->waitForResponse(This,timeoutInSeconds,isSuccessful);
}
static inline HRESULT IServerXMLHTTPRequest2_getOption(IServerXMLHTTPRequest2* This,SERVERXMLHTTP_OPTION option,VARIANT *value) {
    return This->lpVtbl->getOption(This,option,value);
}
static inline HRESULT IServerXMLHTTPRequest2_setOption(IServerXMLHTTPRequest2* This,SERVERXMLHTTP_OPTION option,VARIANT value) {
    return This->lpVtbl->setOption(This,option,value);
}
/*** IServerXMLHTTPRequest2 methods ***/
static inline HRESULT IServerXMLHTTPRequest2_setProxy(IServerXMLHTTPRequest2* This,SXH_PROXY_SETTING proxySetting,VARIANT varProxyServer,VARIANT varBypassList) {
    return This->lpVtbl->setProxy(This,proxySetting,varProxyServer,varBypassList);
}
static 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 inline HRESULT IXMLDOMParseError_QueryInterface(IXMLDOMParseError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMParseError_AddRef(IXMLDOMParseError* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMParseError_Release(IXMLDOMParseError* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMParseError_GetTypeInfoCount(IXMLDOMParseError* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMParseError_GetTypeInfo(IXMLDOMParseError* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMParseError_get_errorCode(IXMLDOMParseError* This,LONG *errCode) {
    return This->lpVtbl->get_errorCode(This,errCode);
}
static inline HRESULT IXMLDOMParseError_get_url(IXMLDOMParseError* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static inline HRESULT IXMLDOMParseError_get_reason(IXMLDOMParseError* This,BSTR *p) {
    return This->lpVtbl->get_reason(This,p);
}
static inline HRESULT IXMLDOMParseError_get_srcText(IXMLDOMParseError* This,BSTR *p) {
    return This->lpVtbl->get_srcText(This,p);
}
static inline HRESULT IXMLDOMParseError_get_line(IXMLDOMParseError* This,LONG *lineNo) {
    return This->lpVtbl->get_line(This,lineNo);
}
static inline HRESULT IXMLDOMParseError_get_linepos(IXMLDOMParseError* This,LONG *linePos) {
    return This->lpVtbl->get_linepos(This,linePos);
}
static 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 inline HRESULT IXMLDOMParseError2_QueryInterface(IXMLDOMParseError2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMParseError2_AddRef(IXMLDOMParseError2* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMParseError2_Release(IXMLDOMParseError2* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMParseError2_GetTypeInfoCount(IXMLDOMParseError2* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMParseError2_GetTypeInfo(IXMLDOMParseError2* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMParseError2_get_errorCode(IXMLDOMParseError2* This,LONG *errCode) {
    return This->lpVtbl->get_errorCode(This,errCode);
}
static inline HRESULT IXMLDOMParseError2_get_url(IXMLDOMParseError2* This,BSTR *p) {
    return This->lpVtbl->get_url(This,p);
}
static inline HRESULT IXMLDOMParseError2_get_reason(IXMLDOMParseError2* This,BSTR *p) {
    return This->lpVtbl->get_reason(This,p);
}
static inline HRESULT IXMLDOMParseError2_get_srcText(IXMLDOMParseError2* This,BSTR *p) {
    return This->lpVtbl->get_srcText(This,p);
}
static inline HRESULT IXMLDOMParseError2_get_line(IXMLDOMParseError2* This,LONG *lineNo) {
    return This->lpVtbl->get_line(This,lineNo);
}
static inline HRESULT IXMLDOMParseError2_get_linepos(IXMLDOMParseError2* This,LONG *linePos) {
    return This->lpVtbl->get_linepos(This,linePos);
}
static inline HRESULT IXMLDOMParseError2_get_filepos(IXMLDOMParseError2* This,LONG *filePos) {
    return This->lpVtbl->get_filepos(This,filePos);
}
/*** IXMLDOMParseError2 methods ***/
static inline HRESULT IXMLDOMParseError2_get_errorXPath(IXMLDOMParseError2* This,BSTR *xpathexpr) {
    return This->lpVtbl->get_errorXPath(This,xpathexpr);
}
static inline HRESULT IXMLDOMParseError2_get_allErrors(IXMLDOMParseError2* This,IXMLDOMParseErrorCollection **allErrors) {
    return This->lpVtbl->get_allErrors(This,allErrors);
}
static inline HRESULT IXMLDOMParseError2_errorParameters(IXMLDOMParseError2* This,LONG index,BSTR *param) {
    return This->lpVtbl->errorParameters(This,index,param);
}
static 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 inline HRESULT IXMLDOMParseErrorCollection_QueryInterface(IXMLDOMParseErrorCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IXMLDOMParseErrorCollection_AddRef(IXMLDOMParseErrorCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IXMLDOMParseErrorCollection_Release(IXMLDOMParseErrorCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IXMLDOMParseErrorCollection_GetTypeInfoCount(IXMLDOMParseErrorCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IXMLDOMParseErrorCollection_GetTypeInfo(IXMLDOMParseErrorCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IXMLDOMParseErrorCollection_get_item(IXMLDOMParseErrorCollection* This,LONG index,IXMLDOMParseError2 **error) {
    return This->lpVtbl->get_item(This,index,error);
}
static inline HRESULT IXMLDOMParseErrorCollection_get_length(IXMLDOMParseErrorCollection* This,LONG *length) {
    return This->lpVtbl->get_length(This,length);
}
static inline HRESULT IXMLDOMParseErrorCollection_get_next(IXMLDOMParseErrorCollection* This,IXMLDOMParseError2 **error) {
    return This->lpVtbl->get_next(This,error);
}
static inline HRESULT IXMLDOMParseErrorCollection_reset(IXMLDOMParseErrorCollection* This) {
    return This->lpVtbl->reset(This);
}
static inline HRESULT IXMLDOMParseErrorCollection_get__newEnum(IXMLDOMParseErrorCollection* This,IUnknown **ppunk) {
    return This->lpVtbl->get__newEnum(This,ppunk);
}
#endif
#endif

#endif


#endif  /* __IXMLDOMParseErrorCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * 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 inline HRESULT ISAXAttributes_QueryInterface(ISAXAttributes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISAXAttributes_AddRef(ISAXAttributes* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISAXAttributes_Release(ISAXAttributes* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXAttributes methods ***/
static inline HRESULT ISAXAttributes_getLength(ISAXAttributes* This,int *length) {
    return This->lpVtbl->getLength(This,length);
}
static inline HRESULT ISAXAttributes_getURI(ISAXAttributes* This,int nIndex,const WCHAR **pUrl,int *pUriSize) {
    return This->lpVtbl->getURI(This,nIndex,pUrl,pUriSize);
}
static inline HRESULT ISAXAttributes_getLocalName(ISAXAttributes* This,int nIndex,const WCHAR **pLocalName,int *pLocalNameLength) {
    return This->lpVtbl->getLocalName(This,nIndex,pLocalName,pLocalNameLength);
}
static inline HRESULT ISAXAttributes_getQName(ISAXAttributes* This,int nIndex,const WCHAR **pQName,int *pQNameLength) {
    return This->lpVtbl->getQName(This,nIndex,pQName,pQNameLength);
}
static 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 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 inline HRESULT ISAXAttributes_getIndexFromQName(ISAXAttributes* This,const WCHAR *pQName,int nQNameLength,int *index) {
    return This->lpVtbl->getIndexFromQName(This,pQName,nQNameLength,index);
}
static inline HRESULT ISAXAttributes_getType(ISAXAttributes* This,int nIndex,const WCHAR **pType,int *pTypeLength) {
    return This->lpVtbl->getType(This,nIndex,pType,pTypeLength);
}
static 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 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 inline HRESULT ISAXAttributes_getValue(ISAXAttributes* This,int nIndex,const WCHAR **pValue,int *nValue) {
    return This->lpVtbl->getValue(This,nIndex,pValue,nValue);
}
static 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 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 inline HRESULT ISAXContentHandler_QueryInterface(ISAXContentHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISAXContentHandler_AddRef(ISAXContentHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISAXContentHandler_Release(ISAXContentHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXContentHandler methods ***/
static inline HRESULT ISAXContentHandler_putDocumentLocator(ISAXContentHandler* This,ISAXLocator *pLocator) {
    return This->lpVtbl->putDocumentLocator(This,pLocator);
}
static inline HRESULT ISAXContentHandler_startDocument(ISAXContentHandler* This) {
    return This->lpVtbl->startDocument(This);
}
static inline HRESULT ISAXContentHandler_endDocument(ISAXContentHandler* This) {
    return This->lpVtbl->endDocument(This);
}
static 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 inline HRESULT ISAXContentHandler_endPrefixMapping(ISAXContentHandler* This,const WCHAR *pPrefix,int nPrefix) {
    return This->lpVtbl->endPrefixMapping(This,pPrefix,nPrefix);
}
static 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 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 inline HRESULT ISAXContentHandler_characters(ISAXContentHandler* This,const WCHAR *pChars,int nChars) {
    return This->lpVtbl->characters(This,pChars,nChars);
}
static inline HRESULT ISAXContentHandler_ignorableWhitespace(ISAXContentHandler* This,const WCHAR *pChars,int nChars) {
    return This->lpVtbl->ignorableWhitespace(This,pChars,nChars);
}
static 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 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 inline HRESULT ISAXDeclHandler_QueryInterface(ISAXDeclHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISAXDeclHandler_AddRef(ISAXDeclHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISAXDeclHandler_Release(ISAXDeclHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXDeclHandler methods ***/
static 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 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 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 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__ */

/*****************************************************************************
 * FreeThreadedXMLHTTP60 coclass
 */

DEFINE_GUID(CLSID_FreeThreadedXMLHTTP60, 0x88d96a09, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5);

#ifdef __cplusplus
class DECLSPEC_UUID("88d96a09-f192-11d4-a65f-0040963251e5") FreeThreadedXMLHTTP60;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FreeThreadedXMLHTTP60, 0x88d96a09, 0xf192, 0x11d4, 0xa6,0x5f, 0x00,0x40,0x96,0x32,0x51,0xe5)
#endif
#endif

/*****************************************************************************
 * 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 inline HRESULT ISAXDTDHandler_QueryInterface(ISAXDTDHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISAXDTDHandler_AddRef(ISAXDTDHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISAXDTDHandler_Release(ISAXDTDHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXDTDHandler methods ***/
static 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 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 inline HRESULT ISAXEntityResolver_QueryInterface(ISAXEntityResolver* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISAXEntityResolver_AddRef(ISAXEntityResolver* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISAXEntityResolver_Release(ISAXEntityResolver* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXEntityResolver methods ***/
static 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 inline HRESULT ISAXErrorHandler_QueryInterface(ISAXErrorHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISAXErrorHandler_AddRef(ISAXErrorHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISAXErrorHandler_Release(ISAXErrorHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXErrorHandler methods ***/
static inline HRESULT ISAXErrorHandler_error(ISAXErrorHandler* This,ISAXLocator *pLocator,const WCHAR *pErrorMessage,HRESULT hrErrorCode) {
    return This->lpVtbl->error(This,pLocator,pErrorMessage,hrErrorCode);
}
static inline HRESULT ISAXErrorHandler_fatalError(ISAXErrorHandler* This,ISAXLocator *pLocator,const WCHAR *pErrorMessage,HRESULT hrErrorCode) {
    return This->lpVtbl->fatalError(This,pLocator,pErrorMessage,hrErrorCode);
}
static 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 inline HRESULT ISAXLexicalHandler_QueryInterface(ISAXLexicalHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISAXLexicalHandler_AddRef(ISAXLexicalHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISAXLexicalHandler_Release(ISAXLexicalHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXLexicalHandler methods ***/
static 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 inline HRESULT ISAXLexicalHandler_endDTD(ISAXLexicalHandler* This) {
    return This->lpVtbl->endDTD(This);
}
static inline HRESULT ISAXLexicalHandler_startEntity(ISAXLexicalHandler* This,const WCHAR *pName,int nName) {
    return This->lpVtbl->startEntity(This,pName,nName);
}
static inline HRESULT ISAXLexicalHandler_endEntity(ISAXLexicalHandler* This,const WCHAR *pName,int nName) {
    return This->lpVtbl->endEntity(This,pName,nName);
}
static inline HRESULT ISAXLexicalHandler_startCDATA(ISAXLexicalHandler* This) {
    return This->lpVtbl->startCDATA(This);
}
static inline HRESULT ISAXLexicalHandler_endCDATA(ISAXLexicalHandler* This) {
    return This->lpVtbl->endCDATA(This);
}
static 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 inline HRESULT ISAXLocator_QueryInterface(ISAXLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISAXLocator_AddRef(ISAXLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISAXLocator_Release(ISAXLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXLocator methods ***/
static inline HRESULT ISAXLocator_getColumnNumber(ISAXLocator* This,int *nColumn) {
    return This->lpVtbl->getColumnNumber(This,nColumn);
}
static inline HRESULT ISAXLocator_getLineNumber(ISAXLocator* This,int *nLine) {
    return This->lpVtbl->getLineNumber(This,nLine);
}
static inline HRESULT ISAXLocator_getPublicId(ISAXLocator* This,const WCHAR **publicId) {
    return This->lpVtbl->getPublicId(This,publicId);
}
static 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 inline HRESULT ISAXXMLReader_QueryInterface(ISAXXMLReader* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISAXXMLReader_AddRef(ISAXXMLReader* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISAXXMLReader_Release(ISAXXMLReader* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXXMLReader methods ***/
static inline HRESULT ISAXXMLReader_getFeature(ISAXXMLReader* This,const WCHAR *pFeature,VARIANT_BOOL *pValue) {
    return This->lpVtbl->getFeature(This,pFeature,pValue);
}
static inline HRESULT ISAXXMLReader_putFeature(ISAXXMLReader* This,const WCHAR *pFeature,VARIANT_BOOL vfValue) {
    return This->lpVtbl->putFeature(This,pFeature,vfValue);
}
static inline HRESULT ISAXXMLReader_getProperty(ISAXXMLReader* This,const WCHAR *pProp,VARIANT *pValue) {
    return This->lpVtbl->getProperty(This,pProp,pValue);
}
static inline HRESULT ISAXXMLReader_putProperty(ISAXXMLReader* This,const WCHAR *pProp,VARIANT value) {
    return This->lpVtbl->putProperty(This,pProp,value);
}
static inline HRESULT ISAXXMLReader_getEntityResolver(ISAXXMLReader* This,ISAXEntityResolver **ppEntityResolver) {
    return This->lpVtbl->getEntityResolver(This,ppEntityResolver);
}
static inline HRESULT ISAXXMLReader_putEntityResolver(ISAXXMLReader* This,ISAXEntityResolver *pEntityResolver) {
    return This->lpVtbl->putEntityResolver(This,pEntityResolver);
}
static inline HRESULT ISAXXMLReader_getContentHandler(ISAXXMLReader* This,ISAXContentHandler **pContentHandler) {
    return This->lpVtbl->getContentHandler(This,pContentHandler);
}
static inline HRESULT ISAXXMLReader_putContentHandler(ISAXXMLReader* This,ISAXContentHandler *contentHandler) {
    return This->lpVtbl->putContentHandler(This,contentHandler);
}
static inline HRESULT ISAXXMLReader_getDTDHandler(ISAXXMLReader* This,ISAXDTDHandler **pDTDHandler) {
    return This->lpVtbl->getDTDHandler(This,pDTDHandler);
}
static inline HRESULT ISAXXMLReader_putDTDHandler(ISAXXMLReader* This,ISAXDTDHandler *pDTDHandler) {
    return This->lpVtbl->putDTDHandler(This,pDTDHandler);
}
static inline HRESULT ISAXXMLReader_getErrorHandler(ISAXXMLReader* This,ISAXErrorHandler **pErrorHandler) {
    return This->lpVtbl->getErrorHandler(This,pErrorHandler);
}
static inline HRESULT ISAXXMLReader_putErrorHandler(ISAXXMLReader* This,ISAXErrorHandler *errorHandler) {
    return This->lpVtbl->putErrorHandler(This,errorHandler);
}
static inline HRESULT ISAXXMLReader_getBaseURL(ISAXXMLReader* This,const WCHAR **pBaseUrl) {
    return This->lpVtbl->getBaseURL(This,pBaseUrl);
}
static inline HRESULT ISAXXMLReader_putBaseURL(ISAXXMLReader* This,const WCHAR *pBaseUrl) {
    return This->lpVtbl->putBaseURL(This,pBaseUrl);
}
static inline HRESULT ISAXXMLReader_getSecureBaseURL(ISAXXMLReader* This,const WCHAR **pSecureBaseUrl) {
    return This->lpVtbl->getSecureBaseURL(This,pSecureBaseUrl);
}
static inline HRESULT ISAXXMLReader_putSecureBaseURL(ISAXXMLReader* This,const WCHAR *secureBaseUrl) {
    return This->lpVtbl->putSecureBaseURL(This,secureBaseUrl);
}
static inline HRESULT ISAXXMLReader_parse(ISAXXMLReader* This,VARIANT varInput) {
    return This->lpVtbl->parse(This,varInput);
}
static 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 inline HRESULT ISAXXMLFilter_QueryInterface(ISAXXMLFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISAXXMLFilter_AddRef(ISAXXMLFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISAXXMLFilter_Release(ISAXXMLFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** ISAXXMLReader methods ***/
static inline HRESULT ISAXXMLFilter_getFeature(ISAXXMLFilter* This,const WCHAR *pFeature,VARIANT_BOOL *pValue) {
    return This->lpVtbl->getFeature(This,pFeature,pValue);
}
static inline HRESULT ISAXXMLFilter_putFeature(ISAXXMLFilter* This,const WCHAR *pFeature,VARIANT_BOOL vfValue) {
    return This->lpVtbl->putFeature(This,pFeature,vfValue);
}
static inline HRESULT ISAXXMLFilter_getProperty(ISAXXMLFilter* This,const WCHAR *pProp,VARIANT *pValue) {
    return This->lpVtbl->getProperty(This,pProp,pValue);
}
static inline HRESULT ISAXXMLFilter_putProperty(ISAXXMLFilter* This,const WCHAR *pProp,VARIANT value) {
    return This->lpVtbl->putProperty(This,pProp,value);
}
static inline HRESULT ISAXXMLFilter_getEntityResolver(ISAXXMLFilter* This,ISAXEntityResolver **ppEntityResolver) {
    return This->lpVtbl->getEntityResolver(This,ppEntityResolver);
}
static inline HRESULT ISAXXMLFilter_putEntityResolver(ISAXXMLFilter* This,ISAXEntityResolver *pEntityResolver) {
    return This->lpVtbl->putEntityResolver(This,pEntityResolver);
}
static inline HRESULT ISAXXMLFilter_getContentHandler(ISAXXMLFilter* This,ISAXContentHandler **pContentHandler) {
    return This->lpVtbl->getContentHandler(This,pContentHandler);
}
static inline HRESULT ISAXXMLFilter_putContentHandler(ISAXXMLFilter* This,ISAXContentHandler *contentHandler) {
    return This->lpVtbl->putContentHandler(This,contentHandler);
}
static inline HRESULT ISAXXMLFilter_getDTDHandler(ISAXXMLFilter* This,ISAXDTDHandler **pDTDHandler) {
    return This->lpVtbl->getDTDHandler(This,pDTDHandler);
}
static inline HRESULT ISAXXMLFilter_putDTDHandler(ISAXXMLFilter* This,ISAXDTDHandler *pDTDHandler) {
    return This->lpVtbl->putDTDHandler(This,pDTDHandler);
}
static inline HRESULT ISAXXMLFilter_getErrorHandler(ISAXXMLFilter* This,ISAXErrorHandler **pErrorHandler) {
    return This->lpVtbl->getErrorHandler(This,pErrorHandler);
}
static inline HRESULT ISAXXMLFilter_putErrorHandler(ISAXXMLFilter* This,ISAXErrorHandler *errorHandler) {
    return This->lpVtbl->putErrorHandler(This,errorHandler);
}
static inline HRESULT ISAXXMLFilter_getBaseURL(ISAXXMLFilter* This,const WCHAR **pBaseUrl) {
    return This->lpVtbl->getBaseURL(This,pBaseUrl);
}
static inline HRESULT ISAXXMLFilter_putBaseURL(ISAXXMLFilter* This,const WCHAR *pBaseUrl) {
    return This->lpVtbl->putBaseURL(This,pBaseUrl);
}
static inline HRESULT ISAXXMLFilter_getSecureBaseURL(ISAXXMLFilter* This,const WCHAR **pSecureBaseUrl) {
    return This->lpVtbl->getSecureBaseURL(This,pSecureBaseUrl);
}
static inline HRESULT ISAXXMLFilter_putSecureBaseURL(ISAXXMLFilter* This,const WCHAR *secureBaseUrl) {
    return This->lpVtbl->putSecureBaseURL(This,secureBaseUrl);
}
static inline HRESULT ISAXXMLFilter_parse(ISAXXMLFilter* This,VARIANT varInput) {
    return This->lpVtbl->parse(This,varInput);
}
static inline HRESULT ISAXXMLFilter_parseURL(ISAXXMLFilter* This,const WCHAR *url) {
    return This->lpVtbl->parseURL(This,url);
}
/*** ISAXXMLFilter methods ***/
static inline HRESULT ISAXXMLFilter_getParent(ISAXXMLFilter* This,ISAXXMLReader **pReader) {
    return This->lpVtbl->getParent(This,pReader);
}
static 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 inline HRESULT IVBSAXAttributes_QueryInterface(IVBSAXAttributes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVBSAXAttributes_AddRef(IVBSAXAttributes* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVBSAXAttributes_Release(IVBSAXAttributes* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IVBSAXAttributes_GetTypeInfoCount(IVBSAXAttributes* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IVBSAXAttributes_GetTypeInfo(IVBSAXAttributes* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IVBSAXAttributes_get_length(IVBSAXAttributes* This,int *nLength) {
    return This->lpVtbl->get_length(This,nLength);
}
static inline HRESULT IVBSAXAttributes_getURI(IVBSAXAttributes* This,int nIndex,BSTR *uri) {
    return This->lpVtbl->getURI(This,nIndex,uri);
}
static inline HRESULT IVBSAXAttributes_getLocalName(IVBSAXAttributes* This,int nIndex,BSTR *localName) {
    return This->lpVtbl->getLocalName(This,nIndex,localName);
}
static inline HRESULT IVBSAXAttributes_getQName(IVBSAXAttributes* This,int nIndex,BSTR *QName) {
    return This->lpVtbl->getQName(This,nIndex,QName);
}
static inline HRESULT IVBSAXAttributes_getIndexFromName(IVBSAXAttributes* This,BSTR uri,BSTR localName,int *nIndex) {
    return This->lpVtbl->getIndexFromName(This,uri,localName,nIndex);
}
static inline HRESULT IVBSAXAttributes_getIndexFromQName(IVBSAXAttributes* This,BSTR QName,int *nIndex) {
    return This->lpVtbl->getIndexFromQName(This,QName,nIndex);
}
static inline HRESULT IVBSAXAttributes_getType(IVBSAXAttributes* This,int nIndex,BSTR *type) {
    return This->lpVtbl->getType(This,nIndex,type);
}
static inline HRESULT IVBSAXAttributes_getTypeFromName(IVBSAXAttributes* This,BSTR uri,BSTR localName,BSTR *type) {
    return This->lpVtbl->getTypeFromName(This,uri,localName,type);
}
static inline HRESULT IVBSAXAttributes_getTypeFromQName(IVBSAXAttributes* This,BSTR QName,BSTR *type) {
    return This->lpVtbl->getTypeFromQName(This,QName,type);
}
static inline HRESULT IVBSAXAttributes_getValue(IVBSAXAttributes* This,int nIndex,BSTR *value) {
    return This->lpVtbl->getValue(This,nIndex,value);
}
static inline HRESULT IVBSAXAttributes_getValueFromName(IVBSAXAttributes* This,BSTR uri,BSTR localName,BSTR *value) {
    return This->lpVtbl->getValueFromName(This,uri,localName,value);
}
static 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 inline HRESULT IVBSAXContentHandler_QueryInterface(IVBSAXContentHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVBSAXContentHandler_AddRef(IVBSAXContentHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVBSAXContentHandler_Release(IVBSAXContentHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IVBSAXContentHandler_GetTypeInfoCount(IVBSAXContentHandler* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IVBSAXContentHandler_GetTypeInfo(IVBSAXContentHandler* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IVBSAXContentHandler_putref_documentLocator(IVBSAXContentHandler* This,IVBSAXLocator *oLocator) {
    return This->lpVtbl->putref_documentLocator(This,oLocator);
}
static inline HRESULT IVBSAXContentHandler_startDocument(IVBSAXContentHandler* This) {
    return This->lpVtbl->startDocument(This);
}
static inline HRESULT IVBSAXContentHandler_endDocument(IVBSAXContentHandler* This) {
    return This->lpVtbl->endDocument(This);
}
static inline HRESULT IVBSAXContentHandler_startPrefixMapping(IVBSAXContentHandler* This,BSTR *prefix,BSTR *uri) {
    return This->lpVtbl->startPrefixMapping(This,prefix,uri);
}
static inline HRESULT IVBSAXContentHandler_endPrefixMapping(IVBSAXContentHandler* This,BSTR *prefix) {
    return This->lpVtbl->endPrefixMapping(This,prefix);
}
static inline HRESULT IVBSAXContentHandler_startElement(IVBSAXContentHandler* This,BSTR *namespaceURI,BSTR *localName,BSTR *QName,IVBSAXAttributes *oAttributes) {
    return This->lpVtbl->startElement(This,namespaceURI,localName,QName,oAttributes);
}
static inline HRESULT IVBSAXContentHandler_endElement(IVBSAXContentHandler* This,BSTR *namespaceURI,BSTR *localName,BSTR *strQName) {
    return This->lpVtbl->endElement(This,namespaceURI,localName,strQName);
}
static inline HRESULT IVBSAXContentHandler_characters(IVBSAXContentHandler* This,BSTR *chars) {
    return This->lpVtbl->characters(This,chars);
}
static inline HRESULT IVBSAXContentHandler_ignorableWhitespace(IVBSAXContentHandler* This,BSTR *chars) {
    return This->lpVtbl->ignorableWhitespace(This,chars);
}
static inline HRESULT IVBSAXContentHandler_processingInstruction(IVBSAXContentHandler* This,BSTR *target,BSTR *data) {
    return This->lpVtbl->processingInstruction(This,target,data);
}
static 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 inline HRESULT IVBSAXDeclHandler_QueryInterface(IVBSAXDeclHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVBSAXDeclHandler_AddRef(IVBSAXDeclHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVBSAXDeclHandler_Release(IVBSAXDeclHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IVBSAXDeclHandler_GetTypeInfoCount(IVBSAXDeclHandler* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IVBSAXDeclHandler_GetTypeInfo(IVBSAXDeclHandler* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IVBSAXDeclHandler_elementDecl(IVBSAXDeclHandler* This,BSTR *name,BSTR *model) {
    return This->lpVtbl->elementDecl(This,name,model);
}
static 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 inline HRESULT IVBSAXDeclHandler_internalEntityDecl(IVBSAXDeclHandler* This,BSTR *name,BSTR *value) {
    return This->lpVtbl->internalEntityDecl(This,name,value);
}
static 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 inline HRESULT IVBSAXDTDHandler_QueryInterface(IVBSAXDTDHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVBSAXDTDHandler_AddRef(IVBSAXDTDHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVBSAXDTDHandler_Release(IVBSAXDTDHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IVBSAXDTDHandler_GetTypeInfoCount(IVBSAXDTDHandler* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IVBSAXDTDHandler_GetTypeInfo(IVBSAXDTDHandler* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IVBSAXDTDHandler_notationDecl(IVBSAXDTDHandler* This,BSTR *name,BSTR *publicId,BSTR *systemId) {
    return This->lpVtbl->notationDecl(This,name,publicId,systemId);
}
static 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 inline HRESULT IVBSAXEntityResolver_QueryInterface(IVBSAXEntityResolver* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVBSAXEntityResolver_AddRef(IVBSAXEntityResolver* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVBSAXEntityResolver_Release(IVBSAXEntityResolver* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IVBSAXEntityResolver_GetTypeInfoCount(IVBSAXEntityResolver* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IVBSAXEntityResolver_GetTypeInfo(IVBSAXEntityResolver* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 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 inline HRESULT IVBSAXErrorHandler_QueryInterface(IVBSAXErrorHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVBSAXErrorHandler_AddRef(IVBSAXErrorHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVBSAXErrorHandler_Release(IVBSAXErrorHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IVBSAXErrorHandler_GetTypeInfoCount(IVBSAXErrorHandler* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IVBSAXErrorHandler_GetTypeInfo(IVBSAXErrorHandler* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IVBSAXErrorHandler_error(IVBSAXErrorHandler* This,IVBSAXLocator *locator,BSTR *errorMessage,LONG errorCode) {
    return This->lpVtbl->error(This,locator,errorMessage,errorCode);
}
static inline HRESULT IVBSAXErrorHandler_fatalError(IVBSAXErrorHandler* This,IVBSAXLocator *locator,BSTR *errorMessage,LONG errorCode) {
    return This->lpVtbl->fatalError(This,locator,errorMessage,errorCode);
}
static 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 inline HRESULT IVBSAXLexicalHandler_QueryInterface(IVBSAXLexicalHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVBSAXLexicalHandler_AddRef(IVBSAXLexicalHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVBSAXLexicalHandler_Release(IVBSAXLexicalHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IVBSAXLexicalHandler_GetTypeInfoCount(IVBSAXLexicalHandler* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IVBSAXLexicalHandler_GetTypeInfo(IVBSAXLexicalHandler* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IVBSAXLexicalHandler_startDTD(IVBSAXLexicalHandler* This,BSTR *name,BSTR *publicId,BSTR *systemId) {
    return This->lpVtbl->startDTD(This,name,publicId,systemId);
}
static inline HRESULT IVBSAXLexicalHandler_endDTD(IVBSAXLexicalHandler* This) {
    return This->lpVtbl->endDTD(This);
}
static inline HRESULT IVBSAXLexicalHandler_startEntity(IVBSAXLexicalHandler* This,BSTR *name) {
    return This->lpVtbl->startEntity(This,name);
}
static inline HRESULT IVBSAXLexicalHandler_endEntity(IVBSAXLexicalHandler* This,BSTR *name) {
    return This->lpVtbl->endEntity(This,name);
}
static inline HRESULT IVBSAXLexicalHandler_startCDATA(IVBSAXLexicalHandler* This) {
    return This->lpVtbl->startCDATA(This);
}
static inline HRESULT IVBSAXLexicalHandler_endCDATA(IVBSAXLexicalHandler* This) {
    return This->lpVtbl->endCDATA(This);
}
static 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 inline HRESULT IVBSAXLocator_QueryInterface(IVBSAXLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVBSAXLocator_AddRef(IVBSAXLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVBSAXLocator_Release(IVBSAXLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IVBSAXLocator_GetTypeInfoCount(IVBSAXLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IVBSAXLocator_GetTypeInfo(IVBSAXLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IVBSAXLocator_get_columnNumber(IVBSAXLocator* This,int *column) {
    return This->lpVtbl->get_columnNumber(This,column);
}
static inline HRESULT IVBSAXLocator_get_lineNumber(IVBSAXLocator* This,int *line) {
    return This->lpVtbl->get_lineNumber(This,line);
}
static inline HRESULT IVBSAXLocator_get_publicId(IVBSAXLocator* This,BSTR *publicId) {
    return This->lpVtbl->get_publicId(This,publicId);
}
static 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 inline HRESULT IVBSAXXMLFilter_QueryInterface(IVBSAXXMLFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVBSAXXMLFilter_AddRef(IVBSAXXMLFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVBSAXXMLFilter_Release(IVBSAXXMLFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IVBSAXXMLFilter_GetTypeInfoCount(IVBSAXXMLFilter* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IVBSAXXMLFilter_GetTypeInfo(IVBSAXXMLFilter* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IVBSAXXMLFilter_get_parent(IVBSAXXMLFilter* This,IVBSAXXMLReader **reader) {
    return This->lpVtbl->get_parent(This,reader);
}
static 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 inline HRESULT IVBSAXXMLReader_QueryInterface(IVBSAXXMLReader* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVBSAXXMLReader_AddRef(IVBSAXXMLReader* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVBSAXXMLReader_Release(IVBSAXXMLReader* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IVBSAXXMLReader_GetTypeInfoCount(IVBSAXXMLReader* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IVBSAXXMLReader_GetTypeInfo(IVBSAXXMLReader* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IVBSAXXMLReader_getFeature(IVBSAXXMLReader* This,BSTR pFeature,VARIANT_BOOL *pValue) {
    return This->lpVtbl->getFeature(This,pFeature,pValue);
}
static inline HRESULT IVBSAXXMLReader_putFeature(IVBSAXXMLReader* This,BSTR pFeature,VARIANT_BOOL vfValue) {
    return This->lpVtbl->putFeature(This,pFeature,vfValue);
}
static inline HRESULT IVBSAXXMLReader_getProperty(IVBSAXXMLReader* This,BSTR pProp,VARIANT *pValue) {
    return This->lpVtbl->getProperty(This,pProp,pValue);
}
static inline HRESULT IVBSAXXMLReader_putProperty(IVBSAXXMLReader* This,BSTR pProp,VARIANT value) {
    return This->lpVtbl->putProperty(This,pProp,value);
}
static inline HRESULT IVBSAXXMLReader_get_entityResolver(IVBSAXXMLReader* This,IVBSAXEntityResolver **ppEntityResolver) {
    return This->lpVtbl->get_entityResolver(This,ppEntityResolver);
}
static inline HRESULT IVBSAXXMLReader_putref_entityResolver(IVBSAXXMLReader* This,IVBSAXEntityResolver *pEntityResolver) {
    return This->lpVtbl->putref_entityResolver(This,pEntityResolver);
}
static inline HRESULT IVBSAXXMLReader_get_contentHandler(IVBSAXXMLReader* This,IVBSAXContentHandler **pContentHandler) {
    return This->lpVtbl->get_contentHandler(This,pContentHandler);
}
static inline HRESULT IVBSAXXMLReader_putref_contentHandler(IVBSAXXMLReader* This,IVBSAXContentHandler *contentHandler) {
    return This->lpVtbl->putref_contentHandler(This,contentHandler);
}
static inline HRESULT IVBSAXXMLReader_get_dtdHandler(IVBSAXXMLReader* This,IVBSAXDTDHandler **pDTDHandler) {
    return This->lpVtbl->get_dtdHandler(This,pDTDHandler);
}
static inline HRESULT IVBSAXXMLReader_putref_dtdHandler(IVBSAXXMLReader* This,IVBSAXDTDHandler *pDTDHandler) {
    return This->lpVtbl->putref_dtdHandler(This,pDTDHandler);
}
static inline HRESULT IVBSAXXMLReader_get_errorHandler(IVBSAXXMLReader* This,IVBSAXErrorHandler **pErrorHandler) {
    return This->lpVtbl->get_errorHandler(This,pErrorHandler);
}
static inline HRESULT IVBSAXXMLReader_putref_errorHandler(IVBSAXXMLReader* This,IVBSAXErrorHandler *errorHandler) {
    return This->lpVtbl->putref_errorHandler(This,errorHandler);
}
static inline HRESULT IVBSAXXMLReader_get_baseURL(IVBSAXXMLReader* This,BSTR *pBaseUrl) {
    return This->lpVtbl->get_baseURL(This,pBaseUrl);
}
static inline HRESULT IVBSAXXMLReader_put_baseURL(IVBSAXXMLReader* This,BSTR pBaseUrl) {
    return This->lpVtbl->put_baseURL(This,pBaseUrl);
}
static inline HRESULT IVBSAXXMLReader_get_secureBaseURL(IVBSAXXMLReader* This,BSTR *pSecureBaseUrl) {
    return This->lpVtbl->get_secureBaseURL(This,pSecureBaseUrl);
}
static inline HRESULT IVBSAXXMLReader_put_secureBaseURL(IVBSAXXMLReader* This,BSTR secureBaseUrl) {
    return This->lpVtbl->put_secureBaseURL(This,secureBaseUrl);
}
static inline HRESULT IVBSAXXMLReader_parse(IVBSAXXMLReader* This,VARIANT varInput) {
    return This->lpVtbl->parse(This,varInput);
}
static 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 inline HRESULT IMXAttributes_QueryInterface(IMXAttributes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IMXAttributes_AddRef(IMXAttributes* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IMXAttributes_Release(IMXAttributes* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IMXAttributes_GetTypeInfoCount(IMXAttributes* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IMXAttributes_GetTypeInfo(IMXAttributes* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 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 inline HRESULT IMXAttributes_addAttributeFromIndex(IMXAttributes* This,VARIANT atts,int index) {
    return This->lpVtbl->addAttributeFromIndex(This,atts,index);
}
static inline HRESULT IMXAttributes_clear(IMXAttributes* This) {
    return This->lpVtbl->clear(This);
}
static inline HRESULT IMXAttributes_removeAttribute(IMXAttributes* This,int index) {
    return This->lpVtbl->removeAttribute(This,index);
}
static 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 inline HRESULT IMXAttributes_setAttributes(IMXAttributes* This,VARIANT atts) {
    return This->lpVtbl->setAttributes(This,atts);
}
static inline HRESULT IMXAttributes_setLocalName(IMXAttributes* This,int index,BSTR localName) {
    return This->lpVtbl->setLocalName(This,index,localName);
}
static inline HRESULT IMXAttributes_setQName(IMXAttributes* This,int index,BSTR QName) {
    return This->lpVtbl->setQName(This,index,QName);
}
static inline HRESULT IMXAttributes_setType(IMXAttributes* This,int index,BSTR type) {
    return This->lpVtbl->setType(This,index,type);
}
static inline HRESULT IMXAttributes_setURI(IMXAttributes* This,int index,BSTR uri) {
    return This->lpVtbl->setURI(This,index,uri);
}
static 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 inline HRESULT IMXSchemaDeclHandler_QueryInterface(IMXSchemaDeclHandler* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IMXSchemaDeclHandler_AddRef(IMXSchemaDeclHandler* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IMXSchemaDeclHandler_Release(IMXSchemaDeclHandler* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IMXSchemaDeclHandler_GetTypeInfoCount(IMXSchemaDeclHandler* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IMXSchemaDeclHandler_GetTypeInfo(IMXSchemaDeclHandler* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 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 inline HRESULT IMXReaderControl_QueryInterface(IMXReaderControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IMXReaderControl_AddRef(IMXReaderControl* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IMXReaderControl_Release(IMXReaderControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IMXReaderControl_GetTypeInfoCount(IMXReaderControl* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IMXReaderControl_GetTypeInfo(IMXReaderControl* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IMXReaderControl_abort(IMXReaderControl* This) {
    return This->lpVtbl->abort(This);
}
static inline HRESULT IMXReaderControl_resume(IMXReaderControl* This) {
    return This->lpVtbl->resume(This);
}
static 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 inline HRESULT IMXWriter_QueryInterface(IMXWriter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IMXWriter_AddRef(IMXWriter* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IMXWriter_Release(IMXWriter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IMXWriter_GetTypeInfoCount(IMXWriter* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IMXWriter_GetTypeInfo(IMXWriter* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IMXWriter_put_output(IMXWriter* This,VARIANT Destination) {
    return This->lpVtbl->put_output(This,Destination);
}
static inline HRESULT IMXWriter_get_output(IMXWriter* This,VARIANT *Destination) {
    return This->lpVtbl->get_output(This,Destination);
}
static inline HRESULT IMXWriter_put_encoding(IMXWriter* This,BSTR encoding) {
    return This->lpVtbl->put_encoding(This,encoding);
}
static inline HRESULT IMXWriter_get_encoding(IMXWriter* This,BSTR *encoding) {
    return This->lpVtbl->get_encoding(This,encoding);
}
static inline HRESULT IMXWriter_put_byteOrderMark(IMXWriter* This,VARIANT_BOOL writeByteOrderMark) {
    return This->lpVtbl->put_byteOrderMark(This,writeByteOrderMark);
}
static inline HRESULT IMXWriter_get_byteOrderMark(IMXWriter* This,VARIANT_BOOL *writeByteOrderMark) {
    return This->lpVtbl->get_byteOrderMark(This,writeByteOrderMark);
}
static inline HRESULT IMXWriter_put_indent(IMXWriter* This,VARIANT_BOOL indentMode) {
    return This->lpVtbl->put_indent(This,indentMode);
}
static inline HRESULT IMXWriter_get_indent(IMXWriter* This,VARIANT_BOOL *indentMode) {
    return This->lpVtbl->get_indent(This,indentMode);
}
static inline HRESULT IMXWriter_put_standalone(IMXWriter* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_standalone(This,value);
}
static inline HRESULT IMXWriter_get_standalone(IMXWriter* This,VARIANT_BOOL *value) {
    return This->lpVtbl->get_standalone(This,value);
}
static inline HRESULT IMXWriter_put_omitXMLDeclaration(IMXWriter* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_omitXMLDeclaration(This,value);
}
static inline HRESULT IMXWriter_get_omitXMLDeclaration(IMXWriter* This,VARIANT_BOOL *value) {
    return This->lpVtbl->get_omitXMLDeclaration(This,value);
}
static inline HRESULT IMXWriter_put_version(IMXWriter* This,BSTR version) {
    return This->lpVtbl->put_version(This,version);
}
static inline HRESULT IMXWriter_get_version(IMXWriter* This,BSTR *version) {
    return This->lpVtbl->get_version(This,version);
}
static inline HRESULT IMXWriter_put_disableOutputEscaping(IMXWriter* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_disableOutputEscaping(This,value);
}
static inline HRESULT IMXWriter_get_disableOutputEscaping(IMXWriter* This,VARIANT_BOOL *value) {
    return This->lpVtbl->get_disableOutputEscaping(This,value);
}
static 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 inline HRESULT IMXNamespacePrefixes_QueryInterface(IMXNamespacePrefixes* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IMXNamespacePrefixes_AddRef(IMXNamespacePrefixes* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IMXNamespacePrefixes_Release(IMXNamespacePrefixes* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IMXNamespacePrefixes_GetTypeInfoCount(IMXNamespacePrefixes* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IMXNamespacePrefixes_GetTypeInfo(IMXNamespacePrefixes* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IMXNamespacePrefixes_get_item(IMXNamespacePrefixes* This,LONG index,BSTR *prefix) {
    return This->lpVtbl->get_item(This,index,prefix);
}
static inline HRESULT IMXNamespacePrefixes_get_length(IMXNamespacePrefixes* This,LONG *length) {
    return This->lpVtbl->get_length(This,length);
}
static 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 inline HRESULT IMXNamespaceManager_QueryInterface(IMXNamespaceManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IMXNamespaceManager_AddRef(IMXNamespaceManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IMXNamespaceManager_Release(IMXNamespaceManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IMXNamespaceManager methods ***/
static inline HRESULT IMXNamespaceManager_putAllowOverride(IMXNamespaceManager* This,VARIANT_BOOL fOverride) {
    return This->lpVtbl->putAllowOverride(This,fOverride);
}
static inline HRESULT IMXNamespaceManager_getAllowOverride(IMXNamespaceManager* This,VARIANT_BOOL *fOverride) {
    return This->lpVtbl->getAllowOverride(This,fOverride);
}
static inline HRESULT IMXNamespaceManager_reset(IMXNamespaceManager* This) {
    return This->lpVtbl->reset(This);
}
static inline HRESULT IMXNamespaceManager_pushContext(IMXNamespaceManager* This) {
    return This->lpVtbl->pushContext(This);
}
static inline HRESULT IMXNamespaceManager_pushNodeContext(IMXNamespaceManager* This,IXMLDOMNode *contextNode,VARIANT_BOOL fDeep) {
    return This->lpVtbl->pushNodeContext(This,contextNode,fDeep);
}
static inline HRESULT IMXNamespaceManager_popContext(IMXNamespaceManager* This) {
    return This->lpVtbl->popContext(This);
}
static inline HRESULT IMXNamespaceManager_declarePrefix(IMXNamespaceManager* This,const WCHAR *prefix,const WCHAR *namespaceURI) {
    return This->lpVtbl->declarePrefix(This,prefix,namespaceURI);
}
static inline HRESULT IMXNamespaceManager_getDeclaredPrefix(IMXNamespaceManager* This,LONG nIndex,WCHAR *pwchPrefix,int *pcchPrefix) {
    return This->lpVtbl->getDeclaredPrefix(This,nIndex,pwchPrefix,pcchPrefix);
}
static 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 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 inline HRESULT IVBMXNamespaceManager_QueryInterface(IVBMXNamespaceManager* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IVBMXNamespaceManager_AddRef(IVBMXNamespaceManager* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IVBMXNamespaceManager_Release(IVBMXNamespaceManager* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IVBMXNamespaceManager_GetTypeInfoCount(IVBMXNamespaceManager* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IVBMXNamespaceManager_GetTypeInfo(IVBMXNamespaceManager* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IVBMXNamespaceManager_put_allowOverride(IVBMXNamespaceManager* This,VARIANT_BOOL fOverride) {
    return This->lpVtbl->put_allowOverride(This,fOverride);
}
static inline HRESULT IVBMXNamespaceManager_get_allowOverride(IVBMXNamespaceManager* This,VARIANT_BOOL *fOverride) {
    return This->lpVtbl->get_allowOverride(This,fOverride);
}
static inline HRESULT IVBMXNamespaceManager_reset(IVBMXNamespaceManager* This) {
    return This->lpVtbl->reset(This);
}
static inline HRESULT IVBMXNamespaceManager_pushContext(IVBMXNamespaceManager* This) {
    return This->lpVtbl->pushContext(This);
}
static inline HRESULT IVBMXNamespaceManager_pushNodeContext(IVBMXNamespaceManager* This,IXMLDOMNode *contextNode,VARIANT_BOOL fDeep) {
    return This->lpVtbl->pushNodeContext(This,contextNode,fDeep);
}
static inline HRESULT IVBMXNamespaceManager_popContext(IVBMXNamespaceManager* This) {
    return This->lpVtbl->popContext(This);
}
static inline HRESULT IVBMXNamespaceManager_declarePrefix(IVBMXNamespaceManager* This,BSTR prefix,BSTR namespaceURI) {
    return This->lpVtbl->declarePrefix(This,prefix,namespaceURI);
}
static inline HRESULT IVBMXNamespaceManager_getDeclaredPrefixes(IVBMXNamespaceManager* This,IMXNamespacePrefixes **prefixes) {
    return This->lpVtbl->getDeclaredPrefixes(This,prefixes);
}
static inline HRESULT IVBMXNamespaceManager_getPrefixes(IVBMXNamespaceManager* This,BSTR namespaceURI,IMXNamespacePrefixes **prefixes) {
    return This->lpVtbl->getPrefixes(This,namespaceURI,prefixes);
}
static inline HRESULT IVBMXNamespaceManager_getURI(IVBMXNamespaceManager* This,BSTR prefix,VARIANT *uri) {
    return This->lpVtbl->getURI(This,prefix,uri);
}
static 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 inline HRESULT IMXXMLFilter_QueryInterface(IMXXMLFilter* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IMXXMLFilter_AddRef(IMXXMLFilter* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IMXXMLFilter_Release(IMXXMLFilter* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IMXXMLFilter_GetTypeInfoCount(IMXXMLFilter* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IMXXMLFilter_GetTypeInfo(IMXXMLFilter* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT IMXXMLFilter_getFeature(IMXXMLFilter* This,BSTR strName,VARIANT_BOOL *fValue) {
    return This->lpVtbl->getFeature(This,strName,fValue);
}
static inline HRESULT IMXXMLFilter_putFeature(IMXXMLFilter* This,BSTR strName,VARIANT_BOOL fValue) {
    return This->lpVtbl->putFeature(This,strName,fValue);
}
static inline HRESULT IMXXMLFilter_getProperty(IMXXMLFilter* This,BSTR strName,VARIANT *varValue) {
    return This->lpVtbl->getProperty(This,strName,varValue);
}
static inline HRESULT IMXXMLFilter_putProperty(IMXXMLFilter* This,BSTR strName,VARIANT varValue) {
    return This->lpVtbl->putProperty(This,strName,varValue);
}
static inline HRESULT IMXXMLFilter_get_entityResolver(IMXXMLFilter* This,IUnknown **oResolver) {
    return This->lpVtbl->get_entityResolver(This,oResolver);
}
static inline HRESULT IMXXMLFilter_putref_entityResolver(IMXXMLFilter* This,IUnknown *oResolver) {
    return This->lpVtbl->putref_entityResolver(This,oResolver);
}
static inline HRESULT IMXXMLFilter_get_contentHandler(IMXXMLFilter* This,IUnknown **oHandler) {
    return This->lpVtbl->get_contentHandler(This,oHandler);
}
static inline HRESULT IMXXMLFilter_putref_contentHandler(IMXXMLFilter* This,IUnknown *oHandler) {
    return This->lpVtbl->putref_contentHandler(This,oHandler);
}
static inline HRESULT IMXXMLFilter_get_dtdHandler(IMXXMLFilter* This,IUnknown **oHandler) {
    return This->lpVtbl->get_dtdHandler(This,oHandler);
}
static inline HRESULT IMXXMLFilter_putref_dtdHandler(IMXXMLFilter* This,IUnknown *oHandler) {
    return This->lpVtbl->putref_dtdHandler(This,oHandler);
}
static inline HRESULT IMXXMLFilter_get_errorHandler(IMXXMLFilter* This,IUnknown **oHandler) {
    return This->lpVtbl->get_errorHandler(This,oHandler);
}
static 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 inline HRESULT ISchemaStringCollection_QueryInterface(ISchemaStringCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISchemaStringCollection_AddRef(ISchemaStringCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISchemaStringCollection_Release(ISchemaStringCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT ISchemaStringCollection_GetTypeInfoCount(ISchemaStringCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT ISchemaStringCollection_GetTypeInfo(ISchemaStringCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT ISchemaStringCollection_get_item(ISchemaStringCollection* This,LONG index,BSTR *bstr) {
    return This->lpVtbl->get_item(This,index,bstr);
}
static inline HRESULT ISchemaStringCollection_get_length(ISchemaStringCollection* This,LONG *length) {
    return This->lpVtbl->get_length(This,length);
}
static 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 inline HRESULT ISchemaItemCollection_QueryInterface(ISchemaItemCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISchemaItemCollection_AddRef(ISchemaItemCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISchemaItemCollection_Release(ISchemaItemCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT ISchemaItemCollection_GetTypeInfoCount(ISchemaItemCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT ISchemaItemCollection_GetTypeInfo(ISchemaItemCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT ISchemaItemCollection_get_item(ISchemaItemCollection* This,LONG index,ISchemaItem **item) {
    return This->lpVtbl->get_item(This,index,item);
}
static inline HRESULT ISchemaItemCollection_itemByName(ISchemaItemCollection* This,BSTR name,ISchemaItem **item) {
    return This->lpVtbl->itemByName(This,name,item);
}
static inline HRESULT ISchemaItemCollection_itemByQName(ISchemaItemCollection* This,BSTR name,BSTR namespaceURI,ISchemaItem **item) {
    return This->lpVtbl->itemByQName(This,name,namespaceURI,item);
}
static inline HRESULT ISchemaItemCollection_get_length(ISchemaItemCollection* This,LONG *length) {
    return This->lpVtbl->get_length(This,length);
}
static 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 inline HRESULT ISchemaItem_QueryInterface(ISchemaItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISchemaItem_AddRef(ISchemaItem* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISchemaItem_Release(ISchemaItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT ISchemaItem_GetTypeInfoCount(ISchemaItem* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT ISchemaItem_GetTypeInfo(ISchemaItem* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT ISchemaItem_get_name(ISchemaItem* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static inline HRESULT ISchemaItem_get_namespaceURI(ISchemaItem* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static inline HRESULT ISchemaItem_get_schema(ISchemaItem* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static inline HRESULT ISchemaItem_get_id(ISchemaItem* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static inline HRESULT ISchemaItem_get_itemType(ISchemaItem* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static inline HRESULT ISchemaItem_get_unhandledAttributes(ISchemaItem* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static 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 inline HRESULT ISchema_QueryInterface(ISchema* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISchema_AddRef(ISchema* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISchema_Release(ISchema* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT ISchema_GetTypeInfoCount(ISchema* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT ISchema_GetTypeInfo(ISchema* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT ISchema_get_name(ISchema* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static inline HRESULT ISchema_get_namespaceURI(ISchema* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static inline HRESULT ISchema_get_schema(ISchema* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static inline HRESULT ISchema_get_id(ISchema* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static inline HRESULT ISchema_get_itemType(ISchema* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static inline HRESULT ISchema_get_unhandledAttributes(ISchema* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static inline HRESULT ISchema_writeAnnotation(ISchema* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchema methods ***/
static inline HRESULT ISchema_get_targetNamespace(ISchema* This,BSTR *targetNamespace) {
    return This->lpVtbl->get_targetNamespace(This,targetNamespace);
}
static inline HRESULT ISchema_get_version(ISchema* This,BSTR *version) {
    return This->lpVtbl->get_version(This,version);
}
static inline HRESULT ISchema_get_types(ISchema* This,ISchemaItemCollection **types) {
    return This->lpVtbl->get_types(This,types);
}
static inline HRESULT ISchema_get_elements(ISchema* This,ISchemaItemCollection **elements) {
    return This->lpVtbl->get_elements(This,elements);
}
static inline HRESULT ISchema_get_attributes(ISchema* This,ISchemaItemCollection **attributes) {
    return This->lpVtbl->get_attributes(This,attributes);
}
static inline HRESULT ISchema_get_attributeGroups(ISchema* This,ISchemaItemCollection **attributeGroups) {
    return This->lpVtbl->get_attributeGroups(This,attributeGroups);
}
static inline HRESULT ISchema_get_modelGroups(ISchema* This,ISchemaItemCollection **modelGroups) {
    return This->lpVtbl->get_modelGroups(This,modelGroups);
}
static inline HRESULT ISchema_get_notations(ISchema* This,ISchemaItemCollection **notations) {
    return This->lpVtbl->get_notations(This,notations);
}
static 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 inline HRESULT ISchemaParticle_QueryInterface(ISchemaParticle* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISchemaParticle_AddRef(ISchemaParticle* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISchemaParticle_Release(ISchemaParticle* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT ISchemaParticle_GetTypeInfoCount(ISchemaParticle* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT ISchemaParticle_GetTypeInfo(ISchemaParticle* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT ISchemaParticle_get_name(ISchemaParticle* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static inline HRESULT ISchemaParticle_get_namespaceURI(ISchemaParticle* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static inline HRESULT ISchemaParticle_get_schema(ISchemaParticle* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static inline HRESULT ISchemaParticle_get_id(ISchemaParticle* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static inline HRESULT ISchemaParticle_get_itemType(ISchemaParticle* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static inline HRESULT ISchemaParticle_get_unhandledAttributes(ISchemaParticle* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static inline HRESULT ISchemaParticle_writeAnnotation(ISchemaParticle* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaParticle methods ***/
static inline HRESULT ISchemaParticle_get_minOccurs(ISchemaParticle* This,VARIANT *minOccurs) {
    return This->lpVtbl->get_minOccurs(This,minOccurs);
}
static 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 inline HRESULT ISchemaAttribute_QueryInterface(ISchemaAttribute* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISchemaAttribute_AddRef(ISchemaAttribute* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISchemaAttribute_Release(ISchemaAttribute* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT ISchemaAttribute_GetTypeInfoCount(ISchemaAttribute* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT ISchemaAttribute_GetTypeInfo(ISchemaAttribute* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT ISchemaAttribute_get_name(ISchemaAttribute* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static inline HRESULT ISchemaAttribute_get_namespaceURI(ISchemaAttribute* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static inline HRESULT ISchemaAttribute_get_schema(ISchemaAttribute* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static inline HRESULT ISchemaAttribute_get_id(ISchemaAttribute* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static inline HRESULT ISchemaAttribute_get_itemType(ISchemaAttribute* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static inline HRESULT ISchemaAttribute_get_unhandledAttributes(ISchemaAttribute* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static inline HRESULT ISchemaAttribute_writeAnnotation(ISchemaAttribute* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaAttribute methods ***/
static inline HRESULT ISchemaAttribute_get_type(ISchemaAttribute* This,ISchemaType **type) {
    return This->lpVtbl->get_type(This,type);
}
static inline HRESULT ISchemaAttribute_get_scope(ISchemaAttribute* This,ISchemaComplexType **scope) {
    return This->lpVtbl->get_scope(This,scope);
}
static inline HRESULT ISchemaAttribute_get_defaultValue(ISchemaAttribute* This,BSTR *defaultValue) {
    return This->lpVtbl->get_defaultValue(This,defaultValue);
}
static inline HRESULT ISchemaAttribute_get_fixedValue(ISchemaAttribute* This,BSTR *fixedValue) {
    return This->lpVtbl->get_fixedValue(This,fixedValue);
}
static inline HRESULT ISchemaAttribute_get_use(ISchemaAttribute* This,SCHEMAUSE *use) {
    return This->lpVtbl->get_use(This,use);
}
static 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 inline HRESULT ISchemaElement_QueryInterface(ISchemaElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISchemaElement_AddRef(ISchemaElement* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISchemaElement_Release(ISchemaElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT ISchemaElement_GetTypeInfoCount(ISchemaElement* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT ISchemaElement_GetTypeInfo(ISchemaElement* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT ISchemaElement_get_name(ISchemaElement* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static inline HRESULT ISchemaElement_get_namespaceURI(ISchemaElement* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static inline HRESULT ISchemaElement_get_schema(ISchemaElement* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static inline HRESULT ISchemaElement_get_id(ISchemaElement* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static inline HRESULT ISchemaElement_get_itemType(ISchemaElement* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static inline HRESULT ISchemaElement_get_unhandledAttributes(ISchemaElement* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static inline HRESULT ISchemaElement_writeAnnotation(ISchemaElement* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaParticle methods ***/
static inline HRESULT ISchemaElement_get_minOccurs(ISchemaElement* This,VARIANT *minOccurs) {
    return This->lpVtbl->get_minOccurs(This,minOccurs);
}
static inline HRESULT ISchemaElement_get_maxOccurs(ISchemaElement* This,VARIANT *maxOccurs) {
    return This->lpVtbl->get_maxOccurs(This,maxOccurs);
}
/*** ISchemaElement methods ***/
static inline HRESULT ISchemaElement_get_type(ISchemaElement* This,ISchemaType **type) {
    return This->lpVtbl->get_type(This,type);
}
static inline HRESULT ISchemaElement_get_scope(ISchemaElement* This,ISchemaComplexType **scope) {
    return This->lpVtbl->get_scope(This,scope);
}
static inline HRESULT ISchemaElement_get_defaultValue(ISchemaElement* This,BSTR *defaultValue) {
    return This->lpVtbl->get_defaultValue(This,defaultValue);
}
static inline HRESULT ISchemaElement_get_fixedValue(ISchemaElement* This,BSTR *fixedValue) {
    return This->lpVtbl->get_fixedValue(This,fixedValue);
}
static inline HRESULT ISchemaElement_get_isNillable(ISchemaElement* This,VARIANT_BOOL *nillable) {
    return This->lpVtbl->get_isNillable(This,nillable);
}
static inline HRESULT ISchemaElement_get_identityConstraints(ISchemaElement* This,ISchemaItemCollection **constraints) {
    return This->lpVtbl->get_identityConstraints(This,constraints);
}
static inline HRESULT ISchemaElement_get_substitutionGroup(ISchemaElement* This,ISchemaElement **element) {
    return This->lpVtbl->get_substitutionGroup(This,element);
}
static inline HRESULT ISchemaElement_get_substitutionGroupExclusions(ISchemaElement* This,SCHEMADERIVATIONMETHOD *exclusions) {
    return This->lpVtbl->get_substitutionGroupExclusions(This,exclusions);
}
static inline HRESULT ISchemaElement_get_disallowedSubstitutions(ISchemaElement* This,SCHEMADERIVATIONMETHOD *disallowed) {
    return This->lpVtbl->get_disallowedSubstitutions(This,disallowed);
}
static inline HRESULT ISchemaElement_get_isAbstract(ISchemaElement* This,VARIANT_BOOL *abstract) {
    return This->lpVtbl->get_isAbstract(This,abstract);
}
static 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 inline HRESULT ISchemaType_QueryInterface(ISchemaType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISchemaType_AddRef(ISchemaType* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISchemaType_Release(ISchemaType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT ISchemaType_GetTypeInfoCount(ISchemaType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT ISchemaType_GetTypeInfo(ISchemaType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT ISchemaType_get_name(ISchemaType* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static inline HRESULT ISchemaType_get_namespaceURI(ISchemaType* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static inline HRESULT ISchemaType_get_schema(ISchemaType* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static inline HRESULT ISchemaType_get_id(ISchemaType* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static inline HRESULT ISchemaType_get_itemType(ISchemaType* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static inline HRESULT ISchemaType_get_unhandledAttributes(ISchemaType* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static inline HRESULT ISchemaType_writeAnnotation(ISchemaType* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaType methods ***/
static inline HRESULT ISchemaType_get_baseTypes(ISchemaType* This,ISchemaItemCollection **baseTypes) {
    return This->lpVtbl->get_baseTypes(This,baseTypes);
}
static inline HRESULT ISchemaType_get_final(ISchemaType* This,SCHEMADERIVATIONMETHOD *final) {
    return This->lpVtbl->get_final(This,final);
}
static inline HRESULT ISchemaType_get_variety(ISchemaType* This,SCHEMATYPEVARIETY *variety) {
    return This->lpVtbl->get_variety(This,variety);
}
static inline HRESULT ISchemaType_get_derivedBy(ISchemaType* This,SCHEMADERIVATIONMETHOD *derivedBy) {
    return This->lpVtbl->get_derivedBy(This,derivedBy);
}
static inline HRESULT ISchemaType_isValid(ISchemaType* This,BSTR data,VARIANT_BOOL *valid) {
    return This->lpVtbl->isValid(This,data,valid);
}
static inline HRESULT ISchemaType_get_minExclusive(ISchemaType* This,BSTR *minExclusive) {
    return This->lpVtbl->get_minExclusive(This,minExclusive);
}
static inline HRESULT ISchemaType_get_minInclusive(ISchemaType* This,BSTR *minInclusive) {
    return This->lpVtbl->get_minInclusive(This,minInclusive);
}
static inline HRESULT ISchemaType_get_maxExclusive(ISchemaType* This,BSTR *maxExclusive) {
    return This->lpVtbl->get_maxExclusive(This,maxExclusive);
}
static inline HRESULT ISchemaType_get_maxInclusive(ISchemaType* This,BSTR *maxInclusive) {
    return This->lpVtbl->get_maxInclusive(This,maxInclusive);
}
static inline HRESULT ISchemaType_get_totalDigits(ISchemaType* This,VARIANT *totalDigits) {
    return This->lpVtbl->get_totalDigits(This,totalDigits);
}
static inline HRESULT ISchemaType_get_fractionDigits(ISchemaType* This,VARIANT *fractionDigits) {
    return This->lpVtbl->get_fractionDigits(This,fractionDigits);
}
static inline HRESULT ISchemaType_get_length(ISchemaType* This,VARIANT *length) {
    return This->lpVtbl->get_length(This,length);
}
static inline HRESULT ISchemaType_get_minLength(ISchemaType* This,VARIANT *minLength) {
    return This->lpVtbl->get_minLength(This,minLength);
}
static inline HRESULT ISchemaType_get_maxLength(ISchemaType* This,VARIANT *maxLength) {
    return This->lpVtbl->get_maxLength(This,maxLength);
}
static inline HRESULT ISchemaType_get_enumeration(ISchemaType* This,ISchemaStringCollection **enumeration) {
    return This->lpVtbl->get_enumeration(This,enumeration);
}
static inline HRESULT ISchemaType_get_whitespace(ISchemaType* This,SCHEMAWHITESPACE *whitespace) {
    return This->lpVtbl->get_whitespace(This,whitespace);
}
static 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 inline HRESULT ISchemaComplexType_QueryInterface(ISchemaComplexType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISchemaComplexType_AddRef(ISchemaComplexType* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISchemaComplexType_Release(ISchemaComplexType* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT ISchemaComplexType_GetTypeInfoCount(ISchemaComplexType* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT ISchemaComplexType_GetTypeInfo(ISchemaComplexType* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT ISchemaComplexType_get_name(ISchemaComplexType* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static inline HRESULT ISchemaComplexType_get_namespaceURI(ISchemaComplexType* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static inline HRESULT ISchemaComplexType_get_schema(ISchemaComplexType* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static inline HRESULT ISchemaComplexType_get_id(ISchemaComplexType* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static inline HRESULT ISchemaComplexType_get_itemType(ISchemaComplexType* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static inline HRESULT ISchemaComplexType_get_unhandledAttributes(ISchemaComplexType* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static inline HRESULT ISchemaComplexType_writeAnnotation(ISchemaComplexType* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaType methods ***/
static inline HRESULT ISchemaComplexType_get_baseTypes(ISchemaComplexType* This,ISchemaItemCollection **baseTypes) {
    return This->lpVtbl->get_baseTypes(This,baseTypes);
}
static inline HRESULT ISchemaComplexType_get_final(ISchemaComplexType* This,SCHEMADERIVATIONMETHOD *final) {
    return This->lpVtbl->get_final(This,final);
}
static inline HRESULT ISchemaComplexType_get_variety(ISchemaComplexType* This,SCHEMATYPEVARIETY *variety) {
    return This->lpVtbl->get_variety(This,variety);
}
static inline HRESULT ISchemaComplexType_get_derivedBy(ISchemaComplexType* This,SCHEMADERIVATIONMETHOD *derivedBy) {
    return This->lpVtbl->get_derivedBy(This,derivedBy);
}
static inline HRESULT ISchemaComplexType_isValid(ISchemaComplexType* This,BSTR data,VARIANT_BOOL *valid) {
    return This->lpVtbl->isValid(This,data,valid);
}
static inline HRESULT ISchemaComplexType_get_minExclusive(ISchemaComplexType* This,BSTR *minExclusive) {
    return This->lpVtbl->get_minExclusive(This,minExclusive);
}
static inline HRESULT ISchemaComplexType_get_minInclusive(ISchemaComplexType* This,BSTR *minInclusive) {
    return This->lpVtbl->get_minInclusive(This,minInclusive);
}
static inline HRESULT ISchemaComplexType_get_maxExclusive(ISchemaComplexType* This,BSTR *maxExclusive) {
    return This->lpVtbl->get_maxExclusive(This,maxExclusive);
}
static inline HRESULT ISchemaComplexType_get_maxInclusive(ISchemaComplexType* This,BSTR *maxInclusive) {
    return This->lpVtbl->get_maxInclusive(This,maxInclusive);
}
static inline HRESULT ISchemaComplexType_get_totalDigits(ISchemaComplexType* This,VARIANT *totalDigits) {
    return This->lpVtbl->get_totalDigits(This,totalDigits);
}
static inline HRESULT ISchemaComplexType_get_fractionDigits(ISchemaComplexType* This,VARIANT *fractionDigits) {
    return This->lpVtbl->get_fractionDigits(This,fractionDigits);
}
static inline HRESULT ISchemaComplexType_get_length(ISchemaComplexType* This,VARIANT *length) {
    return This->lpVtbl->get_length(This,length);
}
static inline HRESULT ISchemaComplexType_get_minLength(ISchemaComplexType* This,VARIANT *minLength) {
    return This->lpVtbl->get_minLength(This,minLength);
}
static inline HRESULT ISchemaComplexType_get_maxLength(ISchemaComplexType* This,VARIANT *maxLength) {
    return This->lpVtbl->get_maxLength(This,maxLength);
}
static inline HRESULT ISchemaComplexType_get_enumeration(ISchemaComplexType* This,ISchemaStringCollection **enumeration) {
    return This->lpVtbl->get_enumeration(This,enumeration);
}
static inline HRESULT ISchemaComplexType_get_whitespace(ISchemaComplexType* This,SCHEMAWHITESPACE *whitespace) {
    return This->lpVtbl->get_whitespace(This,whitespace);
}
static inline HRESULT ISchemaComplexType_get_patterns(ISchemaComplexType* This,ISchemaStringCollection **patterns) {
    return This->lpVtbl->get_patterns(This,patterns);
}
/*** ISchemaComplexType methods ***/
static inline HRESULT ISchemaComplexType_get_isAbstract(ISchemaComplexType* This,VARIANT_BOOL *abstract) {
    return This->lpVtbl->get_isAbstract(This,abstract);
}
static inline HRESULT ISchemaComplexType_get_anyAttribute(ISchemaComplexType* This,ISchemaAny **anyAttribute) {
    return This->lpVtbl->get_anyAttribute(This,anyAttribute);
}
static inline HRESULT ISchemaComplexType_get_attributes(ISchemaComplexType* This,ISchemaItemCollection **attributes) {
    return This->lpVtbl->get_attributes(This,attributes);
}
static inline HRESULT ISchemaComplexType_get_contentType(ISchemaComplexType* This,SCHEMACONTENTTYPE *contentType) {
    return This->lpVtbl->get_contentType(This,contentType);
}
static inline HRESULT ISchemaComplexType_get_contentModel(ISchemaComplexType* This,ISchemaModelGroup **contentModel) {
    return This->lpVtbl->get_contentModel(This,contentModel);
}
static 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 inline HRESULT ISchemaAttributeGroup_QueryInterface(ISchemaAttributeGroup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISchemaAttributeGroup_AddRef(ISchemaAttributeGroup* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISchemaAttributeGroup_Release(ISchemaAttributeGroup* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT ISchemaAttributeGroup_GetTypeInfoCount(ISchemaAttributeGroup* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT ISchemaAttributeGroup_GetTypeInfo(ISchemaAttributeGroup* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT ISchemaAttributeGroup_get_name(ISchemaAttributeGroup* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static inline HRESULT ISchemaAttributeGroup_get_namespaceURI(ISchemaAttributeGroup* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static inline HRESULT ISchemaAttributeGroup_get_schema(ISchemaAttributeGroup* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static inline HRESULT ISchemaAttributeGroup_get_id(ISchemaAttributeGroup* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static inline HRESULT ISchemaAttributeGroup_get_itemType(ISchemaAttributeGroup* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static inline HRESULT ISchemaAttributeGroup_get_unhandledAttributes(ISchemaAttributeGroup* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static inline HRESULT ISchemaAttributeGroup_writeAnnotation(ISchemaAttributeGroup* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaAttributeGroup methods ***/
static inline HRESULT ISchemaAttributeGroup_get_anyAttribute(ISchemaAttributeGroup* This,ISchemaAny **anyAttribute) {
    return This->lpVtbl->get_anyAttribute(This,anyAttribute);
}
static 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 inline HRESULT ISchemaModelGroup_QueryInterface(ISchemaModelGroup* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISchemaModelGroup_AddRef(ISchemaModelGroup* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISchemaModelGroup_Release(ISchemaModelGroup* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT ISchemaModelGroup_GetTypeInfoCount(ISchemaModelGroup* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT ISchemaModelGroup_GetTypeInfo(ISchemaModelGroup* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT ISchemaModelGroup_get_name(ISchemaModelGroup* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static inline HRESULT ISchemaModelGroup_get_namespaceURI(ISchemaModelGroup* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static inline HRESULT ISchemaModelGroup_get_schema(ISchemaModelGroup* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static inline HRESULT ISchemaModelGroup_get_id(ISchemaModelGroup* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static inline HRESULT ISchemaModelGroup_get_itemType(ISchemaModelGroup* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static inline HRESULT ISchemaModelGroup_get_unhandledAttributes(ISchemaModelGroup* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static inline HRESULT ISchemaModelGroup_writeAnnotation(ISchemaModelGroup* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaParticle methods ***/
static inline HRESULT ISchemaModelGroup_get_minOccurs(ISchemaModelGroup* This,VARIANT *minOccurs) {
    return This->lpVtbl->get_minOccurs(This,minOccurs);
}
static inline HRESULT ISchemaModelGroup_get_maxOccurs(ISchemaModelGroup* This,VARIANT *maxOccurs) {
    return This->lpVtbl->get_maxOccurs(This,maxOccurs);
}
/*** ISchemaModelGroup methods ***/
static 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 inline HRESULT ISchemaAny_QueryInterface(ISchemaAny* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISchemaAny_AddRef(ISchemaAny* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISchemaAny_Release(ISchemaAny* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT ISchemaAny_GetTypeInfoCount(ISchemaAny* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT ISchemaAny_GetTypeInfo(ISchemaAny* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT ISchemaAny_get_name(ISchemaAny* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static inline HRESULT ISchemaAny_get_namespaceURI(ISchemaAny* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static inline HRESULT ISchemaAny_get_schema(ISchemaAny* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static inline HRESULT ISchemaAny_get_id(ISchemaAny* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static inline HRESULT ISchemaAny_get_itemType(ISchemaAny* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static inline HRESULT ISchemaAny_get_unhandledAttributes(ISchemaAny* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static inline HRESULT ISchemaAny_writeAnnotation(ISchemaAny* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaParticle methods ***/
static inline HRESULT ISchemaAny_get_minOccurs(ISchemaAny* This,VARIANT *minOccurs) {
    return This->lpVtbl->get_minOccurs(This,minOccurs);
}
static inline HRESULT ISchemaAny_get_maxOccurs(ISchemaAny* This,VARIANT *maxOccurs) {
    return This->lpVtbl->get_maxOccurs(This,maxOccurs);
}
/*** ISchemaAny methods ***/
static inline HRESULT ISchemaAny_get_namespaces(ISchemaAny* This,ISchemaStringCollection **namespaces) {
    return This->lpVtbl->get_namespaces(This,namespaces);
}
static 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 inline HRESULT ISchemaIdentityConstraint_QueryInterface(ISchemaIdentityConstraint* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISchemaIdentityConstraint_AddRef(ISchemaIdentityConstraint* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISchemaIdentityConstraint_Release(ISchemaIdentityConstraint* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT ISchemaIdentityConstraint_GetTypeInfoCount(ISchemaIdentityConstraint* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT ISchemaIdentityConstraint_GetTypeInfo(ISchemaIdentityConstraint* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT ISchemaIdentityConstraint_get_name(ISchemaIdentityConstraint* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static inline HRESULT ISchemaIdentityConstraint_get_namespaceURI(ISchemaIdentityConstraint* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static inline HRESULT ISchemaIdentityConstraint_get_schema(ISchemaIdentityConstraint* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static inline HRESULT ISchemaIdentityConstraint_get_id(ISchemaIdentityConstraint* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static inline HRESULT ISchemaIdentityConstraint_get_itemType(ISchemaIdentityConstraint* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static inline HRESULT ISchemaIdentityConstraint_get_unhandledAttributes(ISchemaIdentityConstraint* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static inline HRESULT ISchemaIdentityConstraint_writeAnnotation(ISchemaIdentityConstraint* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaIdentityConstraint methods ***/
static inline HRESULT ISchemaIdentityConstraint_get_selector(ISchemaIdentityConstraint* This,BSTR *selector) {
    return This->lpVtbl->get_selector(This,selector);
}
static inline HRESULT ISchemaIdentityConstraint_get_fields(ISchemaIdentityConstraint* This,ISchemaStringCollection **fields) {
    return This->lpVtbl->get_fields(This,fields);
}
static 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 inline HRESULT ISchemaNotation_QueryInterface(ISchemaNotation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG ISchemaNotation_AddRef(ISchemaNotation* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG ISchemaNotation_Release(ISchemaNotation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT ISchemaNotation_GetTypeInfoCount(ISchemaNotation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT ISchemaNotation_GetTypeInfo(ISchemaNotation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static 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 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 inline HRESULT ISchemaNotation_get_name(ISchemaNotation* This,BSTR *name) {
    return This->lpVtbl->get_name(This,name);
}
static inline HRESULT ISchemaNotation_get_namespaceURI(ISchemaNotation* This,BSTR *namespaceURI) {
    return This->lpVtbl->get_namespaceURI(This,namespaceURI);
}
static inline HRESULT ISchemaNotation_get_schema(ISchemaNotation* This,ISchema **schema) {
    return This->lpVtbl->get_schema(This,schema);
}
static inline HRESULT ISchemaNotation_get_id(ISchemaNotation* This,BSTR *id) {
    return This->lpVtbl->get_id(This,id);
}
static inline HRESULT ISchemaNotation_get_itemType(ISchemaNotation* This,SOMITEMTYPE *itemType) {
    return This->lpVtbl->get_itemType(This,itemType);
}
static inline HRESULT ISchemaNotation_get_unhandledAttributes(ISchemaNotation* This,IVBSAXAttributes **attributes) {
    return This->lpVtbl->get_unhandledAttributes(This,attributes);
}
static inline HRESULT ISchemaNotation_writeAnnotation(ISchemaNotation* This,IUnknown *annotationSink,VARIANT_BOOL *isWritten) {
    return This->lpVtbl->writeAnnotation(This,annotationSink,isWritten);
}
/*** ISchemaNotation methods ***/
static inline HRESULT ISchemaNotation_get_systemIdentifier(ISchemaNotation* This,BSTR *uri) {
    return This->lpVtbl->get_systemIdentifier(This,uri);
}
static inline HRESULT ISchemaNotation_get_publicIdentifier(ISchemaNotation* This,BSTR *uri) {
    return This->lpVtbl->get_publicIdentifier(This,uri);
}
#endif
#endif

#endif


#endif  /* __ISchemaNotation_INTERFACE_DEFINED__ */

#ifndef __MSXML2_LIBRARY_DEFINED__
#define __MSXML2_LIBRARY_DEFINED__

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

#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 __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 __IXMLDOMSelection_FWD_DEFINED__
#define __IXMLDOMSelection_FWD_DEFINED__
typedef interface IXMLDOMSelection IXMLDOMSelection;
#ifdef __cplusplus
interface IXMLDOMSelection;
#endif /* __cplusplus */
#endif

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

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

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

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

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

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

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

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

#ifndef __ISchemaParticle_FWD_DEFINED__
#define __ISchemaParticle_FWD_DEFINED__
typedef interface ISchemaParticle ISchemaParticle;
#ifdef __cplusplus
interface ISchemaParticle;
#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 __ISchemaAny_FWD_DEFINED__
#define __ISchemaAny_FWD_DEFINED__
typedef interface ISchemaAny ISchemaAny;
#ifdef __cplusplus
interface ISchemaAny;
#endif /* __cplusplus */
#endif

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

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

#ifndef __ISchemaAttributeGroup_FWD_DEFINED__
#define __ISchemaAttributeGroup_FWD_DEFINED__
typedef interface ISchemaAttributeGroup ISchemaAttributeGroup;
#ifdef __cplusplus
interface ISchemaAttributeGroup;
#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

typedef struct __msxml6_ReferenceRemainingTypes__ {
    enum tagDOMNodeType __tagDomNodeType__;
    DOMNodeType __domNodeType__;
    enum _SERVERXMLHTTP_OPTION __serverXmlHttpOptionEnum__;
    SERVERXMLHTTP_OPTION __serverXmlHttpOption__;
    enum _SXH_SERVER_CERT_OPTION __serverCertOptionEnum__;
    SXH_SERVER_CERT_OPTION __serverCertOption__;
    enum _SXH_PROXY_SETTING __proxySettingEnum__;
    SXH_PROXY_SETTING __proxySetting__;
    enum _SOMITEMTYPE __somItemTypeEnum__;
    SOMITEMTYPE __somItemType__;
    enum _SCHEMAUSE __schemaUseEnum__;
    SCHEMAUSE __schemaUse__;
    enum _SCHEMADERIVATIONMETHOD __schemaDerivationMethodEnum__;
    SCHEMADERIVATIONMETHOD __schemaDerivationMethod__;
    enum _SCHEMACONTENTTYPE __schemaContentTypeEnum__;
    SCHEMACONTENTTYPE __schemaContentType__;
    enum _SCHEMAPROCESSCONTENTS __schemaProcessContentsEnum__;
    SCHEMAPROCESSCONTENTS __schemaProcessContents__;
    enum _SCHEMAWHITESPACE __schemaWhitespaceEnum__;
    SCHEMAWHITESPACE __schemaWhitespace__;
    enum _SCHEMATYPEVARIETY __schemaTypeVarietyEnum__;
    SCHEMATYPEVARIETY __schemaTypeVariety__;
} __msxml6_ReferenceRemainingTypes__;
/*****************************************************************************
 * 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

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

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

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

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

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

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

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

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

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

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

#endif /* __MSXML2_LIBRARY_DEFINED__ */
#define E_XML_NOTWF              0xC00CE223
#define E_XML_NODTD              0xC00CE224
#define E_XML_INVALID            0xC00CE225
#define E_XML_BUFFERTOOSMALL     0xC00CE226
/* 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 /* __msxml6_h__ */
