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

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

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

#ifndef __msxml2_h__
#define __msxml2_h__

/* Forward declarations */

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/* Headers for imported files */

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

#ifdef __cplusplus
extern "C" {
#endif

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    END_INTERFACE
} IXMLElementCollectionVtbl;

interface IXMLElementCollection {
    CONST_VTBL IXMLElementCollectionVtbl* lpVtbl;
};

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

#endif


#endif  /* __IXMLElementCollection_INTERFACE_DEFINED__ */

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

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

    virtual HRESULT STDMETHODCALLTYPE put_tagName(
        BSTR p) = 0;

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

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

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

    virtual HRESULT STDMETHODCALLTYPE removeAttribute(
        BSTR strPropertyName) = 0;

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

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

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

    virtual HRESULT STDMETHODCALLTYPE put_text(
        BSTR p) = 0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    END_INTERFACE
} IXMLElementVtbl;

interface IXMLElement {
    CONST_VTBL IXMLElementVtbl* lpVtbl;
};

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

#endif


#endif  /* __IXMLElement_INTERFACE_DEFINED__ */

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

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

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

    virtual HRESULT STDMETHODCALLTYPE put_nodeValue(
        VARIANT var1) = 0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    virtual HRESULT STDMETHODCALLTYPE put_text(
        BSTR p) = 0;

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

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

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

    virtual HRESULT STDMETHODCALLTYPE put_nodeTypedValue(
        VARIANT var1) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE put_dataType(
        BSTR p) = 0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    END_INTERFACE
} IXMLDOMNodeVtbl;

interface IXMLDOMNode {
    CONST_VTBL IXMLDOMNodeVtbl* lpVtbl;
};

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

/*****************************************************************************
 * IDSOControl interface
 */
#ifndef __IDSOControl_INTERFACE_DEFINED__
#define __IDSOControl_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDSOControl, 0x310afa62, 0x0575, 0x11d2, 0x9c,0xa9, 0x00,0x60,0xb0,0xec,0x3d,0x39);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("310afa62-0575-11d2-9ca9-0060b0ec3d39")
IDSOControl : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_XMLDocument(
        IXMLDOMDocument **ppDoc) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_XMLDocument(
        IXMLDOMDocument *ppDoc) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_JavaDSOCompatible(
        WINBOOL *fJavaDSOCompatible) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_JavaDSOCompatible(
        WINBOOL fJavaDSOCompatible) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDSOControl, 0x310afa62, 0x0575, 0x11d2, 0x9c,0xa9, 0x00,0x60,0xb0,0xec,0x3d,0x39)
#endif
#else
typedef struct IDSOControlVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IDSOControl methods ***/
    HRESULT (STDMETHODCALLTYPE *get_XMLDocument)(
        IDSOControl *This,
        IXMLDOMDocument **ppDoc);

    HRESULT (STDMETHODCALLTYPE *put_XMLDocument)(
        IDSOControl *This,
        IXMLDOMDocument *ppDoc);

    HRESULT (STDMETHODCALLTYPE *get_JavaDSOCompatible)(
        IDSOControl *This,
        WINBOOL *fJavaDSOCompatible);

    HRESULT (STDMETHODCALLTYPE *put_JavaDSOCompatible)(
        IDSOControl *This,
        WINBOOL fJavaDSOCompatible);

    HRESULT (STDMETHODCALLTYPE *get_readyState)(
        IDSOControl *This,
        LONG *state);

    END_INTERFACE
} IDSOControlVtbl;

interface IDSOControl {
    CONST_VTBL IDSOControlVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDSOControl_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDSOControl_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDSOControl_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDSOControl_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDSOControl_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDSOControl_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDSOControl_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDSOControl methods ***/
#define IDSOControl_get_XMLDocument(This,ppDoc) (This)->lpVtbl->get_XMLDocument(This,ppDoc)
#define IDSOControl_put_XMLDocument(This,ppDoc) (This)->lpVtbl->put_XMLDocument(This,ppDoc)
#define IDSOControl_get_JavaDSOCompatible(This,fJavaDSOCompatible) (This)->lpVtbl->get_JavaDSOCompatible(This,fJavaDSOCompatible)
#define IDSOControl_put_JavaDSOCompatible(This,fJavaDSOCompatible) (This)->lpVtbl->put_JavaDSOCompatible(This,fJavaDSOCompatible)
#define IDSOControl_get_readyState(This,state) (This)->lpVtbl->get_readyState(This,state)
#else
/*** IUnknown methods ***/
static inline HRESULT IDSOControl_QueryInterface(IDSOControl* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static inline ULONG IDSOControl_AddRef(IDSOControl* This) {
    return This->lpVtbl->AddRef(This);
}
static inline ULONG IDSOControl_Release(IDSOControl* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static inline HRESULT IDSOControl_GetTypeInfoCount(IDSOControl* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static inline HRESULT IDSOControl_GetTypeInfo(IDSOControl* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static inline HRESULT IDSOControl_GetIDsOfNames(IDSOControl* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static inline HRESULT IDSOControl_Invoke(IDSOControl* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IDSOControl methods ***/
static inline HRESULT IDSOControl_get_XMLDocument(IDSOControl* This,IXMLDOMDocument **ppDoc) {
    return This->lpVtbl->get_XMLDocument(This,ppDoc);
}
static inline HRESULT IDSOControl_put_XMLDocument(IDSOControl* This,IXMLDOMDocument *ppDoc) {
    return This->lpVtbl->put_XMLDocument(This,ppDoc);
}
static inline HRESULT IDSOControl_get_JavaDSOCompatible(IDSOControl* This,WINBOOL *fJavaDSOCompatible) {
    return This->lpVtbl->get_JavaDSOCompatible(This,fJavaDSOCompatible);
}
static inline HRESULT IDSOControl_put_JavaDSOCompatible(IDSOControl* This,WINBOOL fJavaDSOCompatible) {
    return This->lpVtbl->put_JavaDSOCompatible(This,fJavaDSOCompatible);
}
static inline HRESULT IDSOControl_get_readyState(IDSOControl* This,LONG *state) {
    return This->lpVtbl->get_readyState(This,state);
}
#endif
#endif

#endif


#endif  /* __IDSOControl_INTERFACE_DEFINED__ */

/*****************************************************************************
 * XMLDOMDocumentEvents dispinterface
 */
#ifndef __XMLDOMDocumentEvents_DISPINTERFACE_DEFINED__
#define __XMLDOMDocumentEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_XMLDOMDocumentEvents, 0x3efaa427, 0x272f, 0x11d2, 0x83,0x6f, 0x00,0x00,0xf8,0x7a,0x77,0x82);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3efaa427-272f-11d2-836f-0000f87a7782")
XMLDOMDocumentEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLDOMDocumentEvents, 0x3efaa427, 0x272f, 0x11d2, 0x83,0x6f, 0x00,0x00,0xf8,0x7a,0x77,0x82)
#endif
#else
typedef struct XMLDOMDocumentEventsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} XMLDOMDocumentEventsVtbl;

interface XMLDOMDocumentEvents {
    CONST_VTBL XMLDOMDocumentEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define XMLDOMDocumentEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define XMLDOMDocumentEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define XMLDOMDocumentEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define XMLDOMDocumentEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define XMLDOMDocumentEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define XMLDOMDocumentEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define XMLDOMDocumentEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
#else
/*** IUnknown methods ***/
static 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__ */

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

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

/*****************************************************************************
 * DOMDocument26 coclass
 */

DEFINE_GUID(CLSID_DOMDocument26, 0xf5078f1b, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f1b-c551-11d3-89b9-0000f81fe221") DOMDocument26;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMDocument26, 0xf5078f1b, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * DOMDocument30 coclass
 */

DEFINE_GUID(CLSID_DOMDocument30, 0xf5078f32, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f32-c551-11d3-89b9-0000f81fe221") DOMDocument30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMDocument30, 0xf5078f32, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * DOMDocument40 coclass
 */

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

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

/*****************************************************************************
 * DOMDocument60 coclass
 */

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

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

/*****************************************************************************
 * DOMDocument coclass
 */

DEFINE_GUID(CLSID_DOMDocument, 0xf6d90f11, 0x9c73, 0x11d3, 0xb3,0x2e, 0x00,0xc0,0x4f,0x99,0x0b,0xb4);

#ifdef __cplusplus
class DECLSPEC_UUID("f6d90f11-9c73-11d3-b32e-00c04f990bb4") DOMDocument;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(DOMDocument, 0xf6d90f11, 0x9c73, 0x11d3, 0xb3,0x2e, 0x00,0xc0,0x4f,0x99,0x0b,0xb4)
#endif
#endif

/*****************************************************************************
 * FreeThreadedDOMDocument26 coclass
 */

DEFINE_GUID(CLSID_FreeThreadedDOMDocument26, 0xf5078f1c, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f1c-c551-11d3-89b9-0000f81fe221") FreeThreadedDOMDocument26;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FreeThreadedDOMDocument26, 0xf5078f1c, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * FreeThreadedDOMDocument30 coclass
 */

DEFINE_GUID(CLSID_FreeThreadedDOMDocument30, 0xf5078f33, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f33-c551-11d3-89b9-0000f81fe221") FreeThreadedDOMDocument30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FreeThreadedDOMDocument30, 0xf5078f33, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * FreeThreadedDOMDocument40 coclass
 */

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

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

/*****************************************************************************
 * FreeThreadedDOMDocument60 coclass
 */

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

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

/*****************************************************************************
 * FreeThreadedDOMDocument coclass
 */

DEFINE_GUID(CLSID_FreeThreadedDOMDocument, 0xf6d90f12, 0x9c73, 0x11d3, 0xb3,0x2e, 0x00,0xc0,0x4f,0x99,0x0b,0xb4);

#ifdef __cplusplus
class DECLSPEC_UUID("f6d90f12-9c73-11d3-b32e-00c04f990bb4") FreeThreadedDOMDocument;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(FreeThreadedDOMDocument, 0xf6d90f12, 0x9c73, 0x11d3, 0xb3,0x2e, 0x00,0xc0,0x4f,0x99,0x0b,0xb4)
#endif
#endif

/*****************************************************************************
 * XMLHTTP26 coclass
 */

DEFINE_GUID(CLSID_XMLHTTP26, 0xf5078f1e, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f1e-c551-11d3-89b9-0000f81fe221") XMLHTTP26;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLHTTP26, 0xf5078f1e, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * XMLHTTP30 coclass
 */

DEFINE_GUID(CLSID_XMLHTTP30, 0xf5078f35, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f35-c551-11d3-89b9-0000f81fe221") XMLHTTP30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLHTTP30, 0xf5078f35, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * XMLHTTP40 coclass
 */

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

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

/*****************************************************************************
 * XMLHTTP60 coclass
 */

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

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

/*****************************************************************************
 * XMLHTTP coclass
 */

DEFINE_GUID(CLSID_XMLHTTP, 0xf6d90f16, 0x9c73, 0x11d3, 0xb3,0x2e, 0x00,0xc0,0x4f,0x99,0x0b,0xb4);

#ifdef __cplusplus
class DECLSPEC_UUID("f6d90f16-9c73-11d3-b32e-00c04f990bb4") XMLHTTP;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLHTTP, 0xf6d90f16, 0x9c73, 0x11d3, 0xb3,0x2e, 0x00,0xc0,0x4f,0x99,0x0b,0xb4)
#endif
#endif

/*****************************************************************************
 * ServerXMLHTTP30 coclass
 */

DEFINE_GUID(CLSID_ServerXMLHTTP30, 0xafb40ffd, 0xb609, 0x40a3, 0x98,0x28, 0xf8,0x8b,0xbe,0x11,0xe4,0xe3);

#ifdef __cplusplus
class DECLSPEC_UUID("afb40ffd-b609-40a3-9828-f88bbe11e4e3") ServerXMLHTTP30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ServerXMLHTTP30, 0xafb40ffd, 0xb609, 0x40a3, 0x98,0x28, 0xf8,0x8b,0xbe,0x11,0xe4,0xe3)
#endif
#endif

/*****************************************************************************
 * ServerXMLHTTP40 coclass
 */

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

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

/*****************************************************************************
 * ServerXMLHTTP60 coclass
 */

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

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

/*****************************************************************************
 * ServerXMLHTTP coclass
 */

DEFINE_GUID(CLSID_ServerXMLHTTP, 0xafba6b42, 0x5692, 0x48ea, 0x81,0x41, 0xdc,0x51,0x7d,0xcf,0x0e,0xf1);

#ifdef __cplusplus
class DECLSPEC_UUID("afba6b42-5692-48ea-8141-dc517dcf0ef1") ServerXMLHTTP;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ServerXMLHTTP, 0xafba6b42, 0x5692, 0x48ea, 0x81,0x41, 0xdc,0x51,0x7d,0xcf,0x0e,0xf1)
#endif
#endif

/*****************************************************************************
 * XMLSchemaCache26 coclass
 */

DEFINE_GUID(CLSID_XMLSchemaCache26, 0xf5078f1d, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f1d-c551-11d3-89b9-0000f81fe221") XMLSchemaCache26;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLSchemaCache26, 0xf5078f1d, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * XMLSchemaCache30 coclass
 */

DEFINE_GUID(CLSID_XMLSchemaCache30, 0xf5078f34, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f34-c551-11d3-89b9-0000f81fe221") XMLSchemaCache30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLSchemaCache30, 0xf5078f34, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * XMLSchemaCache40 coclass
 */

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

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

/*****************************************************************************
 * XMLSchemaCache coclass
 */

DEFINE_GUID(CLSID_XMLSchemaCache, 0x373984c9, 0xb845, 0x449b, 0x91,0xe7, 0x45,0xac,0x83,0x03,0x6a,0xde);

#ifdef __cplusplus
class DECLSPEC_UUID("373984c9-b845-449b-91e7-45ac83036ade") XMLSchemaCache;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XMLSchemaCache, 0x373984c9, 0xb845, 0x449b, 0x91,0xe7, 0x45,0xac,0x83,0x03,0x6a,0xde)
#endif
#endif

/*****************************************************************************
 * XSLTemplate26 coclass
 */

DEFINE_GUID(CLSID_XSLTemplate26, 0xf5078f21, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f21-c551-11d3-89b9-0000f81fe221") XSLTemplate26;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XSLTemplate26, 0xf5078f21, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * XSLTemplate30 coclass
 */

DEFINE_GUID(CLSID_XSLTemplate30, 0xf5078f36, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21);

#ifdef __cplusplus
class DECLSPEC_UUID("f5078f36-c551-11d3-89b9-0000f81fe221") XSLTemplate30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XSLTemplate30, 0xf5078f36, 0xc551, 0x11d3, 0x89,0xb9, 0x00,0x00,0xf8,0x1f,0xe2,0x21)
#endif
#endif

/*****************************************************************************
 * XSLTemplate40 coclass
 */

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

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

/*****************************************************************************
 * XSLTemplate60 coclass
 */

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

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

/*****************************************************************************
 * XSLTemplate coclass
 */

DEFINE_GUID(CLSID_XSLTemplate, 0x2933bf94, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60);

#ifdef __cplusplus
class DECLSPEC_UUID("2933bf94-7b36-11d2-b20e-00c04f983e60") XSLTemplate;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(XSLTemplate, 0x2933bf94, 0x7b36, 0x11d2, 0xb2,0x0e, 0x00,0xc0,0x4f,0x98,0x3e,0x60)
#endif
#endif

/*****************************************************************************
 * ISAXAttributes interface
 */
#ifndef __ISAXAttributes_INTERFACE_DEFINED__
#define __ISAXAttributes_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISAXAttributes, 0xf078abe1, 0x45d2, 0x4832, 0x91,0xea, 0x44,0x66,0xce,0x2f,0x25,0xc9);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("f078abe1-45d2-4832-91ea-4466ce2f25c9")
ISAXAttributes : public IUnknown
{
    virtual HRESULT STDMETHODCALLTYPE getLength(
        int *length) = 0;

    virtual HRESULT STDMETHODCALLTYPE getURI(
        int nIndex,
        const WCHAR **pUrl,
        int *pUriSize) = 0;

    virtual HRESULT STDMETHODCALLTYPE getLocalName(
        int nIndex,
        const WCHAR **pLocalName,
        int *pLocalNameLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE getQName(
        int nIndex,
        const WCHAR **pQName,
        int *pQNameLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE getName(
        int nIndex,
        const WCHAR **pUri,
        int *pUriLength,
        const WCHAR **pLocalName,
        int *pLocalNameSize,
        const WCHAR **pQName,
        int *pQNameLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE getIndexFromName(
        const WCHAR *pUri,
        int cUriLength,
        const WCHAR *pLocalName,
        int cocalNameLength,
        int *index) = 0;

    virtual HRESULT STDMETHODCALLTYPE getIndexFromQName(
        const WCHAR *pQName,
        int nQNameLength,
        int *index) = 0;

    virtual HRESULT STDMETHODCALLTYPE getType(
        int nIndex,
        const WCHAR **pType,
        int *pTypeLength) = 0;

    virtual HRESULT STDMETHODCALLTYPE getTypeFromName(
        const WCHAR *pUri,
        int nUri,
        const WCHAR *pLocalName,
        int nLocalName,
        const WCHAR **pType,
        int *nType) = 0;

    virtual HRESULT STDMETHODCALLTYPE getTypeFromQName(
        const WCHAR *pQName,
        int nQName,
        const WCHAR **pType,
        int *nType) = 0;

    virtual HRESULT STDMETHODCALLTYPE getValue(
        int nIndex,
        const WCHAR **pValue,
        int *nValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE getValueFromName(
        const WCHAR *pUri,
        int nUri,
        const WCHAR *pLocalName,
        int nLocalName,
        const WCHAR **pValue,
        int *nValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE getValueFromQName(
        const WCHAR *pQName,
        int nQName,
        const WCHAR **pValue,
        int *nValue) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISAXAttributes, 0xf078abe1, 0x45d2, 0x4832, 0x91,0xea, 0x44,0x66,0xce,0x2f,0x25,0xc9)
#endif
#else
typedef struct ISAXAttributesVtbl {
    BEGIN_INTERFACE

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

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

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

    /*** ISAXAttributes methods ***/
    HRESULT (STDMETHODCALLTYPE *getLength)(
        ISAXAttributes *This,
        int *length);

    HRESULT (STDMETHODCALLTYPE *getURI)(
        ISAXAttributes *This,
        int nIndex,
        const WCHAR **pUrl,
        int *pUriSize);

    HRESULT (STDMETHODCALLTYPE *getLocalName)(
        ISAXAttributes *This,
        int nIndex,
        const WCHAR **pLocalName,
        int *pLocalNameLength);

    HRESULT (STDMETHODCALLTYPE *getQName)(
        ISAXAttributes *This,
        int nIndex,
        const WCHAR **pQName,
        int *pQNameLength);

    HRESULT (STDMETHODCALLTYPE *getName)(
        ISAXAttributes *This,
        int nIndex,
        const WCHAR **pUri,
        int *pUriLength,
        const WCHAR **pLocalName,
        int *pLocalNameSize,
        const WCHAR **pQName,
        int *pQNameLength);

    HRESULT (STDMETHODCALLTYPE *getIndexFromName)(
        ISAXAttributes *This,
        const WCHAR *pUri,
        int cUriLength,
        const WCHAR *pLocalName,
        int cocalNameLength,
        int *index);

    HRESULT (STDMETHODCALLTYPE *getIndexFromQName)(
        ISAXAttributes *This,
        const WCHAR *pQName,
        int nQNameLength,
        int *index);

    HRESULT (STDMETHODCALLTYPE *getType)(
        ISAXAttributes *This,
        int nIndex,
        const WCHAR **pType,
        int *pTypeLength);

    HRESULT (STDMETHODCALLTYPE *getTypeFromName)(
        ISAXAttributes *This,
        const WCHAR *pUri,
        int nUri,
        const WCHAR *pLocalName,
        int nLocalName,
        const WCHAR **pType,
        int *nType);

    HRESULT (STDMETHODCALLTYPE *getTypeFromQName)(
        ISAXAttributes *This,
        const WCHAR *pQName,
        int nQName,
        const WCHAR **pType,
        int *nType);

    HRESULT (STDMETHODCALLTYPE *getValue)(
        ISAXAttributes *This,
        int nIndex,
        const WCHAR **pValue,
        int *nValue);

    HRESULT (STDMETHODCALLTYPE *getValueFromName)(
        ISAXAttributes *This,
        const WCHAR *pUri,
        int nUri,
        const WCHAR *pLocalName,
        int nLocalName,
        const WCHAR **pValue,
        int *nValue);

    HRESULT (STDMETHODCALLTYPE *getValueFromQName)(
        ISAXAttributes *This,
        const WCHAR *pQName,
        int nQName,
        const WCHAR **pValue,
        int *nValue);

    END_INTERFACE
} ISAXAttributesVtbl;

interface ISAXAttributes {
    CONST_VTBL ISAXAttributesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISAXAttributes_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISAXAttributes_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISAXAttributes_Release(This) (This)->lpVtbl->Release(This)
/*** ISAXAttributes methods ***/
#define ISAXAttributes_getLength(This,length) (This)->lpVtbl->getLength(This,length)
#define ISAXAttributes_getURI(This,nIndex,pUrl,pUriSize) (This)->lpVtbl->getURI(This,nIndex,pUrl,pUriSize)
#define ISAXAttributes_getLocalName(This,nIndex,pLocalName,pLocalNameLength) (This)->lpVtbl->getLocalName(This,nIndex,pLocalName,pLocalNameLength)
#define ISAXAttributes_getQName(This,nIndex,pQName,pQNameLength) (This)->lpVtbl->getQName(This,nIndex,pQName,pQNameLength)
#define ISAXAttributes_getName(This,nIndex,pUri,pUriLength,pLocalName,pLocalNameSize,pQName,pQNameLength) (This)->lpVtbl->getName(This,nIndex,pUri,pUriLength,pLocalName,pLocalNameSize,pQName,pQNameLength)
#define ISAXAttributes_getIndexFromName(This,pUri,cUriLength,pLocalName,cocalNameLength,index) (This)->lpVtbl->getIndexFromName(This,pUri,cUriLength,pLocalName,cocalNameLength,index)
#define ISAXAttributes_getIndexFromQName(This,pQName,nQNameLength,index) (This)->lpVtbl->getIndexFromQName(This,pQName,nQNameLength,index)
#define ISAXAttributes_getType(This,nIndex,pType,pTypeLength) (This)->lpVtbl->getType(This,nIndex,pType,pTypeLength)
#define ISAXAttributes_getTypeFromName(This,pUri,nUri,pLocalName,nLocalName,pType,nType) (This)->lpVtbl->getTypeFromName(This,pUri,nUri,pLocalName,nLocalName,pType,nType)
#define ISAXAttributes_getTypeFromQName(This,pQName,nQName,pType,nType) (This)->lpVtbl->getTypeFromQName(This,pQName,nQName,pType,nType)
#define ISAXAttributes_getValue(This,nIndex,pValue,nValue) (This)->lpVtbl->getValue(This,nIndex,pValue,nValue)
#define ISAXAttributes_getValueFromName(This,pUri,nUri,pLocalName,nLocalName,pValue,nValue) (This)->lpVtbl->getValueFromName(This,pUri,nUri,pLocalName,nLocalName,pValue,nValue)
#define ISAXAttributes_getValueFromQName(This,pQName,nQName,pValue,nValue) (This)->lpVtbl->getValueFromQName(This,pQName,nQName,pValue,nValue)
#else
/*** IUnknown methods ***/
static 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__ */

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

/*****************************************************************************
 * SAXXMLReader30 coclass
 */

DEFINE_GUID(CLSID_SAXXMLReader30, 0x3124c396, 0xfb13, 0x4836, 0xa6,0xad, 0x13,0x17,0xf1,0x71,0x36,0x88);

#ifdef __cplusplus
class DECLSPEC_UUID("3124c396-fb13-4836-a6ad-1317f1713688") SAXXMLReader30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SAXXMLReader30, 0x3124c396, 0xfb13, 0x4836, 0xa6,0xad, 0x13,0x17,0xf1,0x71,0x36,0x88)
#endif
#endif

/*****************************************************************************
 * SAXXMLReader40 coclass
 */

DEFINE_GUID(CLSID_SAXXMLReader40, 0x7c6e29bc, 0x8b8b, 0x4c3d, 0x85,0x9e, 0xaf,0x6c,0xd1,0x58,0xbe,0x0f);

#ifdef __cplusplus
class DECLSPEC_UUID("7c6e29bc-8b8b-4c3d-859e-af6cd158be0f") SAXXMLReader40;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SAXXMLReader40, 0x7c6e29bc, 0x8b8b, 0x4c3d, 0x85,0x9e, 0xaf,0x6c,0xd1,0x58,0xbe,0x0f)
#endif
#endif

/*****************************************************************************
 * SAXXMLReader60 coclass
 */

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

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

/*****************************************************************************
 * SAXXMLReader coclass
 */

DEFINE_GUID(CLSID_SAXXMLReader, 0x079aa557, 0x4a18, 0x424a, 0x8e,0xee, 0xe3,0x9f,0x0a,0x8d,0x41,0xb9);

#ifdef __cplusplus
class DECLSPEC_UUID("079aa557-4a18-424a-8eee-e39f0a8d41b9") SAXXMLReader;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SAXXMLReader, 0x079aa557, 0x4a18, 0x424a, 0x8e,0xee, 0xe3,0x9f,0x0a,0x8d,0x41,0xb9)
#endif
#endif

/*****************************************************************************
 * MXHTMLWriter coclass
 */

DEFINE_GUID(CLSID_MXHTMLWriter, 0xa4c23ec3, 0x6b70, 0x4466, 0x91,0x27, 0x55,0x00,0x77,0x23,0x99,0x78);

#ifdef __cplusplus
class DECLSPEC_UUID("a4c23ec3-6b70-4466-9127-550077239978") MXHTMLWriter;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXHTMLWriter, 0xa4c23ec3, 0x6b70, 0x4466, 0x91,0x27, 0x55,0x00,0x77,0x23,0x99,0x78)
#endif
#endif

/*****************************************************************************
 * MXHTMLWriter30 coclass
 */

DEFINE_GUID(CLSID_MXHTMLWriter30, 0x853d1540, 0xc1a7, 0x4aa9, 0xa2,0x26, 0x4d,0x3b,0xd3,0x01,0x14,0x6d);

#ifdef __cplusplus
class DECLSPEC_UUID("853d1540-c1a7-4aa9-a226-4d3bd301146d") MXHTMLWriter30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXHTMLWriter30, 0x853d1540, 0xc1a7, 0x4aa9, 0xa2,0x26, 0x4d,0x3b,0xd3,0x01,0x14,0x6d)
#endif
#endif

/*****************************************************************************
 * MXHTMLWriter40 coclass
 */

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

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

/*****************************************************************************
 * MXHTMLWriter60 coclass
 */

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

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

/*****************************************************************************
 * MXXMLWriter30 coclass
 */

DEFINE_GUID(CLSID_MXXMLWriter30, 0x3d813dfe, 0x6c91, 0x4a4e, 0x8f,0x41, 0x04,0x34,0x6a,0x84,0x1d,0x9c);

#ifdef __cplusplus
class DECLSPEC_UUID("3d813dfe-6c91-4a4e-8f41-04346a841d9c") MXXMLWriter30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXXMLWriter30, 0x3d813dfe, 0x6c91, 0x4a4e, 0x8f,0x41, 0x04,0x34,0x6a,0x84,0x1d,0x9c)
#endif
#endif

/*****************************************************************************
 * MXXMLWriter40 coclass
 */

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

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

/*****************************************************************************
 * MXXMLWriter60 coclass
 */

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

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

/*****************************************************************************
 * MXXMLWriter coclass
 */

DEFINE_GUID(CLSID_MXXMLWriter, 0xfc220ad8, 0xa72a, 0x4ee8, 0x92,0x6e, 0x0b,0x7a,0xd1,0x52,0xa0,0x20);

#ifdef __cplusplus
class DECLSPEC_UUID("fc220ad8-a72a-4ee8-926e-0b7ad152a020") MXXMLWriter;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(MXXMLWriter, 0xfc220ad8, 0xa72a, 0x4ee8, 0x92,0x6e, 0x0b,0x7a,0xd1,0x52,0xa0,0x20)
#endif
#endif

/*****************************************************************************
 * MXNamespaceManager coclass
 */

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

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

/*****************************************************************************
 * MXNamespaceManager40 coclass
 */

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

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

/*****************************************************************************
 * MXNamespaceManager60 coclass
 */

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

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

/*****************************************************************************
 * SAXAttributes30 coclass
 */

DEFINE_GUID(CLSID_SAXAttributes30, 0x3e784a01, 0xf3ae, 0x4dc0, 0x93,0x54, 0x95,0x26,0xb9,0x37,0x0e,0xba);

#ifdef __cplusplus
class DECLSPEC_UUID("3e784a01-f3ae-4dc0-9354-9526b9370eba") SAXAttributes30;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SAXAttributes30, 0x3e784a01, 0xf3ae, 0x4dc0, 0x93,0x54, 0x95,0x26,0xb9,0x37,0x0e,0xba)
#endif
#endif

/*****************************************************************************
 * SAXAttributes40 coclass
 */

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

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

/*****************************************************************************
 * SAXAttributes60 coclass
 */

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

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

/*****************************************************************************
 * SAXAttributes coclass
 */

DEFINE_GUID(CLSID_SAXAttributes, 0x4dd441ad, 0x526d, 0x4a77, 0x9f,0x1b, 0x98,0x41,0xed,0x80,0x2f,0xb0);

#ifdef __cplusplus
class DECLSPEC_UUID("4dd441ad-526d-4a77-9f1b-9841ed802fb0") SAXAttributes;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SAXAttributes, 0x4dd441ad, 0x526d, 0x4a77, 0x9f,0x1b, 0x98,0x41,0xed,0x80,0x2f,0xb0)
#endif
#endif

#define E_XML_NOTWF              0xC00CE223
#define E_XML_NODTD              0xC00CE224
#define E_XML_INVALID            0xC00CE225
#define E_XML_BUFFERTOOSMALL     0xC00CE226
#endif /* __MSXML2_LIBRARY_DEFINED__ */
/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
ULONG           __RPC_USER VARIANT_UserSize     (ULONG *, ULONG, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserMarshal  (ULONG *, unsigned char *, VARIANT *);
unsigned char * __RPC_USER VARIANT_UserUnmarshal(ULONG *, unsigned char *, VARIANT *);
void            __RPC_USER VARIANT_UserFree     (ULONG *, VARIANT *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __msxml2_h__ */
