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