/*** Autogenerated by WIDL 1.6 from wbemdisp.idl - Do not edit ***/

#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif

#include <rpc.h>
#include <rpcndr.h>

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

#ifndef __wbemdisp_h__
#define __wbemdisp_h__

/* Forward declarations */

#ifndef __SWbemLocator_FWD_DEFINED__
#define __SWbemLocator_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemLocator SWbemLocator;
#else
typedef struct SWbemLocator SWbemLocator;
#endif /* defined __cplusplus */
#endif /* defined __SWbemLocator_FWD_DEFINED__ */

#ifndef __SWbemNamedValueSet_FWD_DEFINED__
#define __SWbemNamedValueSet_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemNamedValueSet SWbemNamedValueSet;
#else
typedef struct SWbemNamedValueSet SWbemNamedValueSet;
#endif /* defined __cplusplus */
#endif /* defined __SWbemNamedValueSet_FWD_DEFINED__ */

#ifndef __SWbemObjectPath_FWD_DEFINED__
#define __SWbemObjectPath_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemObjectPath SWbemObjectPath;
#else
typedef struct SWbemObjectPath SWbemObjectPath;
#endif /* defined __cplusplus */
#endif /* defined __SWbemObjectPath_FWD_DEFINED__ */

#ifndef __SWbemLastError_FWD_DEFINED__
#define __SWbemLastError_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemLastError SWbemLastError;
#else
typedef struct SWbemLastError SWbemLastError;
#endif /* defined __cplusplus */
#endif /* defined __SWbemLastError_FWD_DEFINED__ */

#ifndef __SWbemSink_FWD_DEFINED__
#define __SWbemSink_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemSink SWbemSink;
#else
typedef struct SWbemSink SWbemSink;
#endif /* defined __cplusplus */
#endif /* defined __SWbemSink_FWD_DEFINED__ */

#ifndef __SWbemDateTime_FWD_DEFINED__
#define __SWbemDateTime_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemDateTime SWbemDateTime;
#else
typedef struct SWbemDateTime SWbemDateTime;
#endif /* defined __cplusplus */
#endif /* defined __SWbemDateTime_FWD_DEFINED__ */

#ifndef __SWbemRefresher_FWD_DEFINED__
#define __SWbemRefresher_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemRefresher SWbemRefresher;
#else
typedef struct SWbemRefresher SWbemRefresher;
#endif /* defined __cplusplus */
#endif /* defined __SWbemRefresher_FWD_DEFINED__ */

#ifndef __SWbemServices_FWD_DEFINED__
#define __SWbemServices_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemServices SWbemServices;
#else
typedef struct SWbemServices SWbemServices;
#endif /* defined __cplusplus */
#endif /* defined __SWbemServices_FWD_DEFINED__ */

#ifndef __SWbemServicesEx_FWD_DEFINED__
#define __SWbemServicesEx_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemServicesEx SWbemServicesEx;
#else
typedef struct SWbemServicesEx SWbemServicesEx;
#endif /* defined __cplusplus */
#endif /* defined __SWbemServicesEx_FWD_DEFINED__ */

#ifndef __SWbemObject_FWD_DEFINED__
#define __SWbemObject_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemObject SWbemObject;
#else
typedef struct SWbemObject SWbemObject;
#endif /* defined __cplusplus */
#endif /* defined __SWbemObject_FWD_DEFINED__ */

#ifndef __SWbemObjectEx_FWD_DEFINED__
#define __SWbemObjectEx_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemObjectEx SWbemObjectEx;
#else
typedef struct SWbemObjectEx SWbemObjectEx;
#endif /* defined __cplusplus */
#endif /* defined __SWbemObjectEx_FWD_DEFINED__ */

#ifndef __SWbemObjectSet_FWD_DEFINED__
#define __SWbemObjectSet_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemObjectSet SWbemObjectSet;
#else
typedef struct SWbemObjectSet SWbemObjectSet;
#endif /* defined __cplusplus */
#endif /* defined __SWbemObjectSet_FWD_DEFINED__ */

#ifndef __SWbemNamedValue_FWD_DEFINED__
#define __SWbemNamedValue_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemNamedValue SWbemNamedValue;
#else
typedef struct SWbemNamedValue SWbemNamedValue;
#endif /* defined __cplusplus */
#endif /* defined __SWbemNamedValue_FWD_DEFINED__ */

#ifndef __SWbemQualifier_FWD_DEFINED__
#define __SWbemQualifier_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemQualifier SWbemQualifier;
#else
typedef struct SWbemQualifier SWbemQualifier;
#endif /* defined __cplusplus */
#endif /* defined __SWbemQualifier_FWD_DEFINED__ */

#ifndef __SWbemQualifierSet_FWD_DEFINED__
#define __SWbemQualifierSet_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemQualifierSet SWbemQualifierSet;
#else
typedef struct SWbemQualifierSet SWbemQualifierSet;
#endif /* defined __cplusplus */
#endif /* defined __SWbemQualifierSet_FWD_DEFINED__ */

#ifndef __SWbemProperty_FWD_DEFINED__
#define __SWbemProperty_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemProperty SWbemProperty;
#else
typedef struct SWbemProperty SWbemProperty;
#endif /* defined __cplusplus */
#endif /* defined __SWbemProperty_FWD_DEFINED__ */

#ifndef __SWbemPropertySet_FWD_DEFINED__
#define __SWbemPropertySet_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemPropertySet SWbemPropertySet;
#else
typedef struct SWbemPropertySet SWbemPropertySet;
#endif /* defined __cplusplus */
#endif /* defined __SWbemPropertySet_FWD_DEFINED__ */

#ifndef __SWbemMethod_FWD_DEFINED__
#define __SWbemMethod_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemMethod SWbemMethod;
#else
typedef struct SWbemMethod SWbemMethod;
#endif /* defined __cplusplus */
#endif /* defined __SWbemMethod_FWD_DEFINED__ */

#ifndef __SWbemMethodSet_FWD_DEFINED__
#define __SWbemMethodSet_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemMethodSet SWbemMethodSet;
#else
typedef struct SWbemMethodSet SWbemMethodSet;
#endif /* defined __cplusplus */
#endif /* defined __SWbemMethodSet_FWD_DEFINED__ */

#ifndef __SWbemEventSource_FWD_DEFINED__
#define __SWbemEventSource_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemEventSource SWbemEventSource;
#else
typedef struct SWbemEventSource SWbemEventSource;
#endif /* defined __cplusplus */
#endif /* defined __SWbemEventSource_FWD_DEFINED__ */

#ifndef __SWbemSecurity_FWD_DEFINED__
#define __SWbemSecurity_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemSecurity SWbemSecurity;
#else
typedef struct SWbemSecurity SWbemSecurity;
#endif /* defined __cplusplus */
#endif /* defined __SWbemSecurity_FWD_DEFINED__ */

#ifndef __SWbemPrivilege_FWD_DEFINED__
#define __SWbemPrivilege_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemPrivilege SWbemPrivilege;
#else
typedef struct SWbemPrivilege SWbemPrivilege;
#endif /* defined __cplusplus */
#endif /* defined __SWbemPrivilege_FWD_DEFINED__ */

#ifndef __SWbemPrivilegeSet_FWD_DEFINED__
#define __SWbemPrivilegeSet_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemPrivilegeSet SWbemPrivilegeSet;
#else
typedef struct SWbemPrivilegeSet SWbemPrivilegeSet;
#endif /* defined __cplusplus */
#endif /* defined __SWbemPrivilegeSet_FWD_DEFINED__ */

#ifndef __SWbemRefreshableItem_FWD_DEFINED__
#define __SWbemRefreshableItem_FWD_DEFINED__
#ifdef __cplusplus
typedef class SWbemRefreshableItem SWbemRefreshableItem;
#else
typedef struct SWbemRefreshableItem SWbemRefreshableItem;
#endif /* defined __cplusplus */
#endif /* defined __SWbemRefreshableItem_FWD_DEFINED__ */

#ifndef __ISWbemLocator_FWD_DEFINED__
#define __ISWbemLocator_FWD_DEFINED__
typedef interface ISWbemLocator ISWbemLocator;
#endif

#ifndef __ISWbemServices_FWD_DEFINED__
#define __ISWbemServices_FWD_DEFINED__
typedef interface ISWbemServices ISWbemServices;
#endif

#ifndef __ISWbemServicesEx_FWD_DEFINED__
#define __ISWbemServicesEx_FWD_DEFINED__
typedef interface ISWbemServicesEx ISWbemServicesEx;
#endif

#ifndef __ISWbemObject_FWD_DEFINED__
#define __ISWbemObject_FWD_DEFINED__
typedef interface ISWbemObject ISWbemObject;
#endif

#ifndef __ISWbemObjectEx_FWD_DEFINED__
#define __ISWbemObjectEx_FWD_DEFINED__
typedef interface ISWbemObjectEx ISWbemObjectEx;
#endif

#ifndef __ISWbemLastError_FWD_DEFINED__
#define __ISWbemLastError_FWD_DEFINED__
typedef interface ISWbemLastError ISWbemLastError;
#endif

#ifndef __ISWbemObjectSet_FWD_DEFINED__
#define __ISWbemObjectSet_FWD_DEFINED__
typedef interface ISWbemObjectSet ISWbemObjectSet;
#endif

#ifndef __ISWbemNamedValueSet_FWD_DEFINED__
#define __ISWbemNamedValueSet_FWD_DEFINED__
typedef interface ISWbemNamedValueSet ISWbemNamedValueSet;
#endif

#ifndef __ISWbemNamedValue_FWD_DEFINED__
#define __ISWbemNamedValue_FWD_DEFINED__
typedef interface ISWbemNamedValue ISWbemNamedValue;
#endif

#ifndef __ISWbemObjectPath_FWD_DEFINED__
#define __ISWbemObjectPath_FWD_DEFINED__
typedef interface ISWbemObjectPath ISWbemObjectPath;
#endif

#ifndef __ISWbemProperty_FWD_DEFINED__
#define __ISWbemProperty_FWD_DEFINED__
typedef interface ISWbemProperty ISWbemProperty;
#endif

#ifndef __ISWbemPropertySet_FWD_DEFINED__
#define __ISWbemPropertySet_FWD_DEFINED__
typedef interface ISWbemPropertySet ISWbemPropertySet;
#endif

#ifndef __ISWbemQualifier_FWD_DEFINED__
#define __ISWbemQualifier_FWD_DEFINED__
typedef interface ISWbemQualifier ISWbemQualifier;
#endif

#ifndef __ISWbemQualifierSet_FWD_DEFINED__
#define __ISWbemQualifierSet_FWD_DEFINED__
typedef interface ISWbemQualifierSet ISWbemQualifierSet;
#endif

#ifndef __ISWbemMethod_FWD_DEFINED__
#define __ISWbemMethod_FWD_DEFINED__
typedef interface ISWbemMethod ISWbemMethod;
#endif

#ifndef __ISWbemMethodSet_FWD_DEFINED__
#define __ISWbemMethodSet_FWD_DEFINED__
typedef interface ISWbemMethodSet ISWbemMethodSet;
#endif

#ifndef __ISWbemSink_FWD_DEFINED__
#define __ISWbemSink_FWD_DEFINED__
typedef interface ISWbemSink ISWbemSink;
#endif

#ifndef __ISWbemSinkEvents_FWD_DEFINED__
#define __ISWbemSinkEvents_FWD_DEFINED__
typedef interface ISWbemSinkEvents ISWbemSinkEvents;
#endif

#ifndef __ISWbemEventSource_FWD_DEFINED__
#define __ISWbemEventSource_FWD_DEFINED__
typedef interface ISWbemEventSource ISWbemEventSource;
#endif

#ifndef __ISWbemSecurity_FWD_DEFINED__
#define __ISWbemSecurity_FWD_DEFINED__
typedef interface ISWbemSecurity ISWbemSecurity;
#endif

#ifndef __ISWbemPrivilege_FWD_DEFINED__
#define __ISWbemPrivilege_FWD_DEFINED__
typedef interface ISWbemPrivilege ISWbemPrivilege;
#endif

#ifndef __ISWbemPrivilegeSet_FWD_DEFINED__
#define __ISWbemPrivilegeSet_FWD_DEFINED__
typedef interface ISWbemPrivilegeSet ISWbemPrivilegeSet;
#endif

#ifndef __ISWbemDateTime_FWD_DEFINED__
#define __ISWbemDateTime_FWD_DEFINED__
typedef interface ISWbemDateTime ISWbemDateTime;
#endif

#ifndef __ISWbemRefreshableItem_FWD_DEFINED__
#define __ISWbemRefreshableItem_FWD_DEFINED__
typedef interface ISWbemRefreshableItem ISWbemRefreshableItem;
#endif

#ifndef __ISWbemRefresher_FWD_DEFINED__
#define __ISWbemRefresher_FWD_DEFINED__
typedef interface ISWbemRefresher ISWbemRefresher;
#endif

/* Headers for imported files */

#include <dispex.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER within this package.
 */

#include <winapifamily.h>

#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

DEFINE_GUID(LIBID_WbemScripting, 0x565783c6, 0xcb41, 0x11d1, 0x8b,0x02, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifndef __ISWbemDateTime_FWD_DEFINED__
#define __ISWbemDateTime_FWD_DEFINED__
typedef interface ISWbemDateTime ISWbemDateTime;
#endif

#ifndef __ISWbemEventSource_FWD_DEFINED__
#define __ISWbemEventSource_FWD_DEFINED__
typedef interface ISWbemEventSource ISWbemEventSource;
#endif

#ifndef __ISWbemLastError_FWD_DEFINED__
#define __ISWbemLastError_FWD_DEFINED__
typedef interface ISWbemLastError ISWbemLastError;
#endif

#ifndef __ISWbemLocator_FWD_DEFINED__
#define __ISWbemLocator_FWD_DEFINED__
typedef interface ISWbemLocator ISWbemLocator;
#endif

#ifndef __ISWbemMethod_FWD_DEFINED__
#define __ISWbemMethod_FWD_DEFINED__
typedef interface ISWbemMethod ISWbemMethod;
#endif

#ifndef __ISWbemMethodSet_FWD_DEFINED__
#define __ISWbemMethodSet_FWD_DEFINED__
typedef interface ISWbemMethodSet ISWbemMethodSet;
#endif

#ifndef __ISWbemNamedValue_FWD_DEFINED__
#define __ISWbemNamedValue_FWD_DEFINED__
typedef interface ISWbemNamedValue ISWbemNamedValue;
#endif

#ifndef __ISWbemNamedValueSet_FWD_DEFINED__
#define __ISWbemNamedValueSet_FWD_DEFINED__
typedef interface ISWbemNamedValueSet ISWbemNamedValueSet;
#endif

#ifndef __ISWbemObject_FWD_DEFINED__
#define __ISWbemObject_FWD_DEFINED__
typedef interface ISWbemObject ISWbemObject;
#endif

#ifndef __ISWbemObjectEx_FWD_DEFINED__
#define __ISWbemObjectEx_FWD_DEFINED__
typedef interface ISWbemObjectEx ISWbemObjectEx;
#endif

#ifndef __ISWbemObjectPath_FWD_DEFINED__
#define __ISWbemObjectPath_FWD_DEFINED__
typedef interface ISWbemObjectPath ISWbemObjectPath;
#endif

#ifndef __ISWbemObjectSet_FWD_DEFINED__
#define __ISWbemObjectSet_FWD_DEFINED__
typedef interface ISWbemObjectSet ISWbemObjectSet;
#endif

#ifndef __ISWbemQualifier_FWD_DEFINED__
#define __ISWbemQualifier_FWD_DEFINED__
typedef interface ISWbemQualifier ISWbemQualifier;
#endif

#ifndef __ISWbemQualifierSet_FWD_DEFINED__
#define __ISWbemQualifierSet_FWD_DEFINED__
typedef interface ISWbemQualifierSet ISWbemQualifierSet;
#endif

#ifndef __ISWbemPrivilege_FWD_DEFINED__
#define __ISWbemPrivilege_FWD_DEFINED__
typedef interface ISWbemPrivilege ISWbemPrivilege;
#endif

#ifndef __ISWbemPrivilegeSet_FWD_DEFINED__
#define __ISWbemPrivilegeSet_FWD_DEFINED__
typedef interface ISWbemPrivilegeSet ISWbemPrivilegeSet;
#endif

#ifndef __ISWbemProperty_FWD_DEFINED__
#define __ISWbemProperty_FWD_DEFINED__
typedef interface ISWbemProperty ISWbemProperty;
#endif

#ifndef __ISWbemPropertySet_FWD_DEFINED__
#define __ISWbemPropertySet_FWD_DEFINED__
typedef interface ISWbemPropertySet ISWbemPropertySet;
#endif

#ifndef __ISWbemRefresher_FWD_DEFINED__
#define __ISWbemRefresher_FWD_DEFINED__
typedef interface ISWbemRefresher ISWbemRefresher;
#endif

#ifndef __ISWbemRefreshableItem_FWD_DEFINED__
#define __ISWbemRefreshableItem_FWD_DEFINED__
typedef interface ISWbemRefreshableItem ISWbemRefreshableItem;
#endif

#ifndef __ISWbemSecurity_FWD_DEFINED__
#define __ISWbemSecurity_FWD_DEFINED__
typedef interface ISWbemSecurity ISWbemSecurity;
#endif

#ifndef __ISWbemServices_FWD_DEFINED__
#define __ISWbemServices_FWD_DEFINED__
typedef interface ISWbemServices ISWbemServices;
#endif

#ifndef __ISWbemServicesEx_FWD_DEFINED__
#define __ISWbemServicesEx_FWD_DEFINED__
typedef interface ISWbemServicesEx ISWbemServicesEx;
#endif

#ifndef __ISWbemSink_FWD_DEFINED__
#define __ISWbemSink_FWD_DEFINED__
typedef interface ISWbemSink ISWbemSink;
#endif

#ifndef __ISWbemSinkEvents_FWD_DEFINED__
#define __ISWbemSinkEvents_FWD_DEFINED__
typedef interface ISWbemSinkEvents ISWbemSinkEvents;
#endif

typedef enum WbemChangeFlagEnum {
    wbemChangeFlagCreateOrUpdate = 0x0,
    wbemChangeFlagUpdateOnly = 0x1,
    wbemChangeFlagCreateOnly = 0x2,
    wbemChangeFlagUpdateCompatible = 0x0,
    wbemChangeFlagUpdateSafeMode = 0x20,
    wbemChangeFlagUpdateForceMode = 0x40,
    wbemChangeFlagStrongValidation = 0x80,
    wbemChangeFlagAdvisory = 0x10000
} WbemChangeFlagEnum;
typedef enum WbemFlagEnum {
    wbemFlagReturnImmediately = 0x10,
    wbemFlagReturnWhenComplete = 0,
    wbemFlagBidirectional = 0,
    wbemFlagForwardOnly = 0x20,
    wbemFlagNoErrorObject = 0x40,
    wbemFlagReturnErrorObject = 0,
    wbemFlagSendStatus = 0x80,
    wbemFlagDontSendStatus = 0,
    wbemFlagEnsureLocatable = 0x100,
    wbemFlagDirectRead = 0x200,
    wbemFlagSendOnlySelected = 0,
    wbemFlagUseAmendedQualifiers = 0x20000,
    wbemFlagGetDefault = 0x0,
    wbemFlagSpawnInstance = 0x1,
    wbemFlagUseCurrentTime = 0x1
} WbemFlagEnum;
typedef enum WbemQueryFlagEnum {
    wbemQueryFlagDeep = 0,
    wbemQueryFlagShallow = 1,
    wbemQueryFlagPrototype = 2
} WbemQueryFlagEnum;
typedef enum WbemTextFlagEnum {
    wbemTextFlagNoFlavors = 0x1
} WbemTextFlagEnum;
typedef enum WbemTimeout {
    wbemTimeoutInfinite = 0xffffffff
} WbemTimeout;
typedef enum WbemComparisonFlagEnum {
    wbemComparisonFlagIncludeAll = 0,
    wbemComparisonFlagIgnoreQualifiers = 0x1,
    wbemComparisonFlagIgnoreObjectSource = 0x2,
    wbemComparisonFlagIgnoreDefaultValues = 0x4,
    wbemComparisonFlagIgnoreClass = 0x8,
    wbemComparisonFlagIgnoreCase = 0x10,
    wbemComparisonFlagIgnoreFlavor = 0x20
} WbemComparisonFlagEnum;
typedef enum WbemCimtypeEnum {
    wbemCimtypeSint16 = 2,
    wbemCimtypeSint32 = 3,
    wbemCimtypeReal32 = 4,
    wbemCimtypeReal64 = 5,
    wbemCimtypeString = 8,
    wbemCimtypeBoolean = 11,
    wbemCimtypeObject = 13,
    wbemCimtypeSint8 = 16,
    wbemCimtypeUint8 = 17,
    wbemCimtypeUint16 = 18,
    wbemCimtypeUint32 = 19,
    wbemCimtypeSint64 = 20,
    wbemCimtypeUint64 = 21,
    wbemCimtypeDatetime = 101,
    wbemCimtypeReference = 102,
    wbemCimtypeChar16 = 103
} WbemCimtypeEnum;
typedef enum WbemErrorEnum {
    wbemNoErr = 0,
    wbemErrFailed = 0x80041001,
    wbemErrNotFound = 0x80041002,
    wbemErrAccessDenied = 0x80041003,
    wbemErrProviderFailure = 0x80041004,
    wbemErrTypeMismatch = 0x80041005,
    wbemErrOutOfMemory = 0x80041006,
    wbemErrInvalidContext = 0x80041007,
    wbemErrInvalidParameter = 0x80041008,
    wbemErrNotAvailable = 0x80041009,
    wbemErrCriticalError = 0x8004100a,
    wbemErrInvalidStream = 0x8004100b,
    wbemErrNotSupported = 0x8004100c,
    wbemErrInvalidSuperclass = 0x8004100d,
    wbemErrInvalidNamespace = 0x8004100e,
    wbemErrInvalidObject = 0x8004100f,
    wbemErrInvalidClass = 0x80041010,
    wbemErrProviderNotFound = 0x80041011,
    wbemErrInvalidProviderRegistration = 0x80041012,
    wbemErrProviderLoadFailure = 0x80041013,
    wbemErrInitializationFailure = 0x80041014,
    wbemErrTransportFailure = 0x80041015,
    wbemErrInvalidOperation = 0x80041016,
    wbemErrInvalidQuery = 0x80041017,
    wbemErrInvalidQueryType = 0x80041018,
    wbemErrAlreadyExists = 0x80041019,
    wbemErrOverrideNotAllowed = 0x8004101a,
    wbemErrPropagatedQualifier = 0x8004101b,
    wbemErrPropagatedProperty = 0x8004101c,
    wbemErrUnexpected = 0x8004101d,
    wbemErrIllegalOperation = 0x8004101e,
    wbemErrCannotBeKey = 0x8004101f,
    wbemErrIncompleteClass = 0x80041020,
    wbemErrInvalidSyntax = 0x80041021,
    wbemErrNondecoratedObject = 0x80041022,
    wbemErrReadOnly = 0x80041023,
    wbemErrProviderNotCapable = 0x80041024,
    wbemErrClassHasChildren = 0x80041025,
    wbemErrClassHasInstances = 0x80041026,
    wbemErrQueryNotImplemented = 0x80041027,
    wbemErrIllegalNull = 0x80041028,
    wbemErrInvalidQualifierType = 0x80041029,
    wbemErrInvalidPropertyType = 0x8004102a,
    wbemErrValueOutOfRange = 0x8004102b,
    wbemErrCannotBeSingleton = 0x8004102c,
    wbemErrInvalidCimType = 0x8004102d,
    wbemErrInvalidMethod = 0x8004102e,
    wbemErrInvalidMethodParameters = 0x8004102f,
    wbemErrSystemProperty = 0x80041030,
    wbemErrInvalidProperty = 0x80041031,
    wbemErrCallCancelled = 0x80041032,
    wbemErrShuttingDown = 0x80041033,
    wbemErrPropagatedMethod = 0x80041034,
    wbemErrUnsupportedParameter = 0x80041035,
    wbemErrMissingParameter = 0x80041036,
    wbemErrInvalidParameterId = 0x80041037,
    wbemErrNonConsecutiveParameterIds = 0x80041038,
    wbemErrParameterIdOnRetval = 0x80041039,
    wbemErrInvalidObjectPath = 0x8004103a,
    wbemErrOutOfDiskSpace = 0x8004103b,
    wbemErrBufferTooSmall = 0x8004103c,
    wbemErrUnsupportedPutExtension = 0x8004103d,
    wbemErrUnknownObjectType = 0x8004103e,
    wbemErrUnknownPacketType = 0x8004103f,
    wbemErrMarshalVersionMismatch = 0x80041040,
    wbemErrMarshalInvalidSignature = 0x80041041,
    wbemErrInvalidQualifier = 0x80041042,
    wbemErrInvalidDuplicateParameter = 0x80041043,
    wbemErrTooMuchData = 0x80041044,
    wbemErrServerTooBusy = 0x80041045,
    wbemErrInvalidFlavor = 0x80041046,
    wbemErrCircularReference = 0x80041047,
    wbemErrUnsupportedClassUpdate = 0x80041048,
    wbemErrCannotChangeKeyInheritance = 0x80041049,
    wbemErrCannotChangeIndexInheritance = 0x80041050,
    wbemErrTooManyProperties = 0x80041051,
    wbemErrUpdateTypeMismatch = 0x80041052,
    wbemErrUpdateOverrideNotAllowed = 0x80041053,
    wbemErrUpdatePropagatedMethod = 0x80041054,
    wbemErrMethodNotImplemented = 0x80041055,
    wbemErrMethodDisabled = 0x80041056,
    wbemErrRefresherBusy = 0x80041057,
    wbemErrUnparsableQuery = 0x80041058,
    wbemErrNotEventClass = 0x80041059,
    wbemErrMissingGroupWithin = 0x8004105a,
    wbemErrMissingAggregationList = 0x8004105b,
    wbemErrPropertyNotAnObject = 0x8004105c,
    wbemErrAggregatingByObject = 0x8004105d,
    wbemErrUninterpretableProviderQuery = 0x8004105f,
    wbemErrBackupRestoreWinmgmtRunning = 0x80041060,
    wbemErrQueueOverflow = 0x80041061,
    wbemErrPrivilegeNotHeld = 0x80041062,
    wbemErrInvalidOperator = 0x80041063,
    wbemErrLocalCredentials = 0x80041064,
    wbemErrCannotBeAbstract = 0x80041065,
    wbemErrAmendedObject = 0x80041066,
    wbemErrClientTooSlow = 0x80041067,
    wbemErrNullSecurityDescriptor = 0x80041068,
    wbemErrTimeout = 0x80041069,
    wbemErrInvalidAssociation = 0x8004106a,
    wbemErrAmbiguousOperation = 0x8004106b,
    wbemErrQuotaViolation = 0x8004106c,
    wbemErrTransactionConflict = 0x8004106d,
    wbemErrForcedRollback = 0x8004106e,
    wbemErrUnsupportedLocale = 0x8004106f,
    wbemErrHandleOutOfDate = 0x80041070,
    wbemErrConnectionFailed = 0x80041071,
    wbemErrInvalidHandleRequest = 0x80041072,
    wbemErrPropertyNameTooWide = 0x80041073,
    wbemErrClassNameTooWide = 0x80041074,
    wbemErrMethodNameTooWide = 0x80041075,
    wbemErrQualifierNameTooWide = 0x80041076,
    wbemErrRerunCommand = 0x80041077,
    wbemErrDatabaseVerMismatch = 0x80041078,
    wbemErrVetoPut = 0x80041079,
    wbemErrVetoDelete = 0x8004107a,
    wbemErrInvalidLocale = 0x80041080,
    wbemErrProviderSuspended = 0x80041081,
    wbemErrSynchronizationRequired = 0x80041082,
    wbemErrNoSchema = 0x80041083,
    wbemErrProviderAlreadyRegistered = 0x80041084,
    wbemErrProviderNotRegistered = 0x80041085,
    wbemErrFatalTransportError = 0x80041086,
    wbemErrEncryptedConnectionRequired = 0x80041087,
    wbemErrRegistrationTooBroad = 0x80042001,
    wbemErrRegistrationTooPrecise = 0x80042002,
    wbemErrTimedout = 0x80043001,
    wbemErrResetToDefault = 0x80043002
} WbemErrorEnum;
typedef enum WbemAuthenticationLevelEnum {
    wbemAuthenticationLevelDefault = 0,
    wbemAuthenticationLevelNone = 1,
    wbemAuthenticationLevelConnect = 2,
    wbemAuthenticationLevelCall = 3,
    wbemAuthenticationLevelPkt = 4,
    wbemAuthenticationLevelPktIntegrity = 5,
    wbemAuthenticationLevelPktPrivacy = 6
} WbemAuthenticationLevelEnum;
typedef enum WbemImpersonationLevelEnum {
    wbemImpersonationLevelAnonymous = 1,
    wbemImpersonationLevelIdentify = 2,
    wbemImpersonationLevelImpersonate = 3,
    wbemImpersonationLevelDelegate = 4
} WbemImpersonationLevelEnum;
typedef enum WbemPrivilegeEnum {
    wbemPrivilegeCreateToken = 1,
    wbemPrivilegePrimaryToken = 2,
    wbemPrivilegeLockMemory = 3,
    wbemPrivilegeIncreaseQuota = 4,
    wbemPrivilegeMachineAccount = 5,
    wbemPrivilegeTcb = 6,
    wbemPrivilegeSecurity = 7,
    wbemPrivilegeTakeOwnership = 8,
    wbemPrivilegeLoadDriver = 9,
    wbemPrivilegeSystemProfile = 10,
    wbemPrivilegeSystemtime = 11,
    wbemPrivilegeProfileSingleProcess = 12,
    wbemPrivilegeIncreaseBasePriority = 13,
    wbemPrivilegeCreatePagefile = 14,
    wbemPrivilegeCreatePermanent = 15,
    wbemPrivilegeBackup = 16,
    wbemPrivilegeRestore = 17,
    wbemPrivilegeShutdown = 18,
    wbemPrivilegeDebug = 19,
    wbemPrivilegeAudit = 20,
    wbemPrivilegeSystemEnvironment = 21,
    wbemPrivilegeChangeNotify = 22,
    wbemPrivilegeRemoteShutdown = 23,
    wbemPrivilegeUndock = 24,
    wbemPrivilegeSyncAgent = 25,
    wbemPrivilegeEnableDelegation = 26,
    wbemPrivilegeManageVolume = 27
} WbemPrivilegeEnum;
typedef enum WbemObjectTextFormatEnum {
    wbemObjectTextFormatCIMDTD20 = 1,
    wbemObjectTextFormatWMIDTD20 = 2
} WbemObjectTextFormatEnum;
typedef enum WbemConnectOptionsEnum {
    wbemConnectFlagUseMaxWait = 0x80
} WbemConnectOptionsEnum;
#define WBEMS_DISPID_OBJECT_READY (1)

#define WBEMS_DISPID_COMPLETED (2)

#define WBEMS_DISPID_PROGRESS (3)

#define WBEMS_DISPID_OBJECT_PUT (4)

#define WBEMS_DISPID_CONNECTION_READY (5)

#define WBEMS_DISPID_DERIVATION (23)

/*****************************************************************************
 * SWbemLocator coclass
 */

DEFINE_GUID(CLSID_SWbemLocator, 0x76a64158, 0xcb41, 0x11d1, 0x8b,0x02, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("76a64158-cb41-11d1-8b02-00600806d9b6") SWbemLocator;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemLocator, 0x76a64158, 0xcb41, 0x11d1, 0x8b,0x02, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemNamedValueSet coclass
 */

DEFINE_GUID(CLSID_SWbemNamedValueSet, 0x9aed384e, 0xce8b, 0x11d1, 0x8b,0x05, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("9aed384e-ce8b-11d1-8b05-00600806d9b6") SWbemNamedValueSet;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemNamedValueSet, 0x9aed384e, 0xce8b, 0x11d1, 0x8b,0x05, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemObjectPath coclass
 */

DEFINE_GUID(CLSID_SWbemObjectPath, 0x5791bc26, 0xce9c, 0x11d1, 0x97,0xbf, 0x00,0x00,0xf8,0x1e,0x84,0x9c);

#ifdef __cplusplus
class DECLSPEC_UUID("5791bc26-ce9c-11d1-97bf-0000f81e849c") SWbemObjectPath;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemObjectPath, 0x5791bc26, 0xce9c, 0x11d1, 0x97,0xbf, 0x00,0x00,0xf8,0x1e,0x84,0x9c)
#endif
#endif

/*****************************************************************************
 * SWbemLastError coclass
 */

DEFINE_GUID(CLSID_SWbemLastError, 0xc2feeeac, 0xcfcd, 0x11d1, 0x8b,0x05, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("c2feeeac-cfcd-11d1-8b05-00600806d9b6") SWbemLastError;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemLastError, 0xc2feeeac, 0xcfcd, 0x11d1, 0x8b,0x05, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemSink coclass
 */

DEFINE_GUID(CLSID_SWbemSink, 0x75718c9a, 0xf029, 0x11d1, 0xa1,0xac, 0x00,0xc0,0x4f,0xb6,0xc2,0x23);

#ifdef __cplusplus
class DECLSPEC_UUID("75718c9a-f029-11d1-a1ac-00c04fb6c223") SWbemSink;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemSink, 0x75718c9a, 0xf029, 0x11d1, 0xa1,0xac, 0x00,0xc0,0x4f,0xb6,0xc2,0x23)
#endif
#endif

/*****************************************************************************
 * SWbemDateTime coclass
 */

DEFINE_GUID(CLSID_SWbemDateTime, 0x47dfbe54, 0xcf76, 0x11d3, 0xb3,0x8f, 0x00,0x10,0x5a,0x1f,0x47,0x3a);

#ifdef __cplusplus
class DECLSPEC_UUID("47dfbe54-cf76-11d3-b38f-00105a1f473a") SWbemDateTime;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemDateTime, 0x47dfbe54, 0xcf76, 0x11d3, 0xb3,0x8f, 0x00,0x10,0x5a,0x1f,0x47,0x3a)
#endif
#endif

/*****************************************************************************
 * SWbemRefresher coclass
 */

DEFINE_GUID(CLSID_SWbemRefresher, 0xd269bf5c, 0xd9c1, 0x11d3, 0xb3,0x8f, 0x00,0x10,0x5a,0x1f,0x47,0x3a);

#ifdef __cplusplus
class DECLSPEC_UUID("d269bf5c-d9c1-11d3-b38f-00105a1f473a") SWbemRefresher;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemRefresher, 0xd269bf5c, 0xd9c1, 0x11d3, 0xb3,0x8f, 0x00,0x10,0x5a,0x1f,0x47,0x3a)
#endif
#endif

/*****************************************************************************
 * SWbemServices coclass
 */

DEFINE_GUID(CLSID_SWbemServices, 0x04b83d63, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("04b83d63-21ae-11d2-8b33-00600806d9b6") SWbemServices;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemServices, 0x04b83d63, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemServicesEx coclass
 */

DEFINE_GUID(CLSID_SWbemServicesEx, 0x62e522dc, 0x8cf3, 0x40a8, 0x8b,0x2e, 0x37,0xd5,0x95,0x65,0x1e,0x40);

#ifdef __cplusplus
class DECLSPEC_UUID("62e522dc-8cf3-40a8-8b2e-37d595651e40") SWbemServicesEx;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemServicesEx, 0x62e522dc, 0x8cf3, 0x40a8, 0x8b,0x2e, 0x37,0xd5,0x95,0x65,0x1e,0x40)
#endif
#endif

/*****************************************************************************
 * SWbemObject coclass
 */

DEFINE_GUID(CLSID_SWbemObject, 0x04b83d62, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("04b83d62-21ae-11d2-8b33-00600806d9b6") SWbemObject;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemObject, 0x04b83d62, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemObjectEx coclass
 */

DEFINE_GUID(CLSID_SWbemObjectEx, 0xd6bdafb2, 0x9435, 0x491f, 0xbb,0x87, 0x6a,0xa0,0xf0,0xbc,0x31,0xa2);

#ifdef __cplusplus
class DECLSPEC_UUID("d6bdafb2-9435-491f-bb87-6aa0f0bc31a2") SWbemObjectEx;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemObjectEx, 0xd6bdafb2, 0x9435, 0x491f, 0xbb,0x87, 0x6a,0xa0,0xf0,0xbc,0x31,0xa2)
#endif
#endif

/*****************************************************************************
 * SWbemObjectSet coclass
 */

DEFINE_GUID(CLSID_SWbemObjectSet, 0x04b83d61, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("04b83d61-21ae-11d2-8b33-00600806d9b6") SWbemObjectSet;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemObjectSet, 0x04b83d61, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemNamedValue coclass
 */

DEFINE_GUID(CLSID_SWbemNamedValue, 0x04b83d60, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("04b83d60-21ae-11d2-8b33-00600806d9b6") SWbemNamedValue;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemNamedValue, 0x04b83d60, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemQualifier coclass
 */

DEFINE_GUID(CLSID_SWbemQualifier, 0x04b83d5f, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("04b83d5f-21ae-11d2-8b33-00600806d9b6") SWbemQualifier;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemQualifier, 0x04b83d5f, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemQualifierSet coclass
 */

DEFINE_GUID(CLSID_SWbemQualifierSet, 0x04b83d5e, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("04b83d5e-21ae-11d2-8b33-00600806d9b6") SWbemQualifierSet;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemQualifierSet, 0x04b83d5e, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemProperty coclass
 */

DEFINE_GUID(CLSID_SWbemProperty, 0x04b83d5d, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("04b83d5d-21ae-11d2-8b33-00600806d9b6") SWbemProperty;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemProperty, 0x04b83d5d, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemPropertySet coclass
 */

DEFINE_GUID(CLSID_SWbemPropertySet, 0x04b83d5c, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("04b83d5c-21ae-11d2-8b33-00600806d9b6") SWbemPropertySet;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemPropertySet, 0x04b83d5c, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemMethod coclass
 */

DEFINE_GUID(CLSID_SWbemMethod, 0x04b83d5b, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("04b83d5b-21ae-11d2-8b33-00600806d9b6") SWbemMethod;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemMethod, 0x04b83d5b, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemMethodSet coclass
 */

DEFINE_GUID(CLSID_SWbemMethodSet, 0x04b83d5a, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("04b83d5a-21ae-11d2-8b33-00600806d9b6") SWbemMethodSet;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemMethodSet, 0x04b83d5a, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemEventSource coclass
 */

DEFINE_GUID(CLSID_SWbemEventSource, 0x04b83d58, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("04b83d58-21ae-11d2-8b33-00600806d9b6") SWbemEventSource;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemEventSource, 0x04b83d58, 0x21ae, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemSecurity coclass
 */

DEFINE_GUID(CLSID_SWbemSecurity, 0xb54d66e9, 0x2287, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("b54d66e9-2287-11d2-8b33-00600806d9b6") SWbemSecurity;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemSecurity, 0xb54d66e9, 0x2287, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemPrivilege coclass
 */

DEFINE_GUID(CLSID_SWbemPrivilege, 0x26ee67bc, 0x5804, 0x11d2, 0x8b,0x4a, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("26ee67bc-5804-11d2-8b4a-00600806d9b6") SWbemPrivilege;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemPrivilege, 0x26ee67bc, 0x5804, 0x11d2, 0x8b,0x4a, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemPrivilegeSet coclass
 */

DEFINE_GUID(CLSID_SWbemPrivilegeSet, 0x26ee67be, 0x5804, 0x11d2, 0x8b,0x4a, 0x00,0x60,0x08,0x06,0xd9,0xb6);

#ifdef __cplusplus
class DECLSPEC_UUID("26ee67be-5804-11d2-8b4a-00600806d9b6") SWbemPrivilegeSet;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemPrivilegeSet, 0x26ee67be, 0x5804, 0x11d2, 0x8b,0x4a, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#endif

/*****************************************************************************
 * SWbemRefreshableItem coclass
 */

DEFINE_GUID(CLSID_SWbemRefreshableItem, 0x8c6854bc, 0xde4b, 0x11d3, 0xb3,0x90, 0x00,0x10,0x5a,0x1f,0x47,0x3a);

#ifdef __cplusplus
class DECLSPEC_UUID("8c6854bc-de4b-11d3-b390-00105a1f473a") SWbemRefreshableItem;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SWbemRefreshableItem, 0x8c6854bc, 0xde4b, 0x11d3, 0xb3,0x90, 0x00,0x10,0x5a,0x1f,0x47,0x3a)
#endif
#endif

/*****************************************************************************
 * ISWbemLocator interface
 */
#ifndef __ISWbemLocator_INTERFACE_DEFINED__
#define __ISWbemLocator_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemLocator, 0x76a6415b, 0xcb41, 0x11d1, 0x8b,0x02, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("76a6415b-cb41-11d1-8b02-00600806d9b6")
ISWbemLocator : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE ConnectServer(
        BSTR strServer = ".",
        BSTR strNamespace = "",
        BSTR strUser = "",
        BSTR strPassword = "",
        BSTR strLocale = "",
        BSTR strAuthority = "",
        LONG iSecurityFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemServices **objWbemServices) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Security_(
        ISWbemSecurity **objWbemSecurity) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemLocator, 0x76a6415b, 0xcb41, 0x11d1, 0x8b,0x02, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemLocatorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemLocator methods ***/
    HRESULT (STDMETHODCALLTYPE *ConnectServer)(
        ISWbemLocator* This,
        BSTR strServer,
        BSTR strNamespace,
        BSTR strUser,
        BSTR strPassword,
        BSTR strLocale,
        BSTR strAuthority,
        LONG iSecurityFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemServices **objWbemServices);

    HRESULT (STDMETHODCALLTYPE *get_Security_)(
        ISWbemLocator* This,
        ISWbemSecurity **objWbemSecurity);

    END_INTERFACE
} ISWbemLocatorVtbl;
interface ISWbemLocator {
    CONST_VTBL ISWbemLocatorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemLocator_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemLocator_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemLocator_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemLocator_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemLocator_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemLocator_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemLocator_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemLocator methods ***/
#define ISWbemLocator_ConnectServer(This,strServer,strNamespace,strUser,strPassword,strLocale,strAuthority,iSecurityFlags,objWbemNamedValueSet,objWbemServices) (This)->lpVtbl->ConnectServer(This,strServer,strNamespace,strUser,strPassword,strLocale,strAuthority,iSecurityFlags,objWbemNamedValueSet,objWbemServices)
#define ISWbemLocator_get_Security_(This,objWbemSecurity) (This)->lpVtbl->get_Security_(This,objWbemSecurity)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemLocator_QueryInterface(ISWbemLocator* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemLocator_AddRef(ISWbemLocator* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemLocator_Release(ISWbemLocator* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemLocator_GetTypeInfoCount(ISWbemLocator* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemLocator_GetTypeInfo(ISWbemLocator* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemLocator_GetIDsOfNames(ISWbemLocator* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemLocator_Invoke(ISWbemLocator* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemLocator methods ***/
static FORCEINLINE HRESULT ISWbemLocator_ConnectServer(ISWbemLocator* This,BSTR strServer,BSTR strNamespace,BSTR strUser,BSTR strPassword,BSTR strLocale,BSTR strAuthority,LONG iSecurityFlags,IDispatch *objWbemNamedValueSet,ISWbemServices **objWbemServices) {
    return This->lpVtbl->ConnectServer(This,strServer,strNamespace,strUser,strPassword,strLocale,strAuthority,iSecurityFlags,objWbemNamedValueSet,objWbemServices);
}
static FORCEINLINE HRESULT ISWbemLocator_get_Security_(ISWbemLocator* This,ISWbemSecurity **objWbemSecurity) {
    return This->lpVtbl->get_Security_(This,objWbemSecurity);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemLocator_ConnectServer_Proxy(
    ISWbemLocator* This,
    BSTR strServer,
    BSTR strNamespace,
    BSTR strUser,
    BSTR strPassword,
    BSTR strLocale,
    BSTR strAuthority,
    LONG iSecurityFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemServices **objWbemServices);
void __RPC_STUB ISWbemLocator_ConnectServer_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemLocator_get_Security__Proxy(
    ISWbemLocator* This,
    ISWbemSecurity **objWbemSecurity);
void __RPC_STUB ISWbemLocator_get_Security__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemLocator_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemServices interface
 */
#ifndef __ISWbemServices_INTERFACE_DEFINED__
#define __ISWbemServices_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemServices, 0x76a6415c, 0xcb41, 0x11d1, 0x8b,0x02, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("76a6415c-cb41-11d1-8b02-00600806d9b6")
ISWbemServices : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE Get(
        BSTR strObjectPath = "",
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemObject **objWbemObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetAsync(
        IDispatch *objWbemSink,
        BSTR strObjectPath = "",
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete(
        BSTR strObjectPath,
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteAsync(
        IDispatch *objWbemSink,
        BSTR strObjectPath,
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE InstancesOf(
        BSTR strClass,
        LONG iFlags = wbemFlagReturnImmediately,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemObjectSet **objWbemObjectSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE InstancesOfAsync(
        IDispatch *objWbemSink,
        BSTR strClass,
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE SubclassesOf(
        BSTR strSuperclass = "",
        LONG iFlags = wbemFlagReturnImmediately | wbemQueryFlagDeep,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemObjectSet **objWbemObjectSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE SubclassesOfAsync(
        IDispatch *objWbemSink,
        BSTR strSuperclass = "",
        LONG iFlags = wbemQueryFlagDeep,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecQuery(
        BSTR strQuery,
        BSTR strQueryLanguage = "WQL",
        LONG iFlags = wbemFlagReturnImmediately,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemObjectSet **objWbemObjectSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecQueryAsync(
        IDispatch *objWbemSink,
        BSTR strQuery,
        BSTR strQueryLanguage = "WQL",
        LONG lFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE AssociatorsOf(
        BSTR strObjectPath,
        BSTR strAssocClass = "",
        BSTR strResultClass = "",
        BSTR strResultRole = "",
        BSTR strRole = "",
        VARIANT_BOOL bClassesOnly = FALSE,
        VARIANT_BOOL bSchemaOnly = FALSE,
        BSTR strRequiredAssocQualifier = "",
        BSTR strRequiredQualifier = "",
        LONG iFlags = wbemFlagReturnImmediately,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemObjectSet **objWbemObjectSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE AssociatorsOfAsync(
        IDispatch *objWbemSink,
        BSTR strObjectPath,
        BSTR strAssocClass = "",
        BSTR strResultClass = "",
        BSTR strResultRole = "",
        BSTR strRole = "",
        VARIANT_BOOL bClassesOnly = FALSE,
        VARIANT_BOOL bSchemaOnly = FALSE,
        BSTR strRequiredAssocQualifier = "",
        BSTR strRequiredQualifier = "",
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReferencesTo(
        BSTR strObjectPath,
        BSTR strResultClass = "",
        BSTR strRole = "",
        VARIANT_BOOL bClassesOnly = FALSE,
        VARIANT_BOOL bSchemaOnly = FALSE,
        BSTR strRequiredQualifier = "",
        LONG iFlags = wbemFlagReturnImmediately,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemObjectSet **objWbemObjectSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReferencesToAsync(
        IDispatch *objWbemSink,
        BSTR strObjectPath,
        BSTR strResultClass = "",
        BSTR strRole = "",
        VARIANT_BOOL bClassesOnly = FALSE,
        VARIANT_BOOL bSchemaOnly = FALSE,
        BSTR strRequiredQualifier = "",
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecNotificationQuery(
        BSTR strQuery,
        BSTR strQueryLanguage = "WQL",
        LONG iFlags = wbemFlagReturnImmediately | wbemFlagForwardOnly,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemEventSource **objWbemEventSource) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecNotificationQueryAsync(
        IDispatch *objWbemSink,
        BSTR strQuery,
        BSTR strQueryLanguage = "WQL",
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecMethod(
        BSTR strObjectPath,
        BSTR strMethodName,
        IDispatch *objWbemInParameters = 0,
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemObject **objWbemOutParameters) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecMethodAsync(
        IDispatch *objWbemSink,
        BSTR strObjectPath,
        BSTR strMethodName,
        IDispatch *objWbemInParameters = 0,
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Security_(
        ISWbemSecurity **objWbemSecurity) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemServices, 0x76a6415c, 0xcb41, 0x11d1, 0x8b,0x02, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemServicesVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemServices methods ***/
    HRESULT (STDMETHODCALLTYPE *Get)(
        ISWbemServices* This,
        BSTR strObjectPath,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObject **objWbemObject);

    HRESULT (STDMETHODCALLTYPE *GetAsync)(
        ISWbemServices* This,
        IDispatch *objWbemSink,
        BSTR strObjectPath,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        ISWbemServices* This,
        BSTR strObjectPath,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet);

    HRESULT (STDMETHODCALLTYPE *DeleteAsync)(
        ISWbemServices* This,
        IDispatch *objWbemSink,
        BSTR strObjectPath,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *InstancesOf)(
        ISWbemServices* This,
        BSTR strClass,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *InstancesOfAsync)(
        ISWbemServices* This,
        IDispatch *objWbemSink,
        BSTR strClass,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *SubclassesOf)(
        ISWbemServices* This,
        BSTR strSuperclass,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *SubclassesOfAsync)(
        ISWbemServices* This,
        IDispatch *objWbemSink,
        BSTR strSuperclass,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *ExecQuery)(
        ISWbemServices* This,
        BSTR strQuery,
        BSTR strQueryLanguage,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *ExecQueryAsync)(
        ISWbemServices* This,
        IDispatch *objWbemSink,
        BSTR strQuery,
        BSTR strQueryLanguage,
        LONG lFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *AssociatorsOf)(
        ISWbemServices* This,
        BSTR strObjectPath,
        BSTR strAssocClass,
        BSTR strResultClass,
        BSTR strResultRole,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredAssocQualifier,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *AssociatorsOfAsync)(
        ISWbemServices* This,
        IDispatch *objWbemSink,
        BSTR strObjectPath,
        BSTR strAssocClass,
        BSTR strResultClass,
        BSTR strResultRole,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredAssocQualifier,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *ReferencesTo)(
        ISWbemServices* This,
        BSTR strObjectPath,
        BSTR strResultClass,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *ReferencesToAsync)(
        ISWbemServices* This,
        IDispatch *objWbemSink,
        BSTR strObjectPath,
        BSTR strResultClass,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *ExecNotificationQuery)(
        ISWbemServices* This,
        BSTR strQuery,
        BSTR strQueryLanguage,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemEventSource **objWbemEventSource);

    HRESULT (STDMETHODCALLTYPE *ExecNotificationQueryAsync)(
        ISWbemServices* This,
        IDispatch *objWbemSink,
        BSTR strQuery,
        BSTR strQueryLanguage,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *ExecMethod)(
        ISWbemServices* This,
        BSTR strObjectPath,
        BSTR strMethodName,
        IDispatch *objWbemInParameters,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObject **objWbemOutParameters);

    HRESULT (STDMETHODCALLTYPE *ExecMethodAsync)(
        ISWbemServices* This,
        IDispatch *objWbemSink,
        BSTR strObjectPath,
        BSTR strMethodName,
        IDispatch *objWbemInParameters,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *get_Security_)(
        ISWbemServices* This,
        ISWbemSecurity **objWbemSecurity);

    END_INTERFACE
} ISWbemServicesVtbl;
interface ISWbemServices {
    CONST_VTBL ISWbemServicesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemServices_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemServices_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemServices_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemServices_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemServices_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemServices_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemServices_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemServices methods ***/
#define ISWbemServices_Get(This,strObjectPath,iFlags,objWbemNamedValueSet,objWbemObject) (This)->lpVtbl->Get(This,strObjectPath,iFlags,objWbemNamedValueSet,objWbemObject)
#define ISWbemServices_GetAsync(This,objWbemSink,strObjectPath,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->GetAsync(This,objWbemSink,strObjectPath,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServices_Delete(This,strObjectPath,iFlags,objWbemNamedValueSet) (This)->lpVtbl->Delete(This,strObjectPath,iFlags,objWbemNamedValueSet)
#define ISWbemServices_DeleteAsync(This,objWbemSink,strObjectPath,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->DeleteAsync(This,objWbemSink,strObjectPath,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServices_InstancesOf(This,strClass,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->InstancesOf(This,strClass,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemServices_InstancesOfAsync(This,objWbemSink,strClass,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->InstancesOfAsync(This,objWbemSink,strClass,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServices_SubclassesOf(This,strSuperclass,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->SubclassesOf(This,strSuperclass,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemServices_SubclassesOfAsync(This,objWbemSink,strSuperclass,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->SubclassesOfAsync(This,objWbemSink,strSuperclass,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServices_ExecQuery(This,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->ExecQuery(This,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemServices_ExecQueryAsync(This,objWbemSink,strQuery,strQueryLanguage,lFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->ExecQueryAsync(This,objWbemSink,strQuery,strQueryLanguage,lFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServices_AssociatorsOf(This,strObjectPath,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->AssociatorsOf(This,strObjectPath,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemServices_AssociatorsOfAsync(This,objWbemSink,strObjectPath,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->AssociatorsOfAsync(This,objWbemSink,strObjectPath,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServices_ReferencesTo(This,strObjectPath,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->ReferencesTo(This,strObjectPath,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemServices_ReferencesToAsync(This,objWbemSink,strObjectPath,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->ReferencesToAsync(This,objWbemSink,strObjectPath,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServices_ExecNotificationQuery(This,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemEventSource) (This)->lpVtbl->ExecNotificationQuery(This,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemEventSource)
#define ISWbemServices_ExecNotificationQueryAsync(This,objWbemSink,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->ExecNotificationQueryAsync(This,objWbemSink,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServices_ExecMethod(This,strObjectPath,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters) (This)->lpVtbl->ExecMethod(This,strObjectPath,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters)
#define ISWbemServices_ExecMethodAsync(This,objWbemSink,strObjectPath,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->ExecMethodAsync(This,objWbemSink,strObjectPath,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServices_get_Security_(This,objWbemSecurity) (This)->lpVtbl->get_Security_(This,objWbemSecurity)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemServices_QueryInterface(ISWbemServices* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemServices_AddRef(ISWbemServices* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemServices_Release(ISWbemServices* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemServices_GetTypeInfoCount(ISWbemServices* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemServices_GetTypeInfo(ISWbemServices* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemServices_GetIDsOfNames(ISWbemServices* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemServices_Invoke(ISWbemServices* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemServices methods ***/
static FORCEINLINE HRESULT ISWbemServices_Get(ISWbemServices* This,BSTR strObjectPath,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObject **objWbemObject) {
    return This->lpVtbl->Get(This,strObjectPath,iFlags,objWbemNamedValueSet,objWbemObject);
}
static FORCEINLINE HRESULT ISWbemServices_GetAsync(ISWbemServices* This,IDispatch *objWbemSink,BSTR strObjectPath,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->GetAsync(This,objWbemSink,strObjectPath,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServices_Delete(ISWbemServices* This,BSTR strObjectPath,LONG iFlags,IDispatch *objWbemNamedValueSet) {
    return This->lpVtbl->Delete(This,strObjectPath,iFlags,objWbemNamedValueSet);
}
static FORCEINLINE HRESULT ISWbemServices_DeleteAsync(ISWbemServices* This,IDispatch *objWbemSink,BSTR strObjectPath,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->DeleteAsync(This,objWbemSink,strObjectPath,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServices_InstancesOf(ISWbemServices* This,BSTR strClass,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->InstancesOf(This,strClass,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemServices_InstancesOfAsync(ISWbemServices* This,IDispatch *objWbemSink,BSTR strClass,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->InstancesOfAsync(This,objWbemSink,strClass,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServices_SubclassesOf(ISWbemServices* This,BSTR strSuperclass,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->SubclassesOf(This,strSuperclass,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemServices_SubclassesOfAsync(ISWbemServices* This,IDispatch *objWbemSink,BSTR strSuperclass,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->SubclassesOfAsync(This,objWbemSink,strSuperclass,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServices_ExecQuery(ISWbemServices* This,BSTR strQuery,BSTR strQueryLanguage,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->ExecQuery(This,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemServices_ExecQueryAsync(ISWbemServices* This,IDispatch *objWbemSink,BSTR strQuery,BSTR strQueryLanguage,LONG lFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->ExecQueryAsync(This,objWbemSink,strQuery,strQueryLanguage,lFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServices_AssociatorsOf(ISWbemServices* This,BSTR strObjectPath,BSTR strAssocClass,BSTR strResultClass,BSTR strResultRole,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredAssocQualifier,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->AssociatorsOf(This,strObjectPath,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemServices_AssociatorsOfAsync(ISWbemServices* This,IDispatch *objWbemSink,BSTR strObjectPath,BSTR strAssocClass,BSTR strResultClass,BSTR strResultRole,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredAssocQualifier,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->AssociatorsOfAsync(This,objWbemSink,strObjectPath,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServices_ReferencesTo(ISWbemServices* This,BSTR strObjectPath,BSTR strResultClass,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->ReferencesTo(This,strObjectPath,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemServices_ReferencesToAsync(ISWbemServices* This,IDispatch *objWbemSink,BSTR strObjectPath,BSTR strResultClass,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->ReferencesToAsync(This,objWbemSink,strObjectPath,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServices_ExecNotificationQuery(ISWbemServices* This,BSTR strQuery,BSTR strQueryLanguage,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemEventSource **objWbemEventSource) {
    return This->lpVtbl->ExecNotificationQuery(This,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemEventSource);
}
static FORCEINLINE HRESULT ISWbemServices_ExecNotificationQueryAsync(ISWbemServices* This,IDispatch *objWbemSink,BSTR strQuery,BSTR strQueryLanguage,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->ExecNotificationQueryAsync(This,objWbemSink,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServices_ExecMethod(ISWbemServices* This,BSTR strObjectPath,BSTR strMethodName,IDispatch *objWbemInParameters,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObject **objWbemOutParameters) {
    return This->lpVtbl->ExecMethod(This,strObjectPath,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters);
}
static FORCEINLINE HRESULT ISWbemServices_ExecMethodAsync(ISWbemServices* This,IDispatch *objWbemSink,BSTR strObjectPath,BSTR strMethodName,IDispatch *objWbemInParameters,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->ExecMethodAsync(This,objWbemSink,strObjectPath,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServices_get_Security_(ISWbemServices* This,ISWbemSecurity **objWbemSecurity) {
    return This->lpVtbl->get_Security_(This,objWbemSecurity);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemServices_Get_Proxy(
    ISWbemServices* This,
    BSTR strObjectPath,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemObject **objWbemObject);
void __RPC_STUB ISWbemServices_Get_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_GetAsync_Proxy(
    ISWbemServices* This,
    IDispatch *objWbemSink,
    BSTR strObjectPath,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemServices_GetAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_Delete_Proxy(
    ISWbemServices* This,
    BSTR strObjectPath,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet);
void __RPC_STUB ISWbemServices_Delete_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_DeleteAsync_Proxy(
    ISWbemServices* This,
    IDispatch *objWbemSink,
    BSTR strObjectPath,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemServices_DeleteAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_InstancesOf_Proxy(
    ISWbemServices* This,
    BSTR strClass,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemObjectSet **objWbemObjectSet);
void __RPC_STUB ISWbemServices_InstancesOf_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_InstancesOfAsync_Proxy(
    ISWbemServices* This,
    IDispatch *objWbemSink,
    BSTR strClass,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemServices_InstancesOfAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_SubclassesOf_Proxy(
    ISWbemServices* This,
    BSTR strSuperclass,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemObjectSet **objWbemObjectSet);
void __RPC_STUB ISWbemServices_SubclassesOf_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_SubclassesOfAsync_Proxy(
    ISWbemServices* This,
    IDispatch *objWbemSink,
    BSTR strSuperclass,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemServices_SubclassesOfAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_ExecQuery_Proxy(
    ISWbemServices* This,
    BSTR strQuery,
    BSTR strQueryLanguage,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemObjectSet **objWbemObjectSet);
void __RPC_STUB ISWbemServices_ExecQuery_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_ExecQueryAsync_Proxy(
    ISWbemServices* This,
    IDispatch *objWbemSink,
    BSTR strQuery,
    BSTR strQueryLanguage,
    LONG lFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemServices_ExecQueryAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_AssociatorsOf_Proxy(
    ISWbemServices* This,
    BSTR strObjectPath,
    BSTR strAssocClass,
    BSTR strResultClass,
    BSTR strResultRole,
    BSTR strRole,
    VARIANT_BOOL bClassesOnly,
    VARIANT_BOOL bSchemaOnly,
    BSTR strRequiredAssocQualifier,
    BSTR strRequiredQualifier,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemObjectSet **objWbemObjectSet);
void __RPC_STUB ISWbemServices_AssociatorsOf_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_AssociatorsOfAsync_Proxy(
    ISWbemServices* This,
    IDispatch *objWbemSink,
    BSTR strObjectPath,
    BSTR strAssocClass,
    BSTR strResultClass,
    BSTR strResultRole,
    BSTR strRole,
    VARIANT_BOOL bClassesOnly,
    VARIANT_BOOL bSchemaOnly,
    BSTR strRequiredAssocQualifier,
    BSTR strRequiredQualifier,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemServices_AssociatorsOfAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_ReferencesTo_Proxy(
    ISWbemServices* This,
    BSTR strObjectPath,
    BSTR strResultClass,
    BSTR strRole,
    VARIANT_BOOL bClassesOnly,
    VARIANT_BOOL bSchemaOnly,
    BSTR strRequiredQualifier,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemObjectSet **objWbemObjectSet);
void __RPC_STUB ISWbemServices_ReferencesTo_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_ReferencesToAsync_Proxy(
    ISWbemServices* This,
    IDispatch *objWbemSink,
    BSTR strObjectPath,
    BSTR strResultClass,
    BSTR strRole,
    VARIANT_BOOL bClassesOnly,
    VARIANT_BOOL bSchemaOnly,
    BSTR strRequiredQualifier,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemServices_ReferencesToAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_ExecNotificationQuery_Proxy(
    ISWbemServices* This,
    BSTR strQuery,
    BSTR strQueryLanguage,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemEventSource **objWbemEventSource);
void __RPC_STUB ISWbemServices_ExecNotificationQuery_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_ExecNotificationQueryAsync_Proxy(
    ISWbemServices* This,
    IDispatch *objWbemSink,
    BSTR strQuery,
    BSTR strQueryLanguage,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemServices_ExecNotificationQueryAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_ExecMethod_Proxy(
    ISWbemServices* This,
    BSTR strObjectPath,
    BSTR strMethodName,
    IDispatch *objWbemInParameters,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemObject **objWbemOutParameters);
void __RPC_STUB ISWbemServices_ExecMethod_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_ExecMethodAsync_Proxy(
    ISWbemServices* This,
    IDispatch *objWbemSink,
    BSTR strObjectPath,
    BSTR strMethodName,
    IDispatch *objWbemInParameters,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemServices_ExecMethodAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServices_get_Security__Proxy(
    ISWbemServices* This,
    ISWbemSecurity **objWbemSecurity);
void __RPC_STUB ISWbemServices_get_Security__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemServices_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemServicesEx interface
 */
#ifndef __ISWbemServicesEx_INTERFACE_DEFINED__
#define __ISWbemServicesEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemServicesEx, 0xd2f68443, 0x85dc, 0x427e, 0x91,0xd8, 0x36,0x65,0x54,0xcc,0x75,0x4c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d2f68443-85dc-427e-91d8-366554cc754c")
ISWbemServicesEx : public ISWbemServices
{
    virtual HRESULT STDMETHODCALLTYPE Put(
        ISWbemObjectEx *objWbemObject,
        LONG iFlags = wbemChangeFlagCreateOrUpdate,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemObjectPath **objWbemObjectPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutAsync(
        ISWbemSink *objWbemSink,
        ISWbemObjectEx *objWbemObject,
        LONG iFlags = wbemChangeFlagCreateOrUpdate,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemServicesEx, 0xd2f68443, 0x85dc, 0x427e, 0x91,0xd8, 0x36,0x65,0x54,0xcc,0x75,0x4c)
#endif
#else
typedef struct ISWbemServicesExVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemServices methods ***/
    HRESULT (STDMETHODCALLTYPE *Get)(
        ISWbemServicesEx* This,
        BSTR strObjectPath,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObject **objWbemObject);

    HRESULT (STDMETHODCALLTYPE *GetAsync)(
        ISWbemServicesEx* This,
        IDispatch *objWbemSink,
        BSTR strObjectPath,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Delete)(
        ISWbemServicesEx* This,
        BSTR strObjectPath,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet);

    HRESULT (STDMETHODCALLTYPE *DeleteAsync)(
        ISWbemServicesEx* This,
        IDispatch *objWbemSink,
        BSTR strObjectPath,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *InstancesOf)(
        ISWbemServicesEx* This,
        BSTR strClass,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *InstancesOfAsync)(
        ISWbemServicesEx* This,
        IDispatch *objWbemSink,
        BSTR strClass,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *SubclassesOf)(
        ISWbemServicesEx* This,
        BSTR strSuperclass,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *SubclassesOfAsync)(
        ISWbemServicesEx* This,
        IDispatch *objWbemSink,
        BSTR strSuperclass,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *ExecQuery)(
        ISWbemServicesEx* This,
        BSTR strQuery,
        BSTR strQueryLanguage,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *ExecQueryAsync)(
        ISWbemServicesEx* This,
        IDispatch *objWbemSink,
        BSTR strQuery,
        BSTR strQueryLanguage,
        LONG lFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *AssociatorsOf)(
        ISWbemServicesEx* This,
        BSTR strObjectPath,
        BSTR strAssocClass,
        BSTR strResultClass,
        BSTR strResultRole,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredAssocQualifier,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *AssociatorsOfAsync)(
        ISWbemServicesEx* This,
        IDispatch *objWbemSink,
        BSTR strObjectPath,
        BSTR strAssocClass,
        BSTR strResultClass,
        BSTR strResultRole,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredAssocQualifier,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *ReferencesTo)(
        ISWbemServicesEx* This,
        BSTR strObjectPath,
        BSTR strResultClass,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *ReferencesToAsync)(
        ISWbemServicesEx* This,
        IDispatch *objWbemSink,
        BSTR strObjectPath,
        BSTR strResultClass,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *ExecNotificationQuery)(
        ISWbemServicesEx* This,
        BSTR strQuery,
        BSTR strQueryLanguage,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemEventSource **objWbemEventSource);

    HRESULT (STDMETHODCALLTYPE *ExecNotificationQueryAsync)(
        ISWbemServicesEx* This,
        IDispatch *objWbemSink,
        BSTR strQuery,
        BSTR strQueryLanguage,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *ExecMethod)(
        ISWbemServicesEx* This,
        BSTR strObjectPath,
        BSTR strMethodName,
        IDispatch *objWbemInParameters,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObject **objWbemOutParameters);

    HRESULT (STDMETHODCALLTYPE *ExecMethodAsync)(
        ISWbemServicesEx* This,
        IDispatch *objWbemSink,
        BSTR strObjectPath,
        BSTR strMethodName,
        IDispatch *objWbemInParameters,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *get_Security_)(
        ISWbemServicesEx* This,
        ISWbemSecurity **objWbemSecurity);

    /*** ISWbemServicesEx methods ***/
    HRESULT (STDMETHODCALLTYPE *Put)(
        ISWbemServicesEx* This,
        ISWbemObjectEx *objWbemObject,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectPath **objWbemObjectPath);

    HRESULT (STDMETHODCALLTYPE *PutAsync)(
        ISWbemServicesEx* This,
        ISWbemSink *objWbemSink,
        ISWbemObjectEx *objWbemObject,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    END_INTERFACE
} ISWbemServicesExVtbl;
interface ISWbemServicesEx {
    CONST_VTBL ISWbemServicesExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemServicesEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemServicesEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemServicesEx_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemServicesEx_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemServicesEx_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemServicesEx_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemServicesEx_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemServices methods ***/
#define ISWbemServicesEx_Get(This,strObjectPath,iFlags,objWbemNamedValueSet,objWbemObject) (This)->lpVtbl->Get(This,strObjectPath,iFlags,objWbemNamedValueSet,objWbemObject)
#define ISWbemServicesEx_GetAsync(This,objWbemSink,strObjectPath,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->GetAsync(This,objWbemSink,strObjectPath,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServicesEx_Delete(This,strObjectPath,iFlags,objWbemNamedValueSet) (This)->lpVtbl->Delete(This,strObjectPath,iFlags,objWbemNamedValueSet)
#define ISWbemServicesEx_DeleteAsync(This,objWbemSink,strObjectPath,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->DeleteAsync(This,objWbemSink,strObjectPath,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServicesEx_InstancesOf(This,strClass,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->InstancesOf(This,strClass,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemServicesEx_InstancesOfAsync(This,objWbemSink,strClass,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->InstancesOfAsync(This,objWbemSink,strClass,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServicesEx_SubclassesOf(This,strSuperclass,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->SubclassesOf(This,strSuperclass,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemServicesEx_SubclassesOfAsync(This,objWbemSink,strSuperclass,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->SubclassesOfAsync(This,objWbemSink,strSuperclass,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServicesEx_ExecQuery(This,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->ExecQuery(This,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemServicesEx_ExecQueryAsync(This,objWbemSink,strQuery,strQueryLanguage,lFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->ExecQueryAsync(This,objWbemSink,strQuery,strQueryLanguage,lFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServicesEx_AssociatorsOf(This,strObjectPath,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->AssociatorsOf(This,strObjectPath,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemServicesEx_AssociatorsOfAsync(This,objWbemSink,strObjectPath,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->AssociatorsOfAsync(This,objWbemSink,strObjectPath,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServicesEx_ReferencesTo(This,strObjectPath,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->ReferencesTo(This,strObjectPath,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemServicesEx_ReferencesToAsync(This,objWbemSink,strObjectPath,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->ReferencesToAsync(This,objWbemSink,strObjectPath,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServicesEx_ExecNotificationQuery(This,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemEventSource) (This)->lpVtbl->ExecNotificationQuery(This,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemEventSource)
#define ISWbemServicesEx_ExecNotificationQueryAsync(This,objWbemSink,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->ExecNotificationQueryAsync(This,objWbemSink,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServicesEx_ExecMethod(This,strObjectPath,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters) (This)->lpVtbl->ExecMethod(This,strObjectPath,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters)
#define ISWbemServicesEx_ExecMethodAsync(This,objWbemSink,strObjectPath,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->ExecMethodAsync(This,objWbemSink,strObjectPath,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemServicesEx_get_Security_(This,objWbemSecurity) (This)->lpVtbl->get_Security_(This,objWbemSecurity)
/*** ISWbemServicesEx methods ***/
#define ISWbemServicesEx_Put(This,objWbemObject,iFlags,objWbemNamedValueSet,objWbemObjectPath) (This)->lpVtbl->Put(This,objWbemObject,iFlags,objWbemNamedValueSet,objWbemObjectPath)
#define ISWbemServicesEx_PutAsync(This,objWbemSink,objWbemObject,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->PutAsync(This,objWbemSink,objWbemObject,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemServicesEx_QueryInterface(ISWbemServicesEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemServicesEx_AddRef(ISWbemServicesEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemServicesEx_Release(ISWbemServicesEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemServicesEx_GetTypeInfoCount(ISWbemServicesEx* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemServicesEx_GetTypeInfo(ISWbemServicesEx* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemServicesEx_GetIDsOfNames(ISWbemServicesEx* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemServicesEx_Invoke(ISWbemServicesEx* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemServices methods ***/
static FORCEINLINE HRESULT ISWbemServicesEx_Get(ISWbemServicesEx* This,BSTR strObjectPath,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObject **objWbemObject) {
    return This->lpVtbl->Get(This,strObjectPath,iFlags,objWbemNamedValueSet,objWbemObject);
}
static FORCEINLINE HRESULT ISWbemServicesEx_GetAsync(ISWbemServicesEx* This,IDispatch *objWbemSink,BSTR strObjectPath,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->GetAsync(This,objWbemSink,strObjectPath,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServicesEx_Delete(ISWbemServicesEx* This,BSTR strObjectPath,LONG iFlags,IDispatch *objWbemNamedValueSet) {
    return This->lpVtbl->Delete(This,strObjectPath,iFlags,objWbemNamedValueSet);
}
static FORCEINLINE HRESULT ISWbemServicesEx_DeleteAsync(ISWbemServicesEx* This,IDispatch *objWbemSink,BSTR strObjectPath,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->DeleteAsync(This,objWbemSink,strObjectPath,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServicesEx_InstancesOf(ISWbemServicesEx* This,BSTR strClass,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->InstancesOf(This,strClass,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemServicesEx_InstancesOfAsync(ISWbemServicesEx* This,IDispatch *objWbemSink,BSTR strClass,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->InstancesOfAsync(This,objWbemSink,strClass,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServicesEx_SubclassesOf(ISWbemServicesEx* This,BSTR strSuperclass,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->SubclassesOf(This,strSuperclass,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemServicesEx_SubclassesOfAsync(ISWbemServicesEx* This,IDispatch *objWbemSink,BSTR strSuperclass,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->SubclassesOfAsync(This,objWbemSink,strSuperclass,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServicesEx_ExecQuery(ISWbemServicesEx* This,BSTR strQuery,BSTR strQueryLanguage,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->ExecQuery(This,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemServicesEx_ExecQueryAsync(ISWbemServicesEx* This,IDispatch *objWbemSink,BSTR strQuery,BSTR strQueryLanguage,LONG lFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->ExecQueryAsync(This,objWbemSink,strQuery,strQueryLanguage,lFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServicesEx_AssociatorsOf(ISWbemServicesEx* This,BSTR strObjectPath,BSTR strAssocClass,BSTR strResultClass,BSTR strResultRole,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredAssocQualifier,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->AssociatorsOf(This,strObjectPath,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemServicesEx_AssociatorsOfAsync(ISWbemServicesEx* This,IDispatch *objWbemSink,BSTR strObjectPath,BSTR strAssocClass,BSTR strResultClass,BSTR strResultRole,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredAssocQualifier,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->AssociatorsOfAsync(This,objWbemSink,strObjectPath,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServicesEx_ReferencesTo(ISWbemServicesEx* This,BSTR strObjectPath,BSTR strResultClass,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->ReferencesTo(This,strObjectPath,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemServicesEx_ReferencesToAsync(ISWbemServicesEx* This,IDispatch *objWbemSink,BSTR strObjectPath,BSTR strResultClass,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->ReferencesToAsync(This,objWbemSink,strObjectPath,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServicesEx_ExecNotificationQuery(ISWbemServicesEx* This,BSTR strQuery,BSTR strQueryLanguage,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemEventSource **objWbemEventSource) {
    return This->lpVtbl->ExecNotificationQuery(This,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemEventSource);
}
static FORCEINLINE HRESULT ISWbemServicesEx_ExecNotificationQueryAsync(ISWbemServicesEx* This,IDispatch *objWbemSink,BSTR strQuery,BSTR strQueryLanguage,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->ExecNotificationQueryAsync(This,objWbemSink,strQuery,strQueryLanguage,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServicesEx_ExecMethod(ISWbemServicesEx* This,BSTR strObjectPath,BSTR strMethodName,IDispatch *objWbemInParameters,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObject **objWbemOutParameters) {
    return This->lpVtbl->ExecMethod(This,strObjectPath,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters);
}
static FORCEINLINE HRESULT ISWbemServicesEx_ExecMethodAsync(ISWbemServicesEx* This,IDispatch *objWbemSink,BSTR strObjectPath,BSTR strMethodName,IDispatch *objWbemInParameters,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->ExecMethodAsync(This,objWbemSink,strObjectPath,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemServicesEx_get_Security_(ISWbemServicesEx* This,ISWbemSecurity **objWbemSecurity) {
    return This->lpVtbl->get_Security_(This,objWbemSecurity);
}
/*** ISWbemServicesEx methods ***/
static FORCEINLINE HRESULT ISWbemServicesEx_Put(ISWbemServicesEx* This,ISWbemObjectEx *objWbemObject,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectPath **objWbemObjectPath) {
    return This->lpVtbl->Put(This,objWbemObject,iFlags,objWbemNamedValueSet,objWbemObjectPath);
}
static FORCEINLINE HRESULT ISWbemServicesEx_PutAsync(ISWbemServicesEx* This,ISWbemSink *objWbemSink,ISWbemObjectEx *objWbemObject,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->PutAsync(This,objWbemSink,objWbemObject,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemServicesEx_Put_Proxy(
    ISWbemServicesEx* This,
    ISWbemObjectEx *objWbemObject,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemObjectPath **objWbemObjectPath);
void __RPC_STUB ISWbemServicesEx_Put_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemServicesEx_PutAsync_Proxy(
    ISWbemServicesEx* This,
    ISWbemSink *objWbemSink,
    ISWbemObjectEx *objWbemObject,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemServicesEx_PutAsync_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemServicesEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemObject interface
 */
#ifndef __ISWbemObject_INTERFACE_DEFINED__
#define __ISWbemObject_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemObject, 0x76a6415a, 0xcb41, 0x11d1, 0x8b,0x02, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("76a6415a-cb41-11d1-8b02-00600806d9b6")
ISWbemObject : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE Put_(
        LONG iFlags = wbemChangeFlagCreateOrUpdate,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemObjectPath **objWbemObjectPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE PutAsync_(
        IDispatch *objWbemSink,
        LONG iFlags = wbemChangeFlagCreateOrUpdate,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE Delete_(
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteAsync_(
        IDispatch *objWbemSink,
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE Instances_(
        LONG iFlags = wbemFlagReturnImmediately,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemObjectSet **objWbemObjectSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE InstancesAsync_(
        IDispatch *objWbemSink,
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE Subclasses_(
        LONG iFlags = wbemFlagReturnImmediately | wbemQueryFlagDeep,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemObjectSet **objWbemObjectSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE SubclassesAsync_(
        IDispatch *objWbemSink,
        LONG iFlags = wbemQueryFlagDeep,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE Associators_(
        BSTR strAssocClass = "",
        BSTR strResultClass = "",
        BSTR strResultRole = "",
        BSTR strRole = "",
        VARIANT_BOOL bClassesOnly = FALSE,
        VARIANT_BOOL bSchemaOnly = FALSE,
        BSTR strRequiredAssocQualifier = "",
        BSTR strRequiredQualifier = "",
        LONG iFlags = wbemFlagReturnImmediately,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemObjectSet **objWbemObjectSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE AssociatorsAsync_(
        IDispatch *objWbemSink,
        BSTR strAssocClass = "",
        BSTR strResultClass = "",
        BSTR strResultRole = "",
        BSTR strRole = "",
        VARIANT_BOOL bClassesOnly = FALSE,
        VARIANT_BOOL bSchemaOnly = FALSE,
        BSTR strRequiredAssocQualifier = "",
        BSTR strRequiredQualifier = "",
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE References_(
        BSTR strResultClass = "",
        BSTR strRole = "",
        VARIANT_BOOL bClassesOnly = FALSE,
        VARIANT_BOOL bSchemaOnly = FALSE,
        BSTR strRequiredQualifier = "",
        LONG iFlags = wbemFlagReturnImmediately,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemObjectSet **objWbemObjectSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE ReferencesAsync_(
        IDispatch *objWbemSink,
        BSTR strResultClass = "",
        BSTR strRole = "",
        VARIANT_BOOL bClassesOnly = FALSE,
        VARIANT_BOOL bSchemaOnly = FALSE,
        BSTR strRequiredQualifier = "",
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecMethod_(
        BSTR strMethodName,
        IDispatch *objWbemInParameters = 0,
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemObject **objWbemOutParameters) = 0;

    virtual HRESULT STDMETHODCALLTYPE ExecMethodAsync_(
        IDispatch *objWbemSink,
        BSTR strMethodName,
        IDispatch *objWbemInParameters = 0,
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        IDispatch *objWbemAsyncContext = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone_(
        ISWbemObject **objWbemObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetObjectText_(
        LONG iFlags = 0,
        BSTR *strObjectText) = 0;

    virtual HRESULT STDMETHODCALLTYPE SpawnDerivedClass_(
        LONG iFlags = 0,
        ISWbemObject **objWbemObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE SpawnInstance_(
        LONG iFlags = 0,
        ISWbemObject **objWbemObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE CompareTo_(
        IDispatch *objWbemObject,
        LONG iFlags = wbemComparisonFlagIncludeAll,
        VARIANT_BOOL *bResult) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Qualifiers_(
        ISWbemQualifierSet **objWbemQualifierSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Properties_(
        ISWbemPropertySet **objWbemPropertySet) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Methods_(
        ISWbemMethodSet **objWbemMethodSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Derivation_(
        VARIANT *strClassNameArray) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Path_(
        ISWbemObjectPath **objWbemObjectPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Security_(
        ISWbemSecurity **objWbemSecurity) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemObject, 0x76a6415a, 0xcb41, 0x11d1, 0x8b,0x02, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemObjectVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemObject methods ***/
    HRESULT (STDMETHODCALLTYPE *Put_)(
        ISWbemObject* This,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectPath **objWbemObjectPath);

    HRESULT (STDMETHODCALLTYPE *PutAsync_)(
        ISWbemObject* This,
        IDispatch *objWbemSink,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Delete_)(
        ISWbemObject* This,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet);

    HRESULT (STDMETHODCALLTYPE *DeleteAsync_)(
        ISWbemObject* This,
        IDispatch *objWbemSink,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Instances_)(
        ISWbemObject* This,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *InstancesAsync_)(
        ISWbemObject* This,
        IDispatch *objWbemSink,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Subclasses_)(
        ISWbemObject* This,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *SubclassesAsync_)(
        ISWbemObject* This,
        IDispatch *objWbemSink,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Associators_)(
        ISWbemObject* This,
        BSTR strAssocClass,
        BSTR strResultClass,
        BSTR strResultRole,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredAssocQualifier,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *AssociatorsAsync_)(
        ISWbemObject* This,
        IDispatch *objWbemSink,
        BSTR strAssocClass,
        BSTR strResultClass,
        BSTR strResultRole,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredAssocQualifier,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *References_)(
        ISWbemObject* This,
        BSTR strResultClass,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *ReferencesAsync_)(
        ISWbemObject* This,
        IDispatch *objWbemSink,
        BSTR strResultClass,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *ExecMethod_)(
        ISWbemObject* This,
        BSTR strMethodName,
        IDispatch *objWbemInParameters,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObject **objWbemOutParameters);

    HRESULT (STDMETHODCALLTYPE *ExecMethodAsync_)(
        ISWbemObject* This,
        IDispatch *objWbemSink,
        BSTR strMethodName,
        IDispatch *objWbemInParameters,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Clone_)(
        ISWbemObject* This,
        ISWbemObject **objWbemObject);

    HRESULT (STDMETHODCALLTYPE *GetObjectText_)(
        ISWbemObject* This,
        LONG iFlags,
        BSTR *strObjectText);

    HRESULT (STDMETHODCALLTYPE *SpawnDerivedClass_)(
        ISWbemObject* This,
        LONG iFlags,
        ISWbemObject **objWbemObject);

    HRESULT (STDMETHODCALLTYPE *SpawnInstance_)(
        ISWbemObject* This,
        LONG iFlags,
        ISWbemObject **objWbemObject);

    HRESULT (STDMETHODCALLTYPE *CompareTo_)(
        ISWbemObject* This,
        IDispatch *objWbemObject,
        LONG iFlags,
        VARIANT_BOOL *bResult);

    HRESULT (STDMETHODCALLTYPE *get_Qualifiers_)(
        ISWbemObject* This,
        ISWbemQualifierSet **objWbemQualifierSet);

    HRESULT (STDMETHODCALLTYPE *get_Properties_)(
        ISWbemObject* This,
        ISWbemPropertySet **objWbemPropertySet);

    HRESULT (STDMETHODCALLTYPE *get_Methods_)(
        ISWbemObject* This,
        ISWbemMethodSet **objWbemMethodSet);

    HRESULT (STDMETHODCALLTYPE *get_Derivation_)(
        ISWbemObject* This,
        VARIANT *strClassNameArray);

    HRESULT (STDMETHODCALLTYPE *get_Path_)(
        ISWbemObject* This,
        ISWbemObjectPath **objWbemObjectPath);

    HRESULT (STDMETHODCALLTYPE *get_Security_)(
        ISWbemObject* This,
        ISWbemSecurity **objWbemSecurity);

    END_INTERFACE
} ISWbemObjectVtbl;
interface ISWbemObject {
    CONST_VTBL ISWbemObjectVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemObject_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemObject_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemObject_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemObject_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemObject_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemObject_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemObject methods ***/
#define ISWbemObject_Put_(This,iFlags,objWbemNamedValueSet,objWbemObjectPath) (This)->lpVtbl->Put_(This,iFlags,objWbemNamedValueSet,objWbemObjectPath)
#define ISWbemObject_PutAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->PutAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemObject_Delete_(This,iFlags,objWbemNamedValueSet) (This)->lpVtbl->Delete_(This,iFlags,objWbemNamedValueSet)
#define ISWbemObject_DeleteAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->DeleteAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemObject_Instances_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->Instances_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemObject_InstancesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->InstancesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemObject_Subclasses_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->Subclasses_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemObject_SubclassesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->SubclassesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemObject_Associators_(This,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->Associators_(This,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemObject_AssociatorsAsync_(This,objWbemSink,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->AssociatorsAsync_(This,objWbemSink,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemObject_References_(This,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->References_(This,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemObject_ReferencesAsync_(This,objWbemSink,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->ReferencesAsync_(This,objWbemSink,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemObject_ExecMethod_(This,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters) (This)->lpVtbl->ExecMethod_(This,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters)
#define ISWbemObject_ExecMethodAsync_(This,objWbemSink,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->ExecMethodAsync_(This,objWbemSink,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemObject_Clone_(This,objWbemObject) (This)->lpVtbl->Clone_(This,objWbemObject)
#define ISWbemObject_GetObjectText_(This,iFlags,strObjectText) (This)->lpVtbl->GetObjectText_(This,iFlags,strObjectText)
#define ISWbemObject_SpawnDerivedClass_(This,iFlags,objWbemObject) (This)->lpVtbl->SpawnDerivedClass_(This,iFlags,objWbemObject)
#define ISWbemObject_SpawnInstance_(This,iFlags,objWbemObject) (This)->lpVtbl->SpawnInstance_(This,iFlags,objWbemObject)
#define ISWbemObject_CompareTo_(This,objWbemObject,iFlags,bResult) (This)->lpVtbl->CompareTo_(This,objWbemObject,iFlags,bResult)
#define ISWbemObject_get_Qualifiers_(This,objWbemQualifierSet) (This)->lpVtbl->get_Qualifiers_(This,objWbemQualifierSet)
#define ISWbemObject_get_Properties_(This,objWbemPropertySet) (This)->lpVtbl->get_Properties_(This,objWbemPropertySet)
#define ISWbemObject_get_Methods_(This,objWbemMethodSet) (This)->lpVtbl->get_Methods_(This,objWbemMethodSet)
#define ISWbemObject_get_Derivation_(This,strClassNameArray) (This)->lpVtbl->get_Derivation_(This,strClassNameArray)
#define ISWbemObject_get_Path_(This,objWbemObjectPath) (This)->lpVtbl->get_Path_(This,objWbemObjectPath)
#define ISWbemObject_get_Security_(This,objWbemSecurity) (This)->lpVtbl->get_Security_(This,objWbemSecurity)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemObject_QueryInterface(ISWbemObject* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemObject_AddRef(ISWbemObject* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemObject_Release(ISWbemObject* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemObject_GetTypeInfoCount(ISWbemObject* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemObject_GetTypeInfo(ISWbemObject* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemObject_GetIDsOfNames(ISWbemObject* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemObject_Invoke(ISWbemObject* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemObject methods ***/
static FORCEINLINE HRESULT ISWbemObject_Put_(ISWbemObject* This,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectPath **objWbemObjectPath) {
    return This->lpVtbl->Put_(This,iFlags,objWbemNamedValueSet,objWbemObjectPath);
}
static FORCEINLINE HRESULT ISWbemObject_PutAsync_(ISWbemObject* This,IDispatch *objWbemSink,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->PutAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemObject_Delete_(ISWbemObject* This,LONG iFlags,IDispatch *objWbemNamedValueSet) {
    return This->lpVtbl->Delete_(This,iFlags,objWbemNamedValueSet);
}
static FORCEINLINE HRESULT ISWbemObject_DeleteAsync_(ISWbemObject* This,IDispatch *objWbemSink,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->DeleteAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemObject_Instances_(ISWbemObject* This,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->Instances_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemObject_InstancesAsync_(ISWbemObject* This,IDispatch *objWbemSink,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->InstancesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemObject_Subclasses_(ISWbemObject* This,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->Subclasses_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemObject_SubclassesAsync_(ISWbemObject* This,IDispatch *objWbemSink,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->SubclassesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemObject_Associators_(ISWbemObject* This,BSTR strAssocClass,BSTR strResultClass,BSTR strResultRole,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredAssocQualifier,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->Associators_(This,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemObject_AssociatorsAsync_(ISWbemObject* This,IDispatch *objWbemSink,BSTR strAssocClass,BSTR strResultClass,BSTR strResultRole,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredAssocQualifier,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->AssociatorsAsync_(This,objWbemSink,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemObject_References_(ISWbemObject* This,BSTR strResultClass,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->References_(This,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemObject_ReferencesAsync_(ISWbemObject* This,IDispatch *objWbemSink,BSTR strResultClass,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->ReferencesAsync_(This,objWbemSink,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemObject_ExecMethod_(ISWbemObject* This,BSTR strMethodName,IDispatch *objWbemInParameters,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObject **objWbemOutParameters) {
    return This->lpVtbl->ExecMethod_(This,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters);
}
static FORCEINLINE HRESULT ISWbemObject_ExecMethodAsync_(ISWbemObject* This,IDispatch *objWbemSink,BSTR strMethodName,IDispatch *objWbemInParameters,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->ExecMethodAsync_(This,objWbemSink,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemObject_Clone_(ISWbemObject* This,ISWbemObject **objWbemObject) {
    return This->lpVtbl->Clone_(This,objWbemObject);
}
static FORCEINLINE HRESULT ISWbemObject_GetObjectText_(ISWbemObject* This,LONG iFlags,BSTR *strObjectText) {
    return This->lpVtbl->GetObjectText_(This,iFlags,strObjectText);
}
static FORCEINLINE HRESULT ISWbemObject_SpawnDerivedClass_(ISWbemObject* This,LONG iFlags,ISWbemObject **objWbemObject) {
    return This->lpVtbl->SpawnDerivedClass_(This,iFlags,objWbemObject);
}
static FORCEINLINE HRESULT ISWbemObject_SpawnInstance_(ISWbemObject* This,LONG iFlags,ISWbemObject **objWbemObject) {
    return This->lpVtbl->SpawnInstance_(This,iFlags,objWbemObject);
}
static FORCEINLINE HRESULT ISWbemObject_CompareTo_(ISWbemObject* This,IDispatch *objWbemObject,LONG iFlags,VARIANT_BOOL *bResult) {
    return This->lpVtbl->CompareTo_(This,objWbemObject,iFlags,bResult);
}
static FORCEINLINE HRESULT ISWbemObject_get_Qualifiers_(ISWbemObject* This,ISWbemQualifierSet **objWbemQualifierSet) {
    return This->lpVtbl->get_Qualifiers_(This,objWbemQualifierSet);
}
static FORCEINLINE HRESULT ISWbemObject_get_Properties_(ISWbemObject* This,ISWbemPropertySet **objWbemPropertySet) {
    return This->lpVtbl->get_Properties_(This,objWbemPropertySet);
}
static FORCEINLINE HRESULT ISWbemObject_get_Methods_(ISWbemObject* This,ISWbemMethodSet **objWbemMethodSet) {
    return This->lpVtbl->get_Methods_(This,objWbemMethodSet);
}
static FORCEINLINE HRESULT ISWbemObject_get_Derivation_(ISWbemObject* This,VARIANT *strClassNameArray) {
    return This->lpVtbl->get_Derivation_(This,strClassNameArray);
}
static FORCEINLINE HRESULT ISWbemObject_get_Path_(ISWbemObject* This,ISWbemObjectPath **objWbemObjectPath) {
    return This->lpVtbl->get_Path_(This,objWbemObjectPath);
}
static FORCEINLINE HRESULT ISWbemObject_get_Security_(ISWbemObject* This,ISWbemSecurity **objWbemSecurity) {
    return This->lpVtbl->get_Security_(This,objWbemSecurity);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemObject_Put__Proxy(
    ISWbemObject* This,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemObjectPath **objWbemObjectPath);
void __RPC_STUB ISWbemObject_Put__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_PutAsync__Proxy(
    ISWbemObject* This,
    IDispatch *objWbemSink,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemObject_PutAsync__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_Delete__Proxy(
    ISWbemObject* This,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet);
void __RPC_STUB ISWbemObject_Delete__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_DeleteAsync__Proxy(
    ISWbemObject* This,
    IDispatch *objWbemSink,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemObject_DeleteAsync__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_Instances__Proxy(
    ISWbemObject* This,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemObjectSet **objWbemObjectSet);
void __RPC_STUB ISWbemObject_Instances__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_InstancesAsync__Proxy(
    ISWbemObject* This,
    IDispatch *objWbemSink,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemObject_InstancesAsync__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_Subclasses__Proxy(
    ISWbemObject* This,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemObjectSet **objWbemObjectSet);
void __RPC_STUB ISWbemObject_Subclasses__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_SubclassesAsync__Proxy(
    ISWbemObject* This,
    IDispatch *objWbemSink,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemObject_SubclassesAsync__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_Associators__Proxy(
    ISWbemObject* This,
    BSTR strAssocClass,
    BSTR strResultClass,
    BSTR strResultRole,
    BSTR strRole,
    VARIANT_BOOL bClassesOnly,
    VARIANT_BOOL bSchemaOnly,
    BSTR strRequiredAssocQualifier,
    BSTR strRequiredQualifier,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemObjectSet **objWbemObjectSet);
void __RPC_STUB ISWbemObject_Associators__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_AssociatorsAsync__Proxy(
    ISWbemObject* This,
    IDispatch *objWbemSink,
    BSTR strAssocClass,
    BSTR strResultClass,
    BSTR strResultRole,
    BSTR strRole,
    VARIANT_BOOL bClassesOnly,
    VARIANT_BOOL bSchemaOnly,
    BSTR strRequiredAssocQualifier,
    BSTR strRequiredQualifier,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemObject_AssociatorsAsync__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_References__Proxy(
    ISWbemObject* This,
    BSTR strResultClass,
    BSTR strRole,
    VARIANT_BOOL bClassesOnly,
    VARIANT_BOOL bSchemaOnly,
    BSTR strRequiredQualifier,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemObjectSet **objWbemObjectSet);
void __RPC_STUB ISWbemObject_References__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_ReferencesAsync__Proxy(
    ISWbemObject* This,
    IDispatch *objWbemSink,
    BSTR strResultClass,
    BSTR strRole,
    VARIANT_BOOL bClassesOnly,
    VARIANT_BOOL bSchemaOnly,
    BSTR strRequiredQualifier,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemObject_ReferencesAsync__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_ExecMethod__Proxy(
    ISWbemObject* This,
    BSTR strMethodName,
    IDispatch *objWbemInParameters,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemObject **objWbemOutParameters);
void __RPC_STUB ISWbemObject_ExecMethod__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_ExecMethodAsync__Proxy(
    ISWbemObject* This,
    IDispatch *objWbemSink,
    BSTR strMethodName,
    IDispatch *objWbemInParameters,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    IDispatch *objWbemAsyncContext);
void __RPC_STUB ISWbemObject_ExecMethodAsync__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_Clone__Proxy(
    ISWbemObject* This,
    ISWbemObject **objWbemObject);
void __RPC_STUB ISWbemObject_Clone__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_GetObjectText__Proxy(
    ISWbemObject* This,
    LONG iFlags,
    BSTR *strObjectText);
void __RPC_STUB ISWbemObject_GetObjectText__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_SpawnDerivedClass__Proxy(
    ISWbemObject* This,
    LONG iFlags,
    ISWbemObject **objWbemObject);
void __RPC_STUB ISWbemObject_SpawnDerivedClass__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_SpawnInstance__Proxy(
    ISWbemObject* This,
    LONG iFlags,
    ISWbemObject **objWbemObject);
void __RPC_STUB ISWbemObject_SpawnInstance__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_CompareTo__Proxy(
    ISWbemObject* This,
    IDispatch *objWbemObject,
    LONG iFlags,
    VARIANT_BOOL *bResult);
void __RPC_STUB ISWbemObject_CompareTo__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_get_Qualifiers__Proxy(
    ISWbemObject* This,
    ISWbemQualifierSet **objWbemQualifierSet);
void __RPC_STUB ISWbemObject_get_Qualifiers__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_get_Properties__Proxy(
    ISWbemObject* This,
    ISWbemPropertySet **objWbemPropertySet);
void __RPC_STUB ISWbemObject_get_Properties__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_get_Methods__Proxy(
    ISWbemObject* This,
    ISWbemMethodSet **objWbemMethodSet);
void __RPC_STUB ISWbemObject_get_Methods__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_get_Derivation__Proxy(
    ISWbemObject* This,
    VARIANT *strClassNameArray);
void __RPC_STUB ISWbemObject_get_Derivation__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_get_Path__Proxy(
    ISWbemObject* This,
    ISWbemObjectPath **objWbemObjectPath);
void __RPC_STUB ISWbemObject_get_Path__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObject_get_Security__Proxy(
    ISWbemObject* This,
    ISWbemSecurity **objWbemSecurity);
void __RPC_STUB ISWbemObject_get_Security__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemObject_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemObjectEx interface
 */
#ifndef __ISWbemObjectEx_INTERFACE_DEFINED__
#define __ISWbemObjectEx_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemObjectEx, 0x269ad56a, 0x8a67, 0x4129, 0xbc,0x8c, 0x05,0x06,0xdc,0xfe,0x98,0x80);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("269ad56a-8a67-4129-bc8c-0506dcfe9880")
ISWbemObjectEx : public ISWbemObject
{
    virtual HRESULT STDMETHODCALLTYPE Refresh_(
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SystemProperties_(
        ISWbemPropertySet **objWbemPropertySet) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetText_(
        WbemObjectTextFormatEnum iObjectTextFormat,
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        BSTR *bsText) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFromText_(
        BSTR bsText,
        WbemObjectTextFormatEnum iObjectTextFormat,
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemObjectEx, 0x269ad56a, 0x8a67, 0x4129, 0xbc,0x8c, 0x05,0x06,0xdc,0xfe,0x98,0x80)
#endif
#else
typedef struct ISWbemObjectExVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemObject methods ***/
    HRESULT (STDMETHODCALLTYPE *Put_)(
        ISWbemObjectEx* This,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectPath **objWbemObjectPath);

    HRESULT (STDMETHODCALLTYPE *PutAsync_)(
        ISWbemObjectEx* This,
        IDispatch *objWbemSink,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Delete_)(
        ISWbemObjectEx* This,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet);

    HRESULT (STDMETHODCALLTYPE *DeleteAsync_)(
        ISWbemObjectEx* This,
        IDispatch *objWbemSink,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Instances_)(
        ISWbemObjectEx* This,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *InstancesAsync_)(
        ISWbemObjectEx* This,
        IDispatch *objWbemSink,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Subclasses_)(
        ISWbemObjectEx* This,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *SubclassesAsync_)(
        ISWbemObjectEx* This,
        IDispatch *objWbemSink,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Associators_)(
        ISWbemObjectEx* This,
        BSTR strAssocClass,
        BSTR strResultClass,
        BSTR strResultRole,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredAssocQualifier,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *AssociatorsAsync_)(
        ISWbemObjectEx* This,
        IDispatch *objWbemSink,
        BSTR strAssocClass,
        BSTR strResultClass,
        BSTR strResultRole,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredAssocQualifier,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *References_)(
        ISWbemObjectEx* This,
        BSTR strResultClass,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *ReferencesAsync_)(
        ISWbemObjectEx* This,
        IDispatch *objWbemSink,
        BSTR strResultClass,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *ExecMethod_)(
        ISWbemObjectEx* This,
        BSTR strMethodName,
        IDispatch *objWbemInParameters,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObject **objWbemOutParameters);

    HRESULT (STDMETHODCALLTYPE *ExecMethodAsync_)(
        ISWbemObjectEx* This,
        IDispatch *objWbemSink,
        BSTR strMethodName,
        IDispatch *objWbemInParameters,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Clone_)(
        ISWbemObjectEx* This,
        ISWbemObject **objWbemObject);

    HRESULT (STDMETHODCALLTYPE *GetObjectText_)(
        ISWbemObjectEx* This,
        LONG iFlags,
        BSTR *strObjectText);

    HRESULT (STDMETHODCALLTYPE *SpawnDerivedClass_)(
        ISWbemObjectEx* This,
        LONG iFlags,
        ISWbemObject **objWbemObject);

    HRESULT (STDMETHODCALLTYPE *SpawnInstance_)(
        ISWbemObjectEx* This,
        LONG iFlags,
        ISWbemObject **objWbemObject);

    HRESULT (STDMETHODCALLTYPE *CompareTo_)(
        ISWbemObjectEx* This,
        IDispatch *objWbemObject,
        LONG iFlags,
        VARIANT_BOOL *bResult);

    HRESULT (STDMETHODCALLTYPE *get_Qualifiers_)(
        ISWbemObjectEx* This,
        ISWbemQualifierSet **objWbemQualifierSet);

    HRESULT (STDMETHODCALLTYPE *get_Properties_)(
        ISWbemObjectEx* This,
        ISWbemPropertySet **objWbemPropertySet);

    HRESULT (STDMETHODCALLTYPE *get_Methods_)(
        ISWbemObjectEx* This,
        ISWbemMethodSet **objWbemMethodSet);

    HRESULT (STDMETHODCALLTYPE *get_Derivation_)(
        ISWbemObjectEx* This,
        VARIANT *strClassNameArray);

    HRESULT (STDMETHODCALLTYPE *get_Path_)(
        ISWbemObjectEx* This,
        ISWbemObjectPath **objWbemObjectPath);

    HRESULT (STDMETHODCALLTYPE *get_Security_)(
        ISWbemObjectEx* This,
        ISWbemSecurity **objWbemSecurity);

    /*** ISWbemObjectEx methods ***/
    HRESULT (STDMETHODCALLTYPE *Refresh_)(
        ISWbemObjectEx* This,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet);

    HRESULT (STDMETHODCALLTYPE *get_SystemProperties_)(
        ISWbemObjectEx* This,
        ISWbemPropertySet **objWbemPropertySet);

    HRESULT (STDMETHODCALLTYPE *GetText_)(
        ISWbemObjectEx* This,
        WbemObjectTextFormatEnum iObjectTextFormat,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        BSTR *bsText);

    HRESULT (STDMETHODCALLTYPE *SetFromText_)(
        ISWbemObjectEx* This,
        BSTR bsText,
        WbemObjectTextFormatEnum iObjectTextFormat,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet);

    END_INTERFACE
} ISWbemObjectExVtbl;
interface ISWbemObjectEx {
    CONST_VTBL ISWbemObjectExVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemObjectEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemObjectEx_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemObjectEx_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemObjectEx_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemObjectEx_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemObjectEx_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemObjectEx_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemObject methods ***/
#define ISWbemObjectEx_Put_(This,iFlags,objWbemNamedValueSet,objWbemObjectPath) (This)->lpVtbl->Put_(This,iFlags,objWbemNamedValueSet,objWbemObjectPath)
#define ISWbemObjectEx_PutAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->PutAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemObjectEx_Delete_(This,iFlags,objWbemNamedValueSet) (This)->lpVtbl->Delete_(This,iFlags,objWbemNamedValueSet)
#define ISWbemObjectEx_DeleteAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->DeleteAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemObjectEx_Instances_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->Instances_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemObjectEx_InstancesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->InstancesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemObjectEx_Subclasses_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->Subclasses_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemObjectEx_SubclassesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->SubclassesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemObjectEx_Associators_(This,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->Associators_(This,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemObjectEx_AssociatorsAsync_(This,objWbemSink,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->AssociatorsAsync_(This,objWbemSink,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemObjectEx_References_(This,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->References_(This,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemObjectEx_ReferencesAsync_(This,objWbemSink,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->ReferencesAsync_(This,objWbemSink,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemObjectEx_ExecMethod_(This,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters) (This)->lpVtbl->ExecMethod_(This,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters)
#define ISWbemObjectEx_ExecMethodAsync_(This,objWbemSink,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->ExecMethodAsync_(This,objWbemSink,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemObjectEx_Clone_(This,objWbemObject) (This)->lpVtbl->Clone_(This,objWbemObject)
#define ISWbemObjectEx_GetObjectText_(This,iFlags,strObjectText) (This)->lpVtbl->GetObjectText_(This,iFlags,strObjectText)
#define ISWbemObjectEx_SpawnDerivedClass_(This,iFlags,objWbemObject) (This)->lpVtbl->SpawnDerivedClass_(This,iFlags,objWbemObject)
#define ISWbemObjectEx_SpawnInstance_(This,iFlags,objWbemObject) (This)->lpVtbl->SpawnInstance_(This,iFlags,objWbemObject)
#define ISWbemObjectEx_CompareTo_(This,objWbemObject,iFlags,bResult) (This)->lpVtbl->CompareTo_(This,objWbemObject,iFlags,bResult)
#define ISWbemObjectEx_get_Qualifiers_(This,objWbemQualifierSet) (This)->lpVtbl->get_Qualifiers_(This,objWbemQualifierSet)
#define ISWbemObjectEx_get_Properties_(This,objWbemPropertySet) (This)->lpVtbl->get_Properties_(This,objWbemPropertySet)
#define ISWbemObjectEx_get_Methods_(This,objWbemMethodSet) (This)->lpVtbl->get_Methods_(This,objWbemMethodSet)
#define ISWbemObjectEx_get_Derivation_(This,strClassNameArray) (This)->lpVtbl->get_Derivation_(This,strClassNameArray)
#define ISWbemObjectEx_get_Path_(This,objWbemObjectPath) (This)->lpVtbl->get_Path_(This,objWbemObjectPath)
#define ISWbemObjectEx_get_Security_(This,objWbemSecurity) (This)->lpVtbl->get_Security_(This,objWbemSecurity)
/*** ISWbemObjectEx methods ***/
#define ISWbemObjectEx_Refresh_(This,iFlags,objWbemNamedValueSet) (This)->lpVtbl->Refresh_(This,iFlags,objWbemNamedValueSet)
#define ISWbemObjectEx_get_SystemProperties_(This,objWbemPropertySet) (This)->lpVtbl->get_SystemProperties_(This,objWbemPropertySet)
#define ISWbemObjectEx_GetText_(This,iObjectTextFormat,iFlags,objWbemNamedValueSet,bsText) (This)->lpVtbl->GetText_(This,iObjectTextFormat,iFlags,objWbemNamedValueSet,bsText)
#define ISWbemObjectEx_SetFromText_(This,bsText,iObjectTextFormat,iFlags,objWbemNamedValueSet) (This)->lpVtbl->SetFromText_(This,bsText,iObjectTextFormat,iFlags,objWbemNamedValueSet)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemObjectEx_QueryInterface(ISWbemObjectEx* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemObjectEx_AddRef(ISWbemObjectEx* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemObjectEx_Release(ISWbemObjectEx* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemObjectEx_GetTypeInfoCount(ISWbemObjectEx* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemObjectEx_GetTypeInfo(ISWbemObjectEx* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemObjectEx_GetIDsOfNames(ISWbemObjectEx* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemObjectEx_Invoke(ISWbemObjectEx* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemObject methods ***/
static FORCEINLINE HRESULT ISWbemObjectEx_Put_(ISWbemObjectEx* This,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectPath **objWbemObjectPath) {
    return This->lpVtbl->Put_(This,iFlags,objWbemNamedValueSet,objWbemObjectPath);
}
static FORCEINLINE HRESULT ISWbemObjectEx_PutAsync_(ISWbemObjectEx* This,IDispatch *objWbemSink,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->PutAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemObjectEx_Delete_(ISWbemObjectEx* This,LONG iFlags,IDispatch *objWbemNamedValueSet) {
    return This->lpVtbl->Delete_(This,iFlags,objWbemNamedValueSet);
}
static FORCEINLINE HRESULT ISWbemObjectEx_DeleteAsync_(ISWbemObjectEx* This,IDispatch *objWbemSink,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->DeleteAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemObjectEx_Instances_(ISWbemObjectEx* This,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->Instances_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemObjectEx_InstancesAsync_(ISWbemObjectEx* This,IDispatch *objWbemSink,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->InstancesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemObjectEx_Subclasses_(ISWbemObjectEx* This,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->Subclasses_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemObjectEx_SubclassesAsync_(ISWbemObjectEx* This,IDispatch *objWbemSink,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->SubclassesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemObjectEx_Associators_(ISWbemObjectEx* This,BSTR strAssocClass,BSTR strResultClass,BSTR strResultRole,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredAssocQualifier,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->Associators_(This,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemObjectEx_AssociatorsAsync_(ISWbemObjectEx* This,IDispatch *objWbemSink,BSTR strAssocClass,BSTR strResultClass,BSTR strResultRole,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredAssocQualifier,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->AssociatorsAsync_(This,objWbemSink,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemObjectEx_References_(ISWbemObjectEx* This,BSTR strResultClass,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->References_(This,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemObjectEx_ReferencesAsync_(ISWbemObjectEx* This,IDispatch *objWbemSink,BSTR strResultClass,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->ReferencesAsync_(This,objWbemSink,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemObjectEx_ExecMethod_(ISWbemObjectEx* This,BSTR strMethodName,IDispatch *objWbemInParameters,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObject **objWbemOutParameters) {
    return This->lpVtbl->ExecMethod_(This,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters);
}
static FORCEINLINE HRESULT ISWbemObjectEx_ExecMethodAsync_(ISWbemObjectEx* This,IDispatch *objWbemSink,BSTR strMethodName,IDispatch *objWbemInParameters,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->ExecMethodAsync_(This,objWbemSink,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemObjectEx_Clone_(ISWbemObjectEx* This,ISWbemObject **objWbemObject) {
    return This->lpVtbl->Clone_(This,objWbemObject);
}
static FORCEINLINE HRESULT ISWbemObjectEx_GetObjectText_(ISWbemObjectEx* This,LONG iFlags,BSTR *strObjectText) {
    return This->lpVtbl->GetObjectText_(This,iFlags,strObjectText);
}
static FORCEINLINE HRESULT ISWbemObjectEx_SpawnDerivedClass_(ISWbemObjectEx* This,LONG iFlags,ISWbemObject **objWbemObject) {
    return This->lpVtbl->SpawnDerivedClass_(This,iFlags,objWbemObject);
}
static FORCEINLINE HRESULT ISWbemObjectEx_SpawnInstance_(ISWbemObjectEx* This,LONG iFlags,ISWbemObject **objWbemObject) {
    return This->lpVtbl->SpawnInstance_(This,iFlags,objWbemObject);
}
static FORCEINLINE HRESULT ISWbemObjectEx_CompareTo_(ISWbemObjectEx* This,IDispatch *objWbemObject,LONG iFlags,VARIANT_BOOL *bResult) {
    return This->lpVtbl->CompareTo_(This,objWbemObject,iFlags,bResult);
}
static FORCEINLINE HRESULT ISWbemObjectEx_get_Qualifiers_(ISWbemObjectEx* This,ISWbemQualifierSet **objWbemQualifierSet) {
    return This->lpVtbl->get_Qualifiers_(This,objWbemQualifierSet);
}
static FORCEINLINE HRESULT ISWbemObjectEx_get_Properties_(ISWbemObjectEx* This,ISWbemPropertySet **objWbemPropertySet) {
    return This->lpVtbl->get_Properties_(This,objWbemPropertySet);
}
static FORCEINLINE HRESULT ISWbemObjectEx_get_Methods_(ISWbemObjectEx* This,ISWbemMethodSet **objWbemMethodSet) {
    return This->lpVtbl->get_Methods_(This,objWbemMethodSet);
}
static FORCEINLINE HRESULT ISWbemObjectEx_get_Derivation_(ISWbemObjectEx* This,VARIANT *strClassNameArray) {
    return This->lpVtbl->get_Derivation_(This,strClassNameArray);
}
static FORCEINLINE HRESULT ISWbemObjectEx_get_Path_(ISWbemObjectEx* This,ISWbemObjectPath **objWbemObjectPath) {
    return This->lpVtbl->get_Path_(This,objWbemObjectPath);
}
static FORCEINLINE HRESULT ISWbemObjectEx_get_Security_(ISWbemObjectEx* This,ISWbemSecurity **objWbemSecurity) {
    return This->lpVtbl->get_Security_(This,objWbemSecurity);
}
/*** ISWbemObjectEx methods ***/
static FORCEINLINE HRESULT ISWbemObjectEx_Refresh_(ISWbemObjectEx* This,LONG iFlags,IDispatch *objWbemNamedValueSet) {
    return This->lpVtbl->Refresh_(This,iFlags,objWbemNamedValueSet);
}
static FORCEINLINE HRESULT ISWbemObjectEx_get_SystemProperties_(ISWbemObjectEx* This,ISWbemPropertySet **objWbemPropertySet) {
    return This->lpVtbl->get_SystemProperties_(This,objWbemPropertySet);
}
static FORCEINLINE HRESULT ISWbemObjectEx_GetText_(ISWbemObjectEx* This,WbemObjectTextFormatEnum iObjectTextFormat,LONG iFlags,IDispatch *objWbemNamedValueSet,BSTR *bsText) {
    return This->lpVtbl->GetText_(This,iObjectTextFormat,iFlags,objWbemNamedValueSet,bsText);
}
static FORCEINLINE HRESULT ISWbemObjectEx_SetFromText_(ISWbemObjectEx* This,BSTR bsText,WbemObjectTextFormatEnum iObjectTextFormat,LONG iFlags,IDispatch *objWbemNamedValueSet) {
    return This->lpVtbl->SetFromText_(This,bsText,iObjectTextFormat,iFlags,objWbemNamedValueSet);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemObjectEx_Refresh__Proxy(
    ISWbemObjectEx* This,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet);
void __RPC_STUB ISWbemObjectEx_Refresh__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectEx_get_SystemProperties__Proxy(
    ISWbemObjectEx* This,
    ISWbemPropertySet **objWbemPropertySet);
void __RPC_STUB ISWbemObjectEx_get_SystemProperties__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectEx_GetText__Proxy(
    ISWbemObjectEx* This,
    WbemObjectTextFormatEnum iObjectTextFormat,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    BSTR *bsText);
void __RPC_STUB ISWbemObjectEx_GetText__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectEx_SetFromText__Proxy(
    ISWbemObjectEx* This,
    BSTR bsText,
    WbemObjectTextFormatEnum iObjectTextFormat,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet);
void __RPC_STUB ISWbemObjectEx_SetFromText__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemObjectEx_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemLastError interface
 */
#ifndef __ISWbemLastError_INTERFACE_DEFINED__
#define __ISWbemLastError_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemLastError, 0xd962db84, 0xd4bb, 0x11d1, 0x8b,0x09, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d962db84-d4bb-11d1-8b09-00600806d9b6")
ISWbemLastError : public ISWbemObject
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemLastError, 0xd962db84, 0xd4bb, 0x11d1, 0x8b,0x09, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemLastErrorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemObject methods ***/
    HRESULT (STDMETHODCALLTYPE *Put_)(
        ISWbemLastError* This,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectPath **objWbemObjectPath);

    HRESULT (STDMETHODCALLTYPE *PutAsync_)(
        ISWbemLastError* This,
        IDispatch *objWbemSink,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Delete_)(
        ISWbemLastError* This,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet);

    HRESULT (STDMETHODCALLTYPE *DeleteAsync_)(
        ISWbemLastError* This,
        IDispatch *objWbemSink,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Instances_)(
        ISWbemLastError* This,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *InstancesAsync_)(
        ISWbemLastError* This,
        IDispatch *objWbemSink,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Subclasses_)(
        ISWbemLastError* This,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *SubclassesAsync_)(
        ISWbemLastError* This,
        IDispatch *objWbemSink,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Associators_)(
        ISWbemLastError* This,
        BSTR strAssocClass,
        BSTR strResultClass,
        BSTR strResultRole,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredAssocQualifier,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *AssociatorsAsync_)(
        ISWbemLastError* This,
        IDispatch *objWbemSink,
        BSTR strAssocClass,
        BSTR strResultClass,
        BSTR strResultRole,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredAssocQualifier,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *References_)(
        ISWbemLastError* This,
        BSTR strResultClass,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *ReferencesAsync_)(
        ISWbemLastError* This,
        IDispatch *objWbemSink,
        BSTR strResultClass,
        BSTR strRole,
        VARIANT_BOOL bClassesOnly,
        VARIANT_BOOL bSchemaOnly,
        BSTR strRequiredQualifier,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *ExecMethod_)(
        ISWbemLastError* This,
        BSTR strMethodName,
        IDispatch *objWbemInParameters,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemObject **objWbemOutParameters);

    HRESULT (STDMETHODCALLTYPE *ExecMethodAsync_)(
        ISWbemLastError* This,
        IDispatch *objWbemSink,
        BSTR strMethodName,
        IDispatch *objWbemInParameters,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        IDispatch *objWbemAsyncContext);

    HRESULT (STDMETHODCALLTYPE *Clone_)(
        ISWbemLastError* This,
        ISWbemObject **objWbemObject);

    HRESULT (STDMETHODCALLTYPE *GetObjectText_)(
        ISWbemLastError* This,
        LONG iFlags,
        BSTR *strObjectText);

    HRESULT (STDMETHODCALLTYPE *SpawnDerivedClass_)(
        ISWbemLastError* This,
        LONG iFlags,
        ISWbemObject **objWbemObject);

    HRESULT (STDMETHODCALLTYPE *SpawnInstance_)(
        ISWbemLastError* This,
        LONG iFlags,
        ISWbemObject **objWbemObject);

    HRESULT (STDMETHODCALLTYPE *CompareTo_)(
        ISWbemLastError* This,
        IDispatch *objWbemObject,
        LONG iFlags,
        VARIANT_BOOL *bResult);

    HRESULT (STDMETHODCALLTYPE *get_Qualifiers_)(
        ISWbemLastError* This,
        ISWbemQualifierSet **objWbemQualifierSet);

    HRESULT (STDMETHODCALLTYPE *get_Properties_)(
        ISWbemLastError* This,
        ISWbemPropertySet **objWbemPropertySet);

    HRESULT (STDMETHODCALLTYPE *get_Methods_)(
        ISWbemLastError* This,
        ISWbemMethodSet **objWbemMethodSet);

    HRESULT (STDMETHODCALLTYPE *get_Derivation_)(
        ISWbemLastError* This,
        VARIANT *strClassNameArray);

    HRESULT (STDMETHODCALLTYPE *get_Path_)(
        ISWbemLastError* This,
        ISWbemObjectPath **objWbemObjectPath);

    HRESULT (STDMETHODCALLTYPE *get_Security_)(
        ISWbemLastError* This,
        ISWbemSecurity **objWbemSecurity);

    END_INTERFACE
} ISWbemLastErrorVtbl;
interface ISWbemLastError {
    CONST_VTBL ISWbemLastErrorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemLastError_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemLastError_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemLastError_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemLastError_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemLastError_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemLastError_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemLastError_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemObject methods ***/
#define ISWbemLastError_Put_(This,iFlags,objWbemNamedValueSet,objWbemObjectPath) (This)->lpVtbl->Put_(This,iFlags,objWbemNamedValueSet,objWbemObjectPath)
#define ISWbemLastError_PutAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->PutAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemLastError_Delete_(This,iFlags,objWbemNamedValueSet) (This)->lpVtbl->Delete_(This,iFlags,objWbemNamedValueSet)
#define ISWbemLastError_DeleteAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->DeleteAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemLastError_Instances_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->Instances_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemLastError_InstancesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->InstancesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemLastError_Subclasses_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->Subclasses_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemLastError_SubclassesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->SubclassesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemLastError_Associators_(This,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->Associators_(This,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemLastError_AssociatorsAsync_(This,objWbemSink,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->AssociatorsAsync_(This,objWbemSink,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemLastError_References_(This,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet) (This)->lpVtbl->References_(This,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet)
#define ISWbemLastError_ReferencesAsync_(This,objWbemSink,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->ReferencesAsync_(This,objWbemSink,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemLastError_ExecMethod_(This,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters) (This)->lpVtbl->ExecMethod_(This,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters)
#define ISWbemLastError_ExecMethodAsync_(This,objWbemSink,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext) (This)->lpVtbl->ExecMethodAsync_(This,objWbemSink,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext)
#define ISWbemLastError_Clone_(This,objWbemObject) (This)->lpVtbl->Clone_(This,objWbemObject)
#define ISWbemLastError_GetObjectText_(This,iFlags,strObjectText) (This)->lpVtbl->GetObjectText_(This,iFlags,strObjectText)
#define ISWbemLastError_SpawnDerivedClass_(This,iFlags,objWbemObject) (This)->lpVtbl->SpawnDerivedClass_(This,iFlags,objWbemObject)
#define ISWbemLastError_SpawnInstance_(This,iFlags,objWbemObject) (This)->lpVtbl->SpawnInstance_(This,iFlags,objWbemObject)
#define ISWbemLastError_CompareTo_(This,objWbemObject,iFlags,bResult) (This)->lpVtbl->CompareTo_(This,objWbemObject,iFlags,bResult)
#define ISWbemLastError_get_Qualifiers_(This,objWbemQualifierSet) (This)->lpVtbl->get_Qualifiers_(This,objWbemQualifierSet)
#define ISWbemLastError_get_Properties_(This,objWbemPropertySet) (This)->lpVtbl->get_Properties_(This,objWbemPropertySet)
#define ISWbemLastError_get_Methods_(This,objWbemMethodSet) (This)->lpVtbl->get_Methods_(This,objWbemMethodSet)
#define ISWbemLastError_get_Derivation_(This,strClassNameArray) (This)->lpVtbl->get_Derivation_(This,strClassNameArray)
#define ISWbemLastError_get_Path_(This,objWbemObjectPath) (This)->lpVtbl->get_Path_(This,objWbemObjectPath)
#define ISWbemLastError_get_Security_(This,objWbemSecurity) (This)->lpVtbl->get_Security_(This,objWbemSecurity)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemLastError_QueryInterface(ISWbemLastError* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemLastError_AddRef(ISWbemLastError* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemLastError_Release(ISWbemLastError* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemLastError_GetTypeInfoCount(ISWbemLastError* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemLastError_GetTypeInfo(ISWbemLastError* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemLastError_GetIDsOfNames(ISWbemLastError* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemLastError_Invoke(ISWbemLastError* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemObject methods ***/
static FORCEINLINE HRESULT ISWbemLastError_Put_(ISWbemLastError* This,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectPath **objWbemObjectPath) {
    return This->lpVtbl->Put_(This,iFlags,objWbemNamedValueSet,objWbemObjectPath);
}
static FORCEINLINE HRESULT ISWbemLastError_PutAsync_(ISWbemLastError* This,IDispatch *objWbemSink,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->PutAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemLastError_Delete_(ISWbemLastError* This,LONG iFlags,IDispatch *objWbemNamedValueSet) {
    return This->lpVtbl->Delete_(This,iFlags,objWbemNamedValueSet);
}
static FORCEINLINE HRESULT ISWbemLastError_DeleteAsync_(ISWbemLastError* This,IDispatch *objWbemSink,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->DeleteAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemLastError_Instances_(ISWbemLastError* This,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->Instances_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemLastError_InstancesAsync_(ISWbemLastError* This,IDispatch *objWbemSink,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->InstancesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemLastError_Subclasses_(ISWbemLastError* This,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->Subclasses_(This,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemLastError_SubclassesAsync_(ISWbemLastError* This,IDispatch *objWbemSink,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->SubclassesAsync_(This,objWbemSink,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemLastError_Associators_(ISWbemLastError* This,BSTR strAssocClass,BSTR strResultClass,BSTR strResultRole,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredAssocQualifier,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->Associators_(This,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemLastError_AssociatorsAsync_(ISWbemLastError* This,IDispatch *objWbemSink,BSTR strAssocClass,BSTR strResultClass,BSTR strResultRole,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredAssocQualifier,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->AssociatorsAsync_(This,objWbemSink,strAssocClass,strResultClass,strResultRole,strRole,bClassesOnly,bSchemaOnly,strRequiredAssocQualifier,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemLastError_References_(ISWbemLastError* This,BSTR strResultClass,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->References_(This,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemLastError_ReferencesAsync_(ISWbemLastError* This,IDispatch *objWbemSink,BSTR strResultClass,BSTR strRole,VARIANT_BOOL bClassesOnly,VARIANT_BOOL bSchemaOnly,BSTR strRequiredQualifier,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->ReferencesAsync_(This,objWbemSink,strResultClass,strRole,bClassesOnly,bSchemaOnly,strRequiredQualifier,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemLastError_ExecMethod_(ISWbemLastError* This,BSTR strMethodName,IDispatch *objWbemInParameters,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemObject **objWbemOutParameters) {
    return This->lpVtbl->ExecMethod_(This,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemOutParameters);
}
static FORCEINLINE HRESULT ISWbemLastError_ExecMethodAsync_(ISWbemLastError* This,IDispatch *objWbemSink,BSTR strMethodName,IDispatch *objWbemInParameters,LONG iFlags,IDispatch *objWbemNamedValueSet,IDispatch *objWbemAsyncContext) {
    return This->lpVtbl->ExecMethodAsync_(This,objWbemSink,strMethodName,objWbemInParameters,iFlags,objWbemNamedValueSet,objWbemAsyncContext);
}
static FORCEINLINE HRESULT ISWbemLastError_Clone_(ISWbemLastError* This,ISWbemObject **objWbemObject) {
    return This->lpVtbl->Clone_(This,objWbemObject);
}
static FORCEINLINE HRESULT ISWbemLastError_GetObjectText_(ISWbemLastError* This,LONG iFlags,BSTR *strObjectText) {
    return This->lpVtbl->GetObjectText_(This,iFlags,strObjectText);
}
static FORCEINLINE HRESULT ISWbemLastError_SpawnDerivedClass_(ISWbemLastError* This,LONG iFlags,ISWbemObject **objWbemObject) {
    return This->lpVtbl->SpawnDerivedClass_(This,iFlags,objWbemObject);
}
static FORCEINLINE HRESULT ISWbemLastError_SpawnInstance_(ISWbemLastError* This,LONG iFlags,ISWbemObject **objWbemObject) {
    return This->lpVtbl->SpawnInstance_(This,iFlags,objWbemObject);
}
static FORCEINLINE HRESULT ISWbemLastError_CompareTo_(ISWbemLastError* This,IDispatch *objWbemObject,LONG iFlags,VARIANT_BOOL *bResult) {
    return This->lpVtbl->CompareTo_(This,objWbemObject,iFlags,bResult);
}
static FORCEINLINE HRESULT ISWbemLastError_get_Qualifiers_(ISWbemLastError* This,ISWbemQualifierSet **objWbemQualifierSet) {
    return This->lpVtbl->get_Qualifiers_(This,objWbemQualifierSet);
}
static FORCEINLINE HRESULT ISWbemLastError_get_Properties_(ISWbemLastError* This,ISWbemPropertySet **objWbemPropertySet) {
    return This->lpVtbl->get_Properties_(This,objWbemPropertySet);
}
static FORCEINLINE HRESULT ISWbemLastError_get_Methods_(ISWbemLastError* This,ISWbemMethodSet **objWbemMethodSet) {
    return This->lpVtbl->get_Methods_(This,objWbemMethodSet);
}
static FORCEINLINE HRESULT ISWbemLastError_get_Derivation_(ISWbemLastError* This,VARIANT *strClassNameArray) {
    return This->lpVtbl->get_Derivation_(This,strClassNameArray);
}
static FORCEINLINE HRESULT ISWbemLastError_get_Path_(ISWbemLastError* This,ISWbemObjectPath **objWbemObjectPath) {
    return This->lpVtbl->get_Path_(This,objWbemObjectPath);
}
static FORCEINLINE HRESULT ISWbemLastError_get_Security_(ISWbemLastError* This,ISWbemSecurity **objWbemSecurity) {
    return This->lpVtbl->get_Security_(This,objWbemSecurity);
}
#endif
#endif

#endif


#endif  /* __ISWbemLastError_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemObjectSet interface
 */
#ifndef __ISWbemObjectSet_INTERFACE_DEFINED__
#define __ISWbemObjectSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemObjectSet, 0x76a6415f, 0xcb41, 0x11d1, 0x8b,0x02, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("76a6415f-cb41-11d1-8b02-00600806d9b6")
ISWbemObjectSet : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **pUnk) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        BSTR strObjectPath,
        LONG iFlags = 0,
        ISWbemObject **objWbemObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *iCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Security_(
        ISWbemSecurity **objWbemSecurity) = 0;

    virtual HRESULT STDMETHODCALLTYPE ItemIndex(
        LONG lIndex,
        ISWbemObject **objWbemObject) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemObjectSet, 0x76a6415f, 0xcb41, 0x11d1, 0x8b,0x02, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemObjectSetVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemObjectSet methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        ISWbemObjectSet* This,
        IUnknown **pUnk);

    HRESULT (STDMETHODCALLTYPE *Item)(
        ISWbemObjectSet* This,
        BSTR strObjectPath,
        LONG iFlags,
        ISWbemObject **objWbemObject);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        ISWbemObjectSet* This,
        LONG *iCount);

    HRESULT (STDMETHODCALLTYPE *get_Security_)(
        ISWbemObjectSet* This,
        ISWbemSecurity **objWbemSecurity);

    HRESULT (STDMETHODCALLTYPE *ItemIndex)(
        ISWbemObjectSet* This,
        LONG lIndex,
        ISWbemObject **objWbemObject);

    END_INTERFACE
} ISWbemObjectSetVtbl;
interface ISWbemObjectSet {
    CONST_VTBL ISWbemObjectSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemObjectSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemObjectSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemObjectSet_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemObjectSet_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemObjectSet_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemObjectSet_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemObjectSet_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemObjectSet methods ***/
#define ISWbemObjectSet_get__NewEnum(This,pUnk) (This)->lpVtbl->get__NewEnum(This,pUnk)
#define ISWbemObjectSet_Item(This,strObjectPath,iFlags,objWbemObject) (This)->lpVtbl->Item(This,strObjectPath,iFlags,objWbemObject)
#define ISWbemObjectSet_get_Count(This,iCount) (This)->lpVtbl->get_Count(This,iCount)
#define ISWbemObjectSet_get_Security_(This,objWbemSecurity) (This)->lpVtbl->get_Security_(This,objWbemSecurity)
#define ISWbemObjectSet_ItemIndex(This,lIndex,objWbemObject) (This)->lpVtbl->ItemIndex(This,lIndex,objWbemObject)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemObjectSet_QueryInterface(ISWbemObjectSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemObjectSet_AddRef(ISWbemObjectSet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemObjectSet_Release(ISWbemObjectSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemObjectSet_GetTypeInfoCount(ISWbemObjectSet* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemObjectSet_GetTypeInfo(ISWbemObjectSet* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemObjectSet_GetIDsOfNames(ISWbemObjectSet* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemObjectSet_Invoke(ISWbemObjectSet* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemObjectSet methods ***/
static FORCEINLINE HRESULT ISWbemObjectSet_get__NewEnum(ISWbemObjectSet* This,IUnknown **pUnk) {
    return This->lpVtbl->get__NewEnum(This,pUnk);
}
static FORCEINLINE HRESULT ISWbemObjectSet_Item(ISWbemObjectSet* This,BSTR strObjectPath,LONG iFlags,ISWbemObject **objWbemObject) {
    return This->lpVtbl->Item(This,strObjectPath,iFlags,objWbemObject);
}
static FORCEINLINE HRESULT ISWbemObjectSet_get_Count(ISWbemObjectSet* This,LONG *iCount) {
    return This->lpVtbl->get_Count(This,iCount);
}
static FORCEINLINE HRESULT ISWbemObjectSet_get_Security_(ISWbemObjectSet* This,ISWbemSecurity **objWbemSecurity) {
    return This->lpVtbl->get_Security_(This,objWbemSecurity);
}
static FORCEINLINE HRESULT ISWbemObjectSet_ItemIndex(ISWbemObjectSet* This,LONG lIndex,ISWbemObject **objWbemObject) {
    return This->lpVtbl->ItemIndex(This,lIndex,objWbemObject);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemObjectSet_get__NewEnum_Proxy(
    ISWbemObjectSet* This,
    IUnknown **pUnk);
void __RPC_STUB ISWbemObjectSet_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectSet_Item_Proxy(
    ISWbemObjectSet* This,
    BSTR strObjectPath,
    LONG iFlags,
    ISWbemObject **objWbemObject);
void __RPC_STUB ISWbemObjectSet_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectSet_get_Count_Proxy(
    ISWbemObjectSet* This,
    LONG *iCount);
void __RPC_STUB ISWbemObjectSet_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectSet_get_Security__Proxy(
    ISWbemObjectSet* This,
    ISWbemSecurity **objWbemSecurity);
void __RPC_STUB ISWbemObjectSet_get_Security__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectSet_ItemIndex_Proxy(
    ISWbemObjectSet* This,
    LONG lIndex,
    ISWbemObject **objWbemObject);
void __RPC_STUB ISWbemObjectSet_ItemIndex_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemObjectSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemNamedValueSet interface
 */
#ifndef __ISWbemNamedValueSet_INTERFACE_DEFINED__
#define __ISWbemNamedValueSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemNamedValueSet, 0xcf2376ea, 0xce8c, 0x11d1, 0x8b,0x05, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("cf2376ea-ce8c-11d1-8b05-00600806d9b6")
ISWbemNamedValueSet : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **pUnk) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        BSTR strName,
        LONG iFlags = 0,
        ISWbemNamedValue **objWbemNamedValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *iCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        BSTR strName,
        VARIANT *varValue,
        LONG iFlags = 0,
        ISWbemNamedValue **objWbemNamedValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        BSTR strName,
        LONG iFlags = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clone(
        ISWbemNamedValueSet **objWbemNamedValueSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteAll(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemNamedValueSet, 0xcf2376ea, 0xce8c, 0x11d1, 0x8b,0x05, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemNamedValueSetVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemNamedValueSet methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        ISWbemNamedValueSet* This,
        IUnknown **pUnk);

    HRESULT (STDMETHODCALLTYPE *Item)(
        ISWbemNamedValueSet* This,
        BSTR strName,
        LONG iFlags,
        ISWbemNamedValue **objWbemNamedValue);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        ISWbemNamedValueSet* This,
        LONG *iCount);

    HRESULT (STDMETHODCALLTYPE *Add)(
        ISWbemNamedValueSet* This,
        BSTR strName,
        VARIANT *varValue,
        LONG iFlags,
        ISWbemNamedValue **objWbemNamedValue);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        ISWbemNamedValueSet* This,
        BSTR strName,
        LONG iFlags);

    HRESULT (STDMETHODCALLTYPE *Clone)(
        ISWbemNamedValueSet* This,
        ISWbemNamedValueSet **objWbemNamedValueSet);

    HRESULT (STDMETHODCALLTYPE *DeleteAll)(
        ISWbemNamedValueSet* This);

    END_INTERFACE
} ISWbemNamedValueSetVtbl;
interface ISWbemNamedValueSet {
    CONST_VTBL ISWbemNamedValueSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemNamedValueSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemNamedValueSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemNamedValueSet_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemNamedValueSet_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemNamedValueSet_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemNamedValueSet_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemNamedValueSet_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemNamedValueSet methods ***/
#define ISWbemNamedValueSet_get__NewEnum(This,pUnk) (This)->lpVtbl->get__NewEnum(This,pUnk)
#define ISWbemNamedValueSet_Item(This,strName,iFlags,objWbemNamedValue) (This)->lpVtbl->Item(This,strName,iFlags,objWbemNamedValue)
#define ISWbemNamedValueSet_get_Count(This,iCount) (This)->lpVtbl->get_Count(This,iCount)
#define ISWbemNamedValueSet_Add(This,strName,varValue,iFlags,objWbemNamedValue) (This)->lpVtbl->Add(This,strName,varValue,iFlags,objWbemNamedValue)
#define ISWbemNamedValueSet_Remove(This,strName,iFlags) (This)->lpVtbl->Remove(This,strName,iFlags)
#define ISWbemNamedValueSet_Clone(This,objWbemNamedValueSet) (This)->lpVtbl->Clone(This,objWbemNamedValueSet)
#define ISWbemNamedValueSet_DeleteAll(This) (This)->lpVtbl->DeleteAll(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemNamedValueSet_QueryInterface(ISWbemNamedValueSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemNamedValueSet_AddRef(ISWbemNamedValueSet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemNamedValueSet_Release(ISWbemNamedValueSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemNamedValueSet_GetTypeInfoCount(ISWbemNamedValueSet* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemNamedValueSet_GetTypeInfo(ISWbemNamedValueSet* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemNamedValueSet_GetIDsOfNames(ISWbemNamedValueSet* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemNamedValueSet_Invoke(ISWbemNamedValueSet* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemNamedValueSet methods ***/
static FORCEINLINE HRESULT ISWbemNamedValueSet_get__NewEnum(ISWbemNamedValueSet* This,IUnknown **pUnk) {
    return This->lpVtbl->get__NewEnum(This,pUnk);
}
static FORCEINLINE HRESULT ISWbemNamedValueSet_Item(ISWbemNamedValueSet* This,BSTR strName,LONG iFlags,ISWbemNamedValue **objWbemNamedValue) {
    return This->lpVtbl->Item(This,strName,iFlags,objWbemNamedValue);
}
static FORCEINLINE HRESULT ISWbemNamedValueSet_get_Count(ISWbemNamedValueSet* This,LONG *iCount) {
    return This->lpVtbl->get_Count(This,iCount);
}
static FORCEINLINE HRESULT ISWbemNamedValueSet_Add(ISWbemNamedValueSet* This,BSTR strName,VARIANT *varValue,LONG iFlags,ISWbemNamedValue **objWbemNamedValue) {
    return This->lpVtbl->Add(This,strName,varValue,iFlags,objWbemNamedValue);
}
static FORCEINLINE HRESULT ISWbemNamedValueSet_Remove(ISWbemNamedValueSet* This,BSTR strName,LONG iFlags) {
    return This->lpVtbl->Remove(This,strName,iFlags);
}
static FORCEINLINE HRESULT ISWbemNamedValueSet_Clone(ISWbemNamedValueSet* This,ISWbemNamedValueSet **objWbemNamedValueSet) {
    return This->lpVtbl->Clone(This,objWbemNamedValueSet);
}
static FORCEINLINE HRESULT ISWbemNamedValueSet_DeleteAll(ISWbemNamedValueSet* This) {
    return This->lpVtbl->DeleteAll(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemNamedValueSet_get__NewEnum_Proxy(
    ISWbemNamedValueSet* This,
    IUnknown **pUnk);
void __RPC_STUB ISWbemNamedValueSet_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemNamedValueSet_Item_Proxy(
    ISWbemNamedValueSet* This,
    BSTR strName,
    LONG iFlags,
    ISWbemNamedValue **objWbemNamedValue);
void __RPC_STUB ISWbemNamedValueSet_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemNamedValueSet_get_Count_Proxy(
    ISWbemNamedValueSet* This,
    LONG *iCount);
void __RPC_STUB ISWbemNamedValueSet_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemNamedValueSet_Add_Proxy(
    ISWbemNamedValueSet* This,
    BSTR strName,
    VARIANT *varValue,
    LONG iFlags,
    ISWbemNamedValue **objWbemNamedValue);
void __RPC_STUB ISWbemNamedValueSet_Add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemNamedValueSet_Remove_Proxy(
    ISWbemNamedValueSet* This,
    BSTR strName,
    LONG iFlags);
void __RPC_STUB ISWbemNamedValueSet_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemNamedValueSet_Clone_Proxy(
    ISWbemNamedValueSet* This,
    ISWbemNamedValueSet **objWbemNamedValueSet);
void __RPC_STUB ISWbemNamedValueSet_Clone_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemNamedValueSet_DeleteAll_Proxy(
    ISWbemNamedValueSet* This);
void __RPC_STUB ISWbemNamedValueSet_DeleteAll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemNamedValueSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemNamedValue interface
 */
#ifndef __ISWbemNamedValue_INTERFACE_DEFINED__
#define __ISWbemNamedValue_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemNamedValue, 0x76a64164, 0xcb41, 0x11d1, 0x8b,0x02, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("76a64164-cb41-11d1-8b02-00600806d9b6")
ISWbemNamedValue : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Value(
        VARIANT *varValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Value(
        VARIANT *varValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *strName) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemNamedValue, 0x76a64164, 0xcb41, 0x11d1, 0x8b,0x02, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemNamedValueVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemNamedValue methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        ISWbemNamedValue* This,
        VARIANT *varValue);

    HRESULT (STDMETHODCALLTYPE *put_Value)(
        ISWbemNamedValue* This,
        VARIANT *varValue);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        ISWbemNamedValue* This,
        BSTR *strName);

    END_INTERFACE
} ISWbemNamedValueVtbl;
interface ISWbemNamedValue {
    CONST_VTBL ISWbemNamedValueVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemNamedValue_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemNamedValue_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemNamedValue_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemNamedValue_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemNamedValue_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemNamedValue_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemNamedValue_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemNamedValue methods ***/
#define ISWbemNamedValue_get_Value(This,varValue) (This)->lpVtbl->get_Value(This,varValue)
#define ISWbemNamedValue_put_Value(This,varValue) (This)->lpVtbl->put_Value(This,varValue)
#define ISWbemNamedValue_get_Name(This,strName) (This)->lpVtbl->get_Name(This,strName)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemNamedValue_QueryInterface(ISWbemNamedValue* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemNamedValue_AddRef(ISWbemNamedValue* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemNamedValue_Release(ISWbemNamedValue* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemNamedValue_GetTypeInfoCount(ISWbemNamedValue* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemNamedValue_GetTypeInfo(ISWbemNamedValue* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemNamedValue_GetIDsOfNames(ISWbemNamedValue* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemNamedValue_Invoke(ISWbemNamedValue* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemNamedValue methods ***/
static FORCEINLINE HRESULT ISWbemNamedValue_get_Value(ISWbemNamedValue* This,VARIANT *varValue) {
    return This->lpVtbl->get_Value(This,varValue);
}
static FORCEINLINE HRESULT ISWbemNamedValue_put_Value(ISWbemNamedValue* This,VARIANT *varValue) {
    return This->lpVtbl->put_Value(This,varValue);
}
static FORCEINLINE HRESULT ISWbemNamedValue_get_Name(ISWbemNamedValue* This,BSTR *strName) {
    return This->lpVtbl->get_Name(This,strName);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemNamedValue_get_Value_Proxy(
    ISWbemNamedValue* This,
    VARIANT *varValue);
void __RPC_STUB ISWbemNamedValue_get_Value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemNamedValue_put_Value_Proxy(
    ISWbemNamedValue* This,
    VARIANT *varValue);
void __RPC_STUB ISWbemNamedValue_put_Value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemNamedValue_get_Name_Proxy(
    ISWbemNamedValue* This,
    BSTR *strName);
void __RPC_STUB ISWbemNamedValue_get_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemNamedValue_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemObjectPath interface
 */
#ifndef __ISWbemObjectPath_INTERFACE_DEFINED__
#define __ISWbemObjectPath_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemObjectPath, 0x5791bc27, 0xce9c, 0x11d1, 0x97,0xbf, 0x00,0x00,0xf8,0x1e,0x84,0x9c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5791bc27-ce9c-11d1-97bf-0000f81e849c")
ISWbemObjectPath : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Path(
        BSTR *strPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Path(
        BSTR strPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RelPath(
        BSTR *strRelPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_RelPath(
        BSTR strRelPath) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Server(
        BSTR *strServer) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Server(
        BSTR strServer) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Namespace(
        BSTR *strNamespace) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Namespace(
        BSTR strNamespace) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ParentNamespace(
        BSTR *strParentNamespace) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DisplayName(
        BSTR *strDisplayName) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DisplayName(
        BSTR strDisplayName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Class(
        BSTR *strClass) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Class(
        BSTR strClass) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsClass(
        VARIANT_BOOL *bIsClass) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAsClass(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsSingleton(
        VARIANT_BOOL *bIsSingleton) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetAsSingleton(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Keys(
        ISWbemNamedValueSet **objWbemNamedValueSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Security_(
        ISWbemSecurity **objWbemSecurity) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Locale(
        BSTR *strLocale) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Locale(
        BSTR strLocale) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Authority(
        BSTR *strAuthority) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Authority(
        BSTR strAuthority) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemObjectPath, 0x5791bc27, 0xce9c, 0x11d1, 0x97,0xbf, 0x00,0x00,0xf8,0x1e,0x84,0x9c)
#endif
#else
typedef struct ISWbemObjectPathVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemObjectPath methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Path)(
        ISWbemObjectPath* This,
        BSTR *strPath);

    HRESULT (STDMETHODCALLTYPE *put_Path)(
        ISWbemObjectPath* This,
        BSTR strPath);

    HRESULT (STDMETHODCALLTYPE *get_RelPath)(
        ISWbemObjectPath* This,
        BSTR *strRelPath);

    HRESULT (STDMETHODCALLTYPE *put_RelPath)(
        ISWbemObjectPath* This,
        BSTR strRelPath);

    HRESULT (STDMETHODCALLTYPE *get_Server)(
        ISWbemObjectPath* This,
        BSTR *strServer);

    HRESULT (STDMETHODCALLTYPE *put_Server)(
        ISWbemObjectPath* This,
        BSTR strServer);

    HRESULT (STDMETHODCALLTYPE *get_Namespace)(
        ISWbemObjectPath* This,
        BSTR *strNamespace);

    HRESULT (STDMETHODCALLTYPE *put_Namespace)(
        ISWbemObjectPath* This,
        BSTR strNamespace);

    HRESULT (STDMETHODCALLTYPE *get_ParentNamespace)(
        ISWbemObjectPath* This,
        BSTR *strParentNamespace);

    HRESULT (STDMETHODCALLTYPE *get_DisplayName)(
        ISWbemObjectPath* This,
        BSTR *strDisplayName);

    HRESULT (STDMETHODCALLTYPE *put_DisplayName)(
        ISWbemObjectPath* This,
        BSTR strDisplayName);

    HRESULT (STDMETHODCALLTYPE *get_Class)(
        ISWbemObjectPath* This,
        BSTR *strClass);

    HRESULT (STDMETHODCALLTYPE *put_Class)(
        ISWbemObjectPath* This,
        BSTR strClass);

    HRESULT (STDMETHODCALLTYPE *get_IsClass)(
        ISWbemObjectPath* This,
        VARIANT_BOOL *bIsClass);

    HRESULT (STDMETHODCALLTYPE *SetAsClass)(
        ISWbemObjectPath* This);

    HRESULT (STDMETHODCALLTYPE *get_IsSingleton)(
        ISWbemObjectPath* This,
        VARIANT_BOOL *bIsSingleton);

    HRESULT (STDMETHODCALLTYPE *SetAsSingleton)(
        ISWbemObjectPath* This);

    HRESULT (STDMETHODCALLTYPE *get_Keys)(
        ISWbemObjectPath* This,
        ISWbemNamedValueSet **objWbemNamedValueSet);

    HRESULT (STDMETHODCALLTYPE *get_Security_)(
        ISWbemObjectPath* This,
        ISWbemSecurity **objWbemSecurity);

    HRESULT (STDMETHODCALLTYPE *get_Locale)(
        ISWbemObjectPath* This,
        BSTR *strLocale);

    HRESULT (STDMETHODCALLTYPE *put_Locale)(
        ISWbemObjectPath* This,
        BSTR strLocale);

    HRESULT (STDMETHODCALLTYPE *get_Authority)(
        ISWbemObjectPath* This,
        BSTR *strAuthority);

    HRESULT (STDMETHODCALLTYPE *put_Authority)(
        ISWbemObjectPath* This,
        BSTR strAuthority);

    END_INTERFACE
} ISWbemObjectPathVtbl;
interface ISWbemObjectPath {
    CONST_VTBL ISWbemObjectPathVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemObjectPath_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemObjectPath_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemObjectPath_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemObjectPath_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemObjectPath_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemObjectPath_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemObjectPath_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemObjectPath methods ***/
#define ISWbemObjectPath_get_Path(This,strPath) (This)->lpVtbl->get_Path(This,strPath)
#define ISWbemObjectPath_put_Path(This,strPath) (This)->lpVtbl->put_Path(This,strPath)
#define ISWbemObjectPath_get_RelPath(This,strRelPath) (This)->lpVtbl->get_RelPath(This,strRelPath)
#define ISWbemObjectPath_put_RelPath(This,strRelPath) (This)->lpVtbl->put_RelPath(This,strRelPath)
#define ISWbemObjectPath_get_Server(This,strServer) (This)->lpVtbl->get_Server(This,strServer)
#define ISWbemObjectPath_put_Server(This,strServer) (This)->lpVtbl->put_Server(This,strServer)
#define ISWbemObjectPath_get_Namespace(This,strNamespace) (This)->lpVtbl->get_Namespace(This,strNamespace)
#define ISWbemObjectPath_put_Namespace(This,strNamespace) (This)->lpVtbl->put_Namespace(This,strNamespace)
#define ISWbemObjectPath_get_ParentNamespace(This,strParentNamespace) (This)->lpVtbl->get_ParentNamespace(This,strParentNamespace)
#define ISWbemObjectPath_get_DisplayName(This,strDisplayName) (This)->lpVtbl->get_DisplayName(This,strDisplayName)
#define ISWbemObjectPath_put_DisplayName(This,strDisplayName) (This)->lpVtbl->put_DisplayName(This,strDisplayName)
#define ISWbemObjectPath_get_Class(This,strClass) (This)->lpVtbl->get_Class(This,strClass)
#define ISWbemObjectPath_put_Class(This,strClass) (This)->lpVtbl->put_Class(This,strClass)
#define ISWbemObjectPath_get_IsClass(This,bIsClass) (This)->lpVtbl->get_IsClass(This,bIsClass)
#define ISWbemObjectPath_SetAsClass(This) (This)->lpVtbl->SetAsClass(This)
#define ISWbemObjectPath_get_IsSingleton(This,bIsSingleton) (This)->lpVtbl->get_IsSingleton(This,bIsSingleton)
#define ISWbemObjectPath_SetAsSingleton(This) (This)->lpVtbl->SetAsSingleton(This)
#define ISWbemObjectPath_get_Keys(This,objWbemNamedValueSet) (This)->lpVtbl->get_Keys(This,objWbemNamedValueSet)
#define ISWbemObjectPath_get_Security_(This,objWbemSecurity) (This)->lpVtbl->get_Security_(This,objWbemSecurity)
#define ISWbemObjectPath_get_Locale(This,strLocale) (This)->lpVtbl->get_Locale(This,strLocale)
#define ISWbemObjectPath_put_Locale(This,strLocale) (This)->lpVtbl->put_Locale(This,strLocale)
#define ISWbemObjectPath_get_Authority(This,strAuthority) (This)->lpVtbl->get_Authority(This,strAuthority)
#define ISWbemObjectPath_put_Authority(This,strAuthority) (This)->lpVtbl->put_Authority(This,strAuthority)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemObjectPath_QueryInterface(ISWbemObjectPath* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemObjectPath_AddRef(ISWbemObjectPath* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemObjectPath_Release(ISWbemObjectPath* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemObjectPath_GetTypeInfoCount(ISWbemObjectPath* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemObjectPath_GetTypeInfo(ISWbemObjectPath* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemObjectPath_GetIDsOfNames(ISWbemObjectPath* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemObjectPath_Invoke(ISWbemObjectPath* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemObjectPath methods ***/
static FORCEINLINE HRESULT ISWbemObjectPath_get_Path(ISWbemObjectPath* This,BSTR *strPath) {
    return This->lpVtbl->get_Path(This,strPath);
}
static FORCEINLINE HRESULT ISWbemObjectPath_put_Path(ISWbemObjectPath* This,BSTR strPath) {
    return This->lpVtbl->put_Path(This,strPath);
}
static FORCEINLINE HRESULT ISWbemObjectPath_get_RelPath(ISWbemObjectPath* This,BSTR *strRelPath) {
    return This->lpVtbl->get_RelPath(This,strRelPath);
}
static FORCEINLINE HRESULT ISWbemObjectPath_put_RelPath(ISWbemObjectPath* This,BSTR strRelPath) {
    return This->lpVtbl->put_RelPath(This,strRelPath);
}
static FORCEINLINE HRESULT ISWbemObjectPath_get_Server(ISWbemObjectPath* This,BSTR *strServer) {
    return This->lpVtbl->get_Server(This,strServer);
}
static FORCEINLINE HRESULT ISWbemObjectPath_put_Server(ISWbemObjectPath* This,BSTR strServer) {
    return This->lpVtbl->put_Server(This,strServer);
}
static FORCEINLINE HRESULT ISWbemObjectPath_get_Namespace(ISWbemObjectPath* This,BSTR *strNamespace) {
    return This->lpVtbl->get_Namespace(This,strNamespace);
}
static FORCEINLINE HRESULT ISWbemObjectPath_put_Namespace(ISWbemObjectPath* This,BSTR strNamespace) {
    return This->lpVtbl->put_Namespace(This,strNamespace);
}
static FORCEINLINE HRESULT ISWbemObjectPath_get_ParentNamespace(ISWbemObjectPath* This,BSTR *strParentNamespace) {
    return This->lpVtbl->get_ParentNamespace(This,strParentNamespace);
}
static FORCEINLINE HRESULT ISWbemObjectPath_get_DisplayName(ISWbemObjectPath* This,BSTR *strDisplayName) {
    return This->lpVtbl->get_DisplayName(This,strDisplayName);
}
static FORCEINLINE HRESULT ISWbemObjectPath_put_DisplayName(ISWbemObjectPath* This,BSTR strDisplayName) {
    return This->lpVtbl->put_DisplayName(This,strDisplayName);
}
static FORCEINLINE HRESULT ISWbemObjectPath_get_Class(ISWbemObjectPath* This,BSTR *strClass) {
    return This->lpVtbl->get_Class(This,strClass);
}
static FORCEINLINE HRESULT ISWbemObjectPath_put_Class(ISWbemObjectPath* This,BSTR strClass) {
    return This->lpVtbl->put_Class(This,strClass);
}
static FORCEINLINE HRESULT ISWbemObjectPath_get_IsClass(ISWbemObjectPath* This,VARIANT_BOOL *bIsClass) {
    return This->lpVtbl->get_IsClass(This,bIsClass);
}
static FORCEINLINE HRESULT ISWbemObjectPath_SetAsClass(ISWbemObjectPath* This) {
    return This->lpVtbl->SetAsClass(This);
}
static FORCEINLINE HRESULT ISWbemObjectPath_get_IsSingleton(ISWbemObjectPath* This,VARIANT_BOOL *bIsSingleton) {
    return This->lpVtbl->get_IsSingleton(This,bIsSingleton);
}
static FORCEINLINE HRESULT ISWbemObjectPath_SetAsSingleton(ISWbemObjectPath* This) {
    return This->lpVtbl->SetAsSingleton(This);
}
static FORCEINLINE HRESULT ISWbemObjectPath_get_Keys(ISWbemObjectPath* This,ISWbemNamedValueSet **objWbemNamedValueSet) {
    return This->lpVtbl->get_Keys(This,objWbemNamedValueSet);
}
static FORCEINLINE HRESULT ISWbemObjectPath_get_Security_(ISWbemObjectPath* This,ISWbemSecurity **objWbemSecurity) {
    return This->lpVtbl->get_Security_(This,objWbemSecurity);
}
static FORCEINLINE HRESULT ISWbemObjectPath_get_Locale(ISWbemObjectPath* This,BSTR *strLocale) {
    return This->lpVtbl->get_Locale(This,strLocale);
}
static FORCEINLINE HRESULT ISWbemObjectPath_put_Locale(ISWbemObjectPath* This,BSTR strLocale) {
    return This->lpVtbl->put_Locale(This,strLocale);
}
static FORCEINLINE HRESULT ISWbemObjectPath_get_Authority(ISWbemObjectPath* This,BSTR *strAuthority) {
    return This->lpVtbl->get_Authority(This,strAuthority);
}
static FORCEINLINE HRESULT ISWbemObjectPath_put_Authority(ISWbemObjectPath* This,BSTR strAuthority) {
    return This->lpVtbl->put_Authority(This,strAuthority);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemObjectPath_get_Path_Proxy(
    ISWbemObjectPath* This,
    BSTR *strPath);
void __RPC_STUB ISWbemObjectPath_get_Path_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_put_Path_Proxy(
    ISWbemObjectPath* This,
    BSTR strPath);
void __RPC_STUB ISWbemObjectPath_put_Path_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_get_RelPath_Proxy(
    ISWbemObjectPath* This,
    BSTR *strRelPath);
void __RPC_STUB ISWbemObjectPath_get_RelPath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_put_RelPath_Proxy(
    ISWbemObjectPath* This,
    BSTR strRelPath);
void __RPC_STUB ISWbemObjectPath_put_RelPath_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_get_Server_Proxy(
    ISWbemObjectPath* This,
    BSTR *strServer);
void __RPC_STUB ISWbemObjectPath_get_Server_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_put_Server_Proxy(
    ISWbemObjectPath* This,
    BSTR strServer);
void __RPC_STUB ISWbemObjectPath_put_Server_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_get_Namespace_Proxy(
    ISWbemObjectPath* This,
    BSTR *strNamespace);
void __RPC_STUB ISWbemObjectPath_get_Namespace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_put_Namespace_Proxy(
    ISWbemObjectPath* This,
    BSTR strNamespace);
void __RPC_STUB ISWbemObjectPath_put_Namespace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_get_ParentNamespace_Proxy(
    ISWbemObjectPath* This,
    BSTR *strParentNamespace);
void __RPC_STUB ISWbemObjectPath_get_ParentNamespace_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_get_DisplayName_Proxy(
    ISWbemObjectPath* This,
    BSTR *strDisplayName);
void __RPC_STUB ISWbemObjectPath_get_DisplayName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_put_DisplayName_Proxy(
    ISWbemObjectPath* This,
    BSTR strDisplayName);
void __RPC_STUB ISWbemObjectPath_put_DisplayName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_get_Class_Proxy(
    ISWbemObjectPath* This,
    BSTR *strClass);
void __RPC_STUB ISWbemObjectPath_get_Class_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_put_Class_Proxy(
    ISWbemObjectPath* This,
    BSTR strClass);
void __RPC_STUB ISWbemObjectPath_put_Class_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_get_IsClass_Proxy(
    ISWbemObjectPath* This,
    VARIANT_BOOL *bIsClass);
void __RPC_STUB ISWbemObjectPath_get_IsClass_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_SetAsClass_Proxy(
    ISWbemObjectPath* This);
void __RPC_STUB ISWbemObjectPath_SetAsClass_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_get_IsSingleton_Proxy(
    ISWbemObjectPath* This,
    VARIANT_BOOL *bIsSingleton);
void __RPC_STUB ISWbemObjectPath_get_IsSingleton_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_SetAsSingleton_Proxy(
    ISWbemObjectPath* This);
void __RPC_STUB ISWbemObjectPath_SetAsSingleton_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_get_Keys_Proxy(
    ISWbemObjectPath* This,
    ISWbemNamedValueSet **objWbemNamedValueSet);
void __RPC_STUB ISWbemObjectPath_get_Keys_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_get_Security__Proxy(
    ISWbemObjectPath* This,
    ISWbemSecurity **objWbemSecurity);
void __RPC_STUB ISWbemObjectPath_get_Security__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_get_Locale_Proxy(
    ISWbemObjectPath* This,
    BSTR *strLocale);
void __RPC_STUB ISWbemObjectPath_get_Locale_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_put_Locale_Proxy(
    ISWbemObjectPath* This,
    BSTR strLocale);
void __RPC_STUB ISWbemObjectPath_put_Locale_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_get_Authority_Proxy(
    ISWbemObjectPath* This,
    BSTR *strAuthority);
void __RPC_STUB ISWbemObjectPath_get_Authority_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemObjectPath_put_Authority_Proxy(
    ISWbemObjectPath* This,
    BSTR strAuthority);
void __RPC_STUB ISWbemObjectPath_put_Authority_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemObjectPath_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemProperty interface
 */
#ifndef __ISWbemProperty_INTERFACE_DEFINED__
#define __ISWbemProperty_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemProperty, 0x1a388f98, 0xd4ba, 0x11d1, 0x8b,0x09, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("1a388f98-d4ba-11d1-8b09-00600806d9b6")
ISWbemProperty : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Value(
        VARIANT *varValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Value(
        VARIANT *varValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *strName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsLocal(
        VARIANT_BOOL *bIsLocal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Origin(
        BSTR *strOrigin) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CIMType(
        WbemCimtypeEnum *iCimType) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Qualifiers_(
        ISWbemQualifierSet **objWbemQualifierSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsArray(
        VARIANT_BOOL *bIsArray) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemProperty, 0x1a388f98, 0xd4ba, 0x11d1, 0x8b,0x09, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemPropertyVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemProperty methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        ISWbemProperty* This,
        VARIANT *varValue);

    HRESULT (STDMETHODCALLTYPE *put_Value)(
        ISWbemProperty* This,
        VARIANT *varValue);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        ISWbemProperty* This,
        BSTR *strName);

    HRESULT (STDMETHODCALLTYPE *get_IsLocal)(
        ISWbemProperty* This,
        VARIANT_BOOL *bIsLocal);

    HRESULT (STDMETHODCALLTYPE *get_Origin)(
        ISWbemProperty* This,
        BSTR *strOrigin);

    HRESULT (STDMETHODCALLTYPE *get_CIMType)(
        ISWbemProperty* This,
        WbemCimtypeEnum *iCimType);

    HRESULT (STDMETHODCALLTYPE *get_Qualifiers_)(
        ISWbemProperty* This,
        ISWbemQualifierSet **objWbemQualifierSet);

    HRESULT (STDMETHODCALLTYPE *get_IsArray)(
        ISWbemProperty* This,
        VARIANT_BOOL *bIsArray);

    END_INTERFACE
} ISWbemPropertyVtbl;
interface ISWbemProperty {
    CONST_VTBL ISWbemPropertyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemProperty_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemProperty_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemProperty_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemProperty_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemProperty_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemProperty_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemProperty_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemProperty methods ***/
#define ISWbemProperty_get_Value(This,varValue) (This)->lpVtbl->get_Value(This,varValue)
#define ISWbemProperty_put_Value(This,varValue) (This)->lpVtbl->put_Value(This,varValue)
#define ISWbemProperty_get_Name(This,strName) (This)->lpVtbl->get_Name(This,strName)
#define ISWbemProperty_get_IsLocal(This,bIsLocal) (This)->lpVtbl->get_IsLocal(This,bIsLocal)
#define ISWbemProperty_get_Origin(This,strOrigin) (This)->lpVtbl->get_Origin(This,strOrigin)
#define ISWbemProperty_get_CIMType(This,iCimType) (This)->lpVtbl->get_CIMType(This,iCimType)
#define ISWbemProperty_get_Qualifiers_(This,objWbemQualifierSet) (This)->lpVtbl->get_Qualifiers_(This,objWbemQualifierSet)
#define ISWbemProperty_get_IsArray(This,bIsArray) (This)->lpVtbl->get_IsArray(This,bIsArray)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemProperty_QueryInterface(ISWbemProperty* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemProperty_AddRef(ISWbemProperty* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemProperty_Release(ISWbemProperty* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemProperty_GetTypeInfoCount(ISWbemProperty* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemProperty_GetTypeInfo(ISWbemProperty* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemProperty_GetIDsOfNames(ISWbemProperty* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemProperty_Invoke(ISWbemProperty* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemProperty methods ***/
static FORCEINLINE HRESULT ISWbemProperty_get_Value(ISWbemProperty* This,VARIANT *varValue) {
    return This->lpVtbl->get_Value(This,varValue);
}
static FORCEINLINE HRESULT ISWbemProperty_put_Value(ISWbemProperty* This,VARIANT *varValue) {
    return This->lpVtbl->put_Value(This,varValue);
}
static FORCEINLINE HRESULT ISWbemProperty_get_Name(ISWbemProperty* This,BSTR *strName) {
    return This->lpVtbl->get_Name(This,strName);
}
static FORCEINLINE HRESULT ISWbemProperty_get_IsLocal(ISWbemProperty* This,VARIANT_BOOL *bIsLocal) {
    return This->lpVtbl->get_IsLocal(This,bIsLocal);
}
static FORCEINLINE HRESULT ISWbemProperty_get_Origin(ISWbemProperty* This,BSTR *strOrigin) {
    return This->lpVtbl->get_Origin(This,strOrigin);
}
static FORCEINLINE HRESULT ISWbemProperty_get_CIMType(ISWbemProperty* This,WbemCimtypeEnum *iCimType) {
    return This->lpVtbl->get_CIMType(This,iCimType);
}
static FORCEINLINE HRESULT ISWbemProperty_get_Qualifiers_(ISWbemProperty* This,ISWbemQualifierSet **objWbemQualifierSet) {
    return This->lpVtbl->get_Qualifiers_(This,objWbemQualifierSet);
}
static FORCEINLINE HRESULT ISWbemProperty_get_IsArray(ISWbemProperty* This,VARIANT_BOOL *bIsArray) {
    return This->lpVtbl->get_IsArray(This,bIsArray);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemProperty_get_Value_Proxy(
    ISWbemProperty* This,
    VARIANT *varValue);
void __RPC_STUB ISWbemProperty_get_Value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemProperty_put_Value_Proxy(
    ISWbemProperty* This,
    VARIANT *varValue);
void __RPC_STUB ISWbemProperty_put_Value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemProperty_get_Name_Proxy(
    ISWbemProperty* This,
    BSTR *strName);
void __RPC_STUB ISWbemProperty_get_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemProperty_get_IsLocal_Proxy(
    ISWbemProperty* This,
    VARIANT_BOOL *bIsLocal);
void __RPC_STUB ISWbemProperty_get_IsLocal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemProperty_get_Origin_Proxy(
    ISWbemProperty* This,
    BSTR *strOrigin);
void __RPC_STUB ISWbemProperty_get_Origin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemProperty_get_CIMType_Proxy(
    ISWbemProperty* This,
    WbemCimtypeEnum *iCimType);
void __RPC_STUB ISWbemProperty_get_CIMType_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemProperty_get_Qualifiers__Proxy(
    ISWbemProperty* This,
    ISWbemQualifierSet **objWbemQualifierSet);
void __RPC_STUB ISWbemProperty_get_Qualifiers__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemProperty_get_IsArray_Proxy(
    ISWbemProperty* This,
    VARIANT_BOOL *bIsArray);
void __RPC_STUB ISWbemProperty_get_IsArray_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemProperty_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemPropertySet interface
 */
#ifndef __ISWbemPropertySet_INTERFACE_DEFINED__
#define __ISWbemPropertySet_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemPropertySet, 0xdea0a7b2, 0xd4ba, 0x11d1, 0x8b,0x09, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("dea0a7b2-d4ba-11d1-8b09-00600806d9b6")
ISWbemPropertySet : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **pUnk) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        BSTR strName,
        LONG iFlags = 0,
        ISWbemProperty **objWbemProperty) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *iCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        BSTR strName,
        WbemCimtypeEnum iCIMType,
        VARIANT_BOOL bIsArray = FALSE,
        LONG iFlags = 0,
        ISWbemProperty **objWbemProperty) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        BSTR strName,
        LONG iFlags = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemPropertySet, 0xdea0a7b2, 0xd4ba, 0x11d1, 0x8b,0x09, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemPropertySetVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemPropertySet methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        ISWbemPropertySet* This,
        IUnknown **pUnk);

    HRESULT (STDMETHODCALLTYPE *Item)(
        ISWbemPropertySet* This,
        BSTR strName,
        LONG iFlags,
        ISWbemProperty **objWbemProperty);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        ISWbemPropertySet* This,
        LONG *iCount);

    HRESULT (STDMETHODCALLTYPE *Add)(
        ISWbemPropertySet* This,
        BSTR strName,
        WbemCimtypeEnum iCIMType,
        VARIANT_BOOL bIsArray,
        LONG iFlags,
        ISWbemProperty **objWbemProperty);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        ISWbemPropertySet* This,
        BSTR strName,
        LONG iFlags);

    END_INTERFACE
} ISWbemPropertySetVtbl;
interface ISWbemPropertySet {
    CONST_VTBL ISWbemPropertySetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemPropertySet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemPropertySet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemPropertySet_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemPropertySet_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemPropertySet_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemPropertySet_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemPropertySet_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemPropertySet methods ***/
#define ISWbemPropertySet_get__NewEnum(This,pUnk) (This)->lpVtbl->get__NewEnum(This,pUnk)
#define ISWbemPropertySet_Item(This,strName,iFlags,objWbemProperty) (This)->lpVtbl->Item(This,strName,iFlags,objWbemProperty)
#define ISWbemPropertySet_get_Count(This,iCount) (This)->lpVtbl->get_Count(This,iCount)
#define ISWbemPropertySet_Add(This,strName,iCIMType,bIsArray,iFlags,objWbemProperty) (This)->lpVtbl->Add(This,strName,iCIMType,bIsArray,iFlags,objWbemProperty)
#define ISWbemPropertySet_Remove(This,strName,iFlags) (This)->lpVtbl->Remove(This,strName,iFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemPropertySet_QueryInterface(ISWbemPropertySet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemPropertySet_AddRef(ISWbemPropertySet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemPropertySet_Release(ISWbemPropertySet* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemPropertySet_GetTypeInfoCount(ISWbemPropertySet* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemPropertySet_GetTypeInfo(ISWbemPropertySet* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemPropertySet_GetIDsOfNames(ISWbemPropertySet* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemPropertySet_Invoke(ISWbemPropertySet* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemPropertySet methods ***/
static FORCEINLINE HRESULT ISWbemPropertySet_get__NewEnum(ISWbemPropertySet* This,IUnknown **pUnk) {
    return This->lpVtbl->get__NewEnum(This,pUnk);
}
static FORCEINLINE HRESULT ISWbemPropertySet_Item(ISWbemPropertySet* This,BSTR strName,LONG iFlags,ISWbemProperty **objWbemProperty) {
    return This->lpVtbl->Item(This,strName,iFlags,objWbemProperty);
}
static FORCEINLINE HRESULT ISWbemPropertySet_get_Count(ISWbemPropertySet* This,LONG *iCount) {
    return This->lpVtbl->get_Count(This,iCount);
}
static FORCEINLINE HRESULT ISWbemPropertySet_Add(ISWbemPropertySet* This,BSTR strName,WbemCimtypeEnum iCIMType,VARIANT_BOOL bIsArray,LONG iFlags,ISWbemProperty **objWbemProperty) {
    return This->lpVtbl->Add(This,strName,iCIMType,bIsArray,iFlags,objWbemProperty);
}
static FORCEINLINE HRESULT ISWbemPropertySet_Remove(ISWbemPropertySet* This,BSTR strName,LONG iFlags) {
    return This->lpVtbl->Remove(This,strName,iFlags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemPropertySet_get__NewEnum_Proxy(
    ISWbemPropertySet* This,
    IUnknown **pUnk);
void __RPC_STUB ISWbemPropertySet_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemPropertySet_Item_Proxy(
    ISWbemPropertySet* This,
    BSTR strName,
    LONG iFlags,
    ISWbemProperty **objWbemProperty);
void __RPC_STUB ISWbemPropertySet_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemPropertySet_get_Count_Proxy(
    ISWbemPropertySet* This,
    LONG *iCount);
void __RPC_STUB ISWbemPropertySet_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemPropertySet_Add_Proxy(
    ISWbemPropertySet* This,
    BSTR strName,
    WbemCimtypeEnum iCIMType,
    VARIANT_BOOL bIsArray,
    LONG iFlags,
    ISWbemProperty **objWbemProperty);
void __RPC_STUB ISWbemPropertySet_Add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemPropertySet_Remove_Proxy(
    ISWbemPropertySet* This,
    BSTR strName,
    LONG iFlags);
void __RPC_STUB ISWbemPropertySet_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemPropertySet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemQualifier interface
 */
#ifndef __ISWbemQualifier_INTERFACE_DEFINED__
#define __ISWbemQualifier_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemQualifier, 0x79b05932, 0xd3b7, 0x11d1, 0x8b,0x06, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("79b05932-d3b7-11d1-8b06-00600806d9b6")
ISWbemQualifier : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Value(
        VARIANT *varValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Value(
        VARIANT *varValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *strName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsLocal(
        VARIANT_BOOL *bIsLocal) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PropagatesToSubclass(
        VARIANT_BOOL *bPropagatesToSubclass) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_PropagatesToSubclass(
        VARIANT_BOOL bPropagatesToSubclass) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PropagatesToInstance(
        VARIANT_BOOL *bPropagatesToInstance) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_PropagatesToInstance(
        VARIANT_BOOL bPropagatesToInstance) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsOverridable(
        VARIANT_BOOL *bIsOverridable) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_IsOverridable(
        VARIANT_BOOL bIsOverridable) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsAmended(
        VARIANT_BOOL *bIsAmended) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemQualifier, 0x79b05932, 0xd3b7, 0x11d1, 0x8b,0x06, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemQualifierVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemQualifier methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        ISWbemQualifier* This,
        VARIANT *varValue);

    HRESULT (STDMETHODCALLTYPE *put_Value)(
        ISWbemQualifier* This,
        VARIANT *varValue);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        ISWbemQualifier* This,
        BSTR *strName);

    HRESULT (STDMETHODCALLTYPE *get_IsLocal)(
        ISWbemQualifier* This,
        VARIANT_BOOL *bIsLocal);

    HRESULT (STDMETHODCALLTYPE *get_PropagatesToSubclass)(
        ISWbemQualifier* This,
        VARIANT_BOOL *bPropagatesToSubclass);

    HRESULT (STDMETHODCALLTYPE *put_PropagatesToSubclass)(
        ISWbemQualifier* This,
        VARIANT_BOOL bPropagatesToSubclass);

    HRESULT (STDMETHODCALLTYPE *get_PropagatesToInstance)(
        ISWbemQualifier* This,
        VARIANT_BOOL *bPropagatesToInstance);

    HRESULT (STDMETHODCALLTYPE *put_PropagatesToInstance)(
        ISWbemQualifier* This,
        VARIANT_BOOL bPropagatesToInstance);

    HRESULT (STDMETHODCALLTYPE *get_IsOverridable)(
        ISWbemQualifier* This,
        VARIANT_BOOL *bIsOverridable);

    HRESULT (STDMETHODCALLTYPE *put_IsOverridable)(
        ISWbemQualifier* This,
        VARIANT_BOOL bIsOverridable);

    HRESULT (STDMETHODCALLTYPE *get_IsAmended)(
        ISWbemQualifier* This,
        VARIANT_BOOL *bIsAmended);

    END_INTERFACE
} ISWbemQualifierVtbl;
interface ISWbemQualifier {
    CONST_VTBL ISWbemQualifierVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemQualifier_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemQualifier_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemQualifier_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemQualifier_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemQualifier_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemQualifier_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemQualifier_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemQualifier methods ***/
#define ISWbemQualifier_get_Value(This,varValue) (This)->lpVtbl->get_Value(This,varValue)
#define ISWbemQualifier_put_Value(This,varValue) (This)->lpVtbl->put_Value(This,varValue)
#define ISWbemQualifier_get_Name(This,strName) (This)->lpVtbl->get_Name(This,strName)
#define ISWbemQualifier_get_IsLocal(This,bIsLocal) (This)->lpVtbl->get_IsLocal(This,bIsLocal)
#define ISWbemQualifier_get_PropagatesToSubclass(This,bPropagatesToSubclass) (This)->lpVtbl->get_PropagatesToSubclass(This,bPropagatesToSubclass)
#define ISWbemQualifier_put_PropagatesToSubclass(This,bPropagatesToSubclass) (This)->lpVtbl->put_PropagatesToSubclass(This,bPropagatesToSubclass)
#define ISWbemQualifier_get_PropagatesToInstance(This,bPropagatesToInstance) (This)->lpVtbl->get_PropagatesToInstance(This,bPropagatesToInstance)
#define ISWbemQualifier_put_PropagatesToInstance(This,bPropagatesToInstance) (This)->lpVtbl->put_PropagatesToInstance(This,bPropagatesToInstance)
#define ISWbemQualifier_get_IsOverridable(This,bIsOverridable) (This)->lpVtbl->get_IsOverridable(This,bIsOverridable)
#define ISWbemQualifier_put_IsOverridable(This,bIsOverridable) (This)->lpVtbl->put_IsOverridable(This,bIsOverridable)
#define ISWbemQualifier_get_IsAmended(This,bIsAmended) (This)->lpVtbl->get_IsAmended(This,bIsAmended)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemQualifier_QueryInterface(ISWbemQualifier* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemQualifier_AddRef(ISWbemQualifier* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemQualifier_Release(ISWbemQualifier* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemQualifier_GetTypeInfoCount(ISWbemQualifier* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemQualifier_GetTypeInfo(ISWbemQualifier* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemQualifier_GetIDsOfNames(ISWbemQualifier* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemQualifier_Invoke(ISWbemQualifier* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemQualifier methods ***/
static FORCEINLINE HRESULT ISWbemQualifier_get_Value(ISWbemQualifier* This,VARIANT *varValue) {
    return This->lpVtbl->get_Value(This,varValue);
}
static FORCEINLINE HRESULT ISWbemQualifier_put_Value(ISWbemQualifier* This,VARIANT *varValue) {
    return This->lpVtbl->put_Value(This,varValue);
}
static FORCEINLINE HRESULT ISWbemQualifier_get_Name(ISWbemQualifier* This,BSTR *strName) {
    return This->lpVtbl->get_Name(This,strName);
}
static FORCEINLINE HRESULT ISWbemQualifier_get_IsLocal(ISWbemQualifier* This,VARIANT_BOOL *bIsLocal) {
    return This->lpVtbl->get_IsLocal(This,bIsLocal);
}
static FORCEINLINE HRESULT ISWbemQualifier_get_PropagatesToSubclass(ISWbemQualifier* This,VARIANT_BOOL *bPropagatesToSubclass) {
    return This->lpVtbl->get_PropagatesToSubclass(This,bPropagatesToSubclass);
}
static FORCEINLINE HRESULT ISWbemQualifier_put_PropagatesToSubclass(ISWbemQualifier* This,VARIANT_BOOL bPropagatesToSubclass) {
    return This->lpVtbl->put_PropagatesToSubclass(This,bPropagatesToSubclass);
}
static FORCEINLINE HRESULT ISWbemQualifier_get_PropagatesToInstance(ISWbemQualifier* This,VARIANT_BOOL *bPropagatesToInstance) {
    return This->lpVtbl->get_PropagatesToInstance(This,bPropagatesToInstance);
}
static FORCEINLINE HRESULT ISWbemQualifier_put_PropagatesToInstance(ISWbemQualifier* This,VARIANT_BOOL bPropagatesToInstance) {
    return This->lpVtbl->put_PropagatesToInstance(This,bPropagatesToInstance);
}
static FORCEINLINE HRESULT ISWbemQualifier_get_IsOverridable(ISWbemQualifier* This,VARIANT_BOOL *bIsOverridable) {
    return This->lpVtbl->get_IsOverridable(This,bIsOverridable);
}
static FORCEINLINE HRESULT ISWbemQualifier_put_IsOverridable(ISWbemQualifier* This,VARIANT_BOOL bIsOverridable) {
    return This->lpVtbl->put_IsOverridable(This,bIsOverridable);
}
static FORCEINLINE HRESULT ISWbemQualifier_get_IsAmended(ISWbemQualifier* This,VARIANT_BOOL *bIsAmended) {
    return This->lpVtbl->get_IsAmended(This,bIsAmended);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemQualifier_get_Value_Proxy(
    ISWbemQualifier* This,
    VARIANT *varValue);
void __RPC_STUB ISWbemQualifier_get_Value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemQualifier_put_Value_Proxy(
    ISWbemQualifier* This,
    VARIANT *varValue);
void __RPC_STUB ISWbemQualifier_put_Value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemQualifier_get_Name_Proxy(
    ISWbemQualifier* This,
    BSTR *strName);
void __RPC_STUB ISWbemQualifier_get_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemQualifier_get_IsLocal_Proxy(
    ISWbemQualifier* This,
    VARIANT_BOOL *bIsLocal);
void __RPC_STUB ISWbemQualifier_get_IsLocal_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemQualifier_get_PropagatesToSubclass_Proxy(
    ISWbemQualifier* This,
    VARIANT_BOOL *bPropagatesToSubclass);
void __RPC_STUB ISWbemQualifier_get_PropagatesToSubclass_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemQualifier_put_PropagatesToSubclass_Proxy(
    ISWbemQualifier* This,
    VARIANT_BOOL bPropagatesToSubclass);
void __RPC_STUB ISWbemQualifier_put_PropagatesToSubclass_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemQualifier_get_PropagatesToInstance_Proxy(
    ISWbemQualifier* This,
    VARIANT_BOOL *bPropagatesToInstance);
void __RPC_STUB ISWbemQualifier_get_PropagatesToInstance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemQualifier_put_PropagatesToInstance_Proxy(
    ISWbemQualifier* This,
    VARIANT_BOOL bPropagatesToInstance);
void __RPC_STUB ISWbemQualifier_put_PropagatesToInstance_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemQualifier_get_IsOverridable_Proxy(
    ISWbemQualifier* This,
    VARIANT_BOOL *bIsOverridable);
void __RPC_STUB ISWbemQualifier_get_IsOverridable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemQualifier_put_IsOverridable_Proxy(
    ISWbemQualifier* This,
    VARIANT_BOOL bIsOverridable);
void __RPC_STUB ISWbemQualifier_put_IsOverridable_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemQualifier_get_IsAmended_Proxy(
    ISWbemQualifier* This,
    VARIANT_BOOL *bIsAmended);
void __RPC_STUB ISWbemQualifier_get_IsAmended_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemQualifier_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemQualifierSet interface
 */
#ifndef __ISWbemQualifierSet_INTERFACE_DEFINED__
#define __ISWbemQualifierSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemQualifierSet, 0x9b16ed16, 0xd3df, 0x11d1, 0x8b,0x08, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("9b16ed16-d3df-11d1-8b08-00600806d9b6")
ISWbemQualifierSet : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **pUnk) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        BSTR name,
        LONG iFlags = 0,
        ISWbemQualifier **objWbemQualifier) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *iCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        BSTR strName,
        VARIANT *varVal,
        VARIANT_BOOL bPropagatesToSubclass = TRUE,
        VARIANT_BOOL bPropagatesToInstance = TRUE,
        VARIANT_BOOL bIsOverridable = TRUE,
        LONG iFlags = 0,
        ISWbemQualifier **objWbemQualifier) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        BSTR strName,
        LONG iFlags = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemQualifierSet, 0x9b16ed16, 0xd3df, 0x11d1, 0x8b,0x08, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemQualifierSetVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemQualifierSet methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        ISWbemQualifierSet* This,
        IUnknown **pUnk);

    HRESULT (STDMETHODCALLTYPE *Item)(
        ISWbemQualifierSet* This,
        BSTR name,
        LONG iFlags,
        ISWbemQualifier **objWbemQualifier);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        ISWbemQualifierSet* This,
        LONG *iCount);

    HRESULT (STDMETHODCALLTYPE *Add)(
        ISWbemQualifierSet* This,
        BSTR strName,
        VARIANT *varVal,
        VARIANT_BOOL bPropagatesToSubclass,
        VARIANT_BOOL bPropagatesToInstance,
        VARIANT_BOOL bIsOverridable,
        LONG iFlags,
        ISWbemQualifier **objWbemQualifier);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        ISWbemQualifierSet* This,
        BSTR strName,
        LONG iFlags);

    END_INTERFACE
} ISWbemQualifierSetVtbl;
interface ISWbemQualifierSet {
    CONST_VTBL ISWbemQualifierSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemQualifierSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemQualifierSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemQualifierSet_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemQualifierSet_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemQualifierSet_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemQualifierSet_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemQualifierSet_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemQualifierSet methods ***/
#define ISWbemQualifierSet_get__NewEnum(This,pUnk) (This)->lpVtbl->get__NewEnum(This,pUnk)
#define ISWbemQualifierSet_Item(This,name,iFlags,objWbemQualifier) (This)->lpVtbl->Item(This,name,iFlags,objWbemQualifier)
#define ISWbemQualifierSet_get_Count(This,iCount) (This)->lpVtbl->get_Count(This,iCount)
#define ISWbemQualifierSet_Add(This,strName,varVal,bPropagatesToSubclass,bPropagatesToInstance,bIsOverridable,iFlags,objWbemQualifier) (This)->lpVtbl->Add(This,strName,varVal,bPropagatesToSubclass,bPropagatesToInstance,bIsOverridable,iFlags,objWbemQualifier)
#define ISWbemQualifierSet_Remove(This,strName,iFlags) (This)->lpVtbl->Remove(This,strName,iFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemQualifierSet_QueryInterface(ISWbemQualifierSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemQualifierSet_AddRef(ISWbemQualifierSet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemQualifierSet_Release(ISWbemQualifierSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemQualifierSet_GetTypeInfoCount(ISWbemQualifierSet* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemQualifierSet_GetTypeInfo(ISWbemQualifierSet* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemQualifierSet_GetIDsOfNames(ISWbemQualifierSet* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemQualifierSet_Invoke(ISWbemQualifierSet* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemQualifierSet methods ***/
static FORCEINLINE HRESULT ISWbemQualifierSet_get__NewEnum(ISWbemQualifierSet* This,IUnknown **pUnk) {
    return This->lpVtbl->get__NewEnum(This,pUnk);
}
static FORCEINLINE HRESULT ISWbemQualifierSet_Item(ISWbemQualifierSet* This,BSTR name,LONG iFlags,ISWbemQualifier **objWbemQualifier) {
    return This->lpVtbl->Item(This,name,iFlags,objWbemQualifier);
}
static FORCEINLINE HRESULT ISWbemQualifierSet_get_Count(ISWbemQualifierSet* This,LONG *iCount) {
    return This->lpVtbl->get_Count(This,iCount);
}
static FORCEINLINE HRESULT ISWbemQualifierSet_Add(ISWbemQualifierSet* This,BSTR strName,VARIANT *varVal,VARIANT_BOOL bPropagatesToSubclass,VARIANT_BOOL bPropagatesToInstance,VARIANT_BOOL bIsOverridable,LONG iFlags,ISWbemQualifier **objWbemQualifier) {
    return This->lpVtbl->Add(This,strName,varVal,bPropagatesToSubclass,bPropagatesToInstance,bIsOverridable,iFlags,objWbemQualifier);
}
static FORCEINLINE HRESULT ISWbemQualifierSet_Remove(ISWbemQualifierSet* This,BSTR strName,LONG iFlags) {
    return This->lpVtbl->Remove(This,strName,iFlags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemQualifierSet_get__NewEnum_Proxy(
    ISWbemQualifierSet* This,
    IUnknown **pUnk);
void __RPC_STUB ISWbemQualifierSet_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemQualifierSet_Item_Proxy(
    ISWbemQualifierSet* This,
    BSTR name,
    LONG iFlags,
    ISWbemQualifier **objWbemQualifier);
void __RPC_STUB ISWbemQualifierSet_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemQualifierSet_get_Count_Proxy(
    ISWbemQualifierSet* This,
    LONG *iCount);
void __RPC_STUB ISWbemQualifierSet_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemQualifierSet_Add_Proxy(
    ISWbemQualifierSet* This,
    BSTR strName,
    VARIANT *varVal,
    VARIANT_BOOL bPropagatesToSubclass,
    VARIANT_BOOL bPropagatesToInstance,
    VARIANT_BOOL bIsOverridable,
    LONG iFlags,
    ISWbemQualifier **objWbemQualifier);
void __RPC_STUB ISWbemQualifierSet_Add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemQualifierSet_Remove_Proxy(
    ISWbemQualifierSet* This,
    BSTR strName,
    LONG iFlags);
void __RPC_STUB ISWbemQualifierSet_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemQualifierSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemMethod interface
 */
#ifndef __ISWbemMethod_INTERFACE_DEFINED__
#define __ISWbemMethod_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemMethod, 0x422e8e90, 0xd955, 0x11d1, 0x8b,0x09, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("422e8e90-d955-11d1-8b09-00600806d9b6")
ISWbemMethod : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *strName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Origin(
        BSTR *strOrigin) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_InParameters(
        ISWbemObject **objWbemInParameters) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_OutParameters(
        ISWbemObject **objWbemOutParameters) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Qualifiers_(
        ISWbemQualifierSet **objWbemQualifierSet) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemMethod, 0x422e8e90, 0xd955, 0x11d1, 0x8b,0x09, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemMethodVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemMethod methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        ISWbemMethod* This,
        BSTR *strName);

    HRESULT (STDMETHODCALLTYPE *get_Origin)(
        ISWbemMethod* This,
        BSTR *strOrigin);

    HRESULT (STDMETHODCALLTYPE *get_InParameters)(
        ISWbemMethod* This,
        ISWbemObject **objWbemInParameters);

    HRESULT (STDMETHODCALLTYPE *get_OutParameters)(
        ISWbemMethod* This,
        ISWbemObject **objWbemOutParameters);

    HRESULT (STDMETHODCALLTYPE *get_Qualifiers_)(
        ISWbemMethod* This,
        ISWbemQualifierSet **objWbemQualifierSet);

    END_INTERFACE
} ISWbemMethodVtbl;
interface ISWbemMethod {
    CONST_VTBL ISWbemMethodVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemMethod_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemMethod_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemMethod_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemMethod_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemMethod_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemMethod_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemMethod_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemMethod methods ***/
#define ISWbemMethod_get_Name(This,strName) (This)->lpVtbl->get_Name(This,strName)
#define ISWbemMethod_get_Origin(This,strOrigin) (This)->lpVtbl->get_Origin(This,strOrigin)
#define ISWbemMethod_get_InParameters(This,objWbemInParameters) (This)->lpVtbl->get_InParameters(This,objWbemInParameters)
#define ISWbemMethod_get_OutParameters(This,objWbemOutParameters) (This)->lpVtbl->get_OutParameters(This,objWbemOutParameters)
#define ISWbemMethod_get_Qualifiers_(This,objWbemQualifierSet) (This)->lpVtbl->get_Qualifiers_(This,objWbemQualifierSet)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemMethod_QueryInterface(ISWbemMethod* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemMethod_AddRef(ISWbemMethod* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemMethod_Release(ISWbemMethod* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemMethod_GetTypeInfoCount(ISWbemMethod* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemMethod_GetTypeInfo(ISWbemMethod* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemMethod_GetIDsOfNames(ISWbemMethod* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemMethod_Invoke(ISWbemMethod* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemMethod methods ***/
static FORCEINLINE HRESULT ISWbemMethod_get_Name(ISWbemMethod* This,BSTR *strName) {
    return This->lpVtbl->get_Name(This,strName);
}
static FORCEINLINE HRESULT ISWbemMethod_get_Origin(ISWbemMethod* This,BSTR *strOrigin) {
    return This->lpVtbl->get_Origin(This,strOrigin);
}
static FORCEINLINE HRESULT ISWbemMethod_get_InParameters(ISWbemMethod* This,ISWbemObject **objWbemInParameters) {
    return This->lpVtbl->get_InParameters(This,objWbemInParameters);
}
static FORCEINLINE HRESULT ISWbemMethod_get_OutParameters(ISWbemMethod* This,ISWbemObject **objWbemOutParameters) {
    return This->lpVtbl->get_OutParameters(This,objWbemOutParameters);
}
static FORCEINLINE HRESULT ISWbemMethod_get_Qualifiers_(ISWbemMethod* This,ISWbemQualifierSet **objWbemQualifierSet) {
    return This->lpVtbl->get_Qualifiers_(This,objWbemQualifierSet);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemMethod_get_Name_Proxy(
    ISWbemMethod* This,
    BSTR *strName);
void __RPC_STUB ISWbemMethod_get_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemMethod_get_Origin_Proxy(
    ISWbemMethod* This,
    BSTR *strOrigin);
void __RPC_STUB ISWbemMethod_get_Origin_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemMethod_get_InParameters_Proxy(
    ISWbemMethod* This,
    ISWbemObject **objWbemInParameters);
void __RPC_STUB ISWbemMethod_get_InParameters_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemMethod_get_OutParameters_Proxy(
    ISWbemMethod* This,
    ISWbemObject **objWbemOutParameters);
void __RPC_STUB ISWbemMethod_get_OutParameters_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemMethod_get_Qualifiers__Proxy(
    ISWbemMethod* This,
    ISWbemQualifierSet **objWbemQualifierSet);
void __RPC_STUB ISWbemMethod_get_Qualifiers__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemMethod_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemMethodSet interface
 */
#ifndef __ISWbemMethodSet_INTERFACE_DEFINED__
#define __ISWbemMethodSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemMethodSet, 0xc93ba292, 0xd955, 0x11d1, 0x8b,0x09, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c93ba292-d955-11d1-8b09-00600806d9b6")
ISWbemMethodSet : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **pUnk) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        BSTR strName,
        LONG iFlags = 0,
        ISWbemMethod **objWbemMethod) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *iCount) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemMethodSet, 0xc93ba292, 0xd955, 0x11d1, 0x8b,0x09, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemMethodSetVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemMethodSet methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        ISWbemMethodSet* This,
        IUnknown **pUnk);

    HRESULT (STDMETHODCALLTYPE *Item)(
        ISWbemMethodSet* This,
        BSTR strName,
        LONG iFlags,
        ISWbemMethod **objWbemMethod);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        ISWbemMethodSet* This,
        LONG *iCount);

    END_INTERFACE
} ISWbemMethodSetVtbl;
interface ISWbemMethodSet {
    CONST_VTBL ISWbemMethodSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemMethodSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemMethodSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemMethodSet_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemMethodSet_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemMethodSet_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemMethodSet_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemMethodSet_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemMethodSet methods ***/
#define ISWbemMethodSet_get__NewEnum(This,pUnk) (This)->lpVtbl->get__NewEnum(This,pUnk)
#define ISWbemMethodSet_Item(This,strName,iFlags,objWbemMethod) (This)->lpVtbl->Item(This,strName,iFlags,objWbemMethod)
#define ISWbemMethodSet_get_Count(This,iCount) (This)->lpVtbl->get_Count(This,iCount)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemMethodSet_QueryInterface(ISWbemMethodSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemMethodSet_AddRef(ISWbemMethodSet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemMethodSet_Release(ISWbemMethodSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemMethodSet_GetTypeInfoCount(ISWbemMethodSet* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemMethodSet_GetTypeInfo(ISWbemMethodSet* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemMethodSet_GetIDsOfNames(ISWbemMethodSet* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemMethodSet_Invoke(ISWbemMethodSet* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemMethodSet methods ***/
static FORCEINLINE HRESULT ISWbemMethodSet_get__NewEnum(ISWbemMethodSet* This,IUnknown **pUnk) {
    return This->lpVtbl->get__NewEnum(This,pUnk);
}
static FORCEINLINE HRESULT ISWbemMethodSet_Item(ISWbemMethodSet* This,BSTR strName,LONG iFlags,ISWbemMethod **objWbemMethod) {
    return This->lpVtbl->Item(This,strName,iFlags,objWbemMethod);
}
static FORCEINLINE HRESULT ISWbemMethodSet_get_Count(ISWbemMethodSet* This,LONG *iCount) {
    return This->lpVtbl->get_Count(This,iCount);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemMethodSet_get__NewEnum_Proxy(
    ISWbemMethodSet* This,
    IUnknown **pUnk);
void __RPC_STUB ISWbemMethodSet_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemMethodSet_Item_Proxy(
    ISWbemMethodSet* This,
    BSTR strName,
    LONG iFlags,
    ISWbemMethod **objWbemMethod);
void __RPC_STUB ISWbemMethodSet_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemMethodSet_get_Count_Proxy(
    ISWbemMethodSet* This,
    LONG *iCount);
void __RPC_STUB ISWbemMethodSet_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemMethodSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemSink interface
 */
#ifndef __ISWbemSink_INTERFACE_DEFINED__
#define __ISWbemSink_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemSink, 0x75718c9f, 0xf029, 0x11d1, 0xa1,0xac, 0x00,0xc0,0x4f,0xb6,0xc2,0x23);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("75718c9f-f029-11d1-a1ac-00c04fb6c223")
ISWbemSink : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE Cancel(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemSink, 0x75718c9f, 0xf029, 0x11d1, 0xa1,0xac, 0x00,0xc0,0x4f,0xb6,0xc2,0x23)
#endif
#else
typedef struct ISWbemSinkVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemSink methods ***/
    HRESULT (STDMETHODCALLTYPE *Cancel)(
        ISWbemSink* This);

    END_INTERFACE
} ISWbemSinkVtbl;
interface ISWbemSink {
    CONST_VTBL ISWbemSinkVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemSink_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemSink_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemSink_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemSink_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemSink_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemSink_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemSink_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemSink methods ***/
#define ISWbemSink_Cancel(This) (This)->lpVtbl->Cancel(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemSink_QueryInterface(ISWbemSink* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemSink_AddRef(ISWbemSink* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemSink_Release(ISWbemSink* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemSink_GetTypeInfoCount(ISWbemSink* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemSink_GetTypeInfo(ISWbemSink* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemSink_GetIDsOfNames(ISWbemSink* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemSink_Invoke(ISWbemSink* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemSink methods ***/
static FORCEINLINE HRESULT ISWbemSink_Cancel(ISWbemSink* This) {
    return This->lpVtbl->Cancel(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemSink_Cancel_Proxy(
    ISWbemSink* This);
void __RPC_STUB ISWbemSink_Cancel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemSink_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemSinkEvents dispinterface
 */
#ifndef __ISWbemSinkEvents_DISPINTERFACE_DEFINED__
#define __ISWbemSinkEvents_DISPINTERFACE_DEFINED__

DEFINE_GUID(DIID_ISWbemSinkEvents, 0x75718ca0, 0xf029, 0x11d1, 0xa1,0xac, 0x00,0xc0,0x4f,0xb6,0xc2,0x23);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("75718ca0-f029-11d1-a1ac-00c04fb6c223")
ISWbemSinkEvents : public IDispatch
{
};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemSinkEvents, 0x75718ca0, 0xf029, 0x11d1, 0xa1,0xac, 0x00,0xc0,0x4f,0xb6,0xc2,0x23)
#endif
#else
typedef struct ISWbemSinkEventsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    END_INTERFACE
} ISWbemSinkEventsVtbl;
interface ISWbemSinkEvents {
    CONST_VTBL ISWbemSinkEventsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemSinkEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemSinkEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemSinkEvents_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemSinkEvents_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemSinkEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemSinkEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemSinkEvents_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 FORCEINLINE HRESULT ISWbemSinkEvents_QueryInterface(ISWbemSinkEvents* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemSinkEvents_AddRef(ISWbemSinkEvents* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemSinkEvents_Release(ISWbemSinkEvents* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemSinkEvents_GetTypeInfoCount(ISWbemSinkEvents* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemSinkEvents_GetTypeInfo(ISWbemSinkEvents* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemSinkEvents_GetIDsOfNames(ISWbemSinkEvents* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemSinkEvents_Invoke(ISWbemSinkEvents* This,DISPID dispIdMember,REFIID riid,LCID 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  /* __ISWbemSinkEvents_DISPINTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemEventSource interface
 */
#ifndef __ISWbemEventSource_INTERFACE_DEFINED__
#define __ISWbemEventSource_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemEventSource, 0x27d54d92, 0x0ebe, 0x11d2, 0x8b,0x22, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("27d54d92-0ebe-11d2-8b22-00600806d9b6")
ISWbemEventSource : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE NextEvent(
        LONG iTimeoutMs = wbemTimeoutInfinite,
        ISWbemObject **objWbemObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Security_(
        ISWbemSecurity **objWbemSecurity) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemEventSource, 0x27d54d92, 0x0ebe, 0x11d2, 0x8b,0x22, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemEventSourceVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemEventSource methods ***/
    HRESULT (STDMETHODCALLTYPE *NextEvent)(
        ISWbemEventSource* This,
        LONG iTimeoutMs,
        ISWbemObject **objWbemObject);

    HRESULT (STDMETHODCALLTYPE *get_Security_)(
        ISWbemEventSource* This,
        ISWbemSecurity **objWbemSecurity);

    END_INTERFACE
} ISWbemEventSourceVtbl;
interface ISWbemEventSource {
    CONST_VTBL ISWbemEventSourceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemEventSource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemEventSource_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemEventSource_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemEventSource_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemEventSource_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemEventSource_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemEventSource_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemEventSource methods ***/
#define ISWbemEventSource_NextEvent(This,iTimeoutMs,objWbemObject) (This)->lpVtbl->NextEvent(This,iTimeoutMs,objWbemObject)
#define ISWbemEventSource_get_Security_(This,objWbemSecurity) (This)->lpVtbl->get_Security_(This,objWbemSecurity)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemEventSource_QueryInterface(ISWbemEventSource* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemEventSource_AddRef(ISWbemEventSource* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemEventSource_Release(ISWbemEventSource* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemEventSource_GetTypeInfoCount(ISWbemEventSource* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemEventSource_GetTypeInfo(ISWbemEventSource* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemEventSource_GetIDsOfNames(ISWbemEventSource* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemEventSource_Invoke(ISWbemEventSource* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemEventSource methods ***/
static FORCEINLINE HRESULT ISWbemEventSource_NextEvent(ISWbemEventSource* This,LONG iTimeoutMs,ISWbemObject **objWbemObject) {
    return This->lpVtbl->NextEvent(This,iTimeoutMs,objWbemObject);
}
static FORCEINLINE HRESULT ISWbemEventSource_get_Security_(ISWbemEventSource* This,ISWbemSecurity **objWbemSecurity) {
    return This->lpVtbl->get_Security_(This,objWbemSecurity);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemEventSource_NextEvent_Proxy(
    ISWbemEventSource* This,
    LONG iTimeoutMs,
    ISWbemObject **objWbemObject);
void __RPC_STUB ISWbemEventSource_NextEvent_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemEventSource_get_Security__Proxy(
    ISWbemEventSource* This,
    ISWbemSecurity **objWbemSecurity);
void __RPC_STUB ISWbemEventSource_get_Security__Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemEventSource_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemSecurity interface
 */
#ifndef __ISWbemSecurity_INTERFACE_DEFINED__
#define __ISWbemSecurity_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemSecurity, 0xb54d66e6, 0x2287, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("b54d66e6-2287-11d2-8b33-00600806d9b6")
ISWbemSecurity : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_ImpersonationLevel(
        WbemImpersonationLevelEnum *iImpersonationLevel) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ImpersonationLevel(
        WbemImpersonationLevelEnum iImpersonationLevel) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AuthenticationLevel(
        WbemAuthenticationLevelEnum *iAuthenticationLevel) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AuthenticationLevel(
        WbemAuthenticationLevelEnum iAuthenticationLevel) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Privileges(
        ISWbemPrivilegeSet **objWbemPrivilegeSet) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemSecurity, 0xb54d66e6, 0x2287, 0x11d2, 0x8b,0x33, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemSecurityVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemSecurity methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ImpersonationLevel)(
        ISWbemSecurity* This,
        WbemImpersonationLevelEnum *iImpersonationLevel);

    HRESULT (STDMETHODCALLTYPE *put_ImpersonationLevel)(
        ISWbemSecurity* This,
        WbemImpersonationLevelEnum iImpersonationLevel);

    HRESULT (STDMETHODCALLTYPE *get_AuthenticationLevel)(
        ISWbemSecurity* This,
        WbemAuthenticationLevelEnum *iAuthenticationLevel);

    HRESULT (STDMETHODCALLTYPE *put_AuthenticationLevel)(
        ISWbemSecurity* This,
        WbemAuthenticationLevelEnum iAuthenticationLevel);

    HRESULT (STDMETHODCALLTYPE *get_Privileges)(
        ISWbemSecurity* This,
        ISWbemPrivilegeSet **objWbemPrivilegeSet);

    END_INTERFACE
} ISWbemSecurityVtbl;
interface ISWbemSecurity {
    CONST_VTBL ISWbemSecurityVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemSecurity_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemSecurity_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemSecurity_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemSecurity_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemSecurity_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemSecurity_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemSecurity_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemSecurity methods ***/
#define ISWbemSecurity_get_ImpersonationLevel(This,iImpersonationLevel) (This)->lpVtbl->get_ImpersonationLevel(This,iImpersonationLevel)
#define ISWbemSecurity_put_ImpersonationLevel(This,iImpersonationLevel) (This)->lpVtbl->put_ImpersonationLevel(This,iImpersonationLevel)
#define ISWbemSecurity_get_AuthenticationLevel(This,iAuthenticationLevel) (This)->lpVtbl->get_AuthenticationLevel(This,iAuthenticationLevel)
#define ISWbemSecurity_put_AuthenticationLevel(This,iAuthenticationLevel) (This)->lpVtbl->put_AuthenticationLevel(This,iAuthenticationLevel)
#define ISWbemSecurity_get_Privileges(This,objWbemPrivilegeSet) (This)->lpVtbl->get_Privileges(This,objWbemPrivilegeSet)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemSecurity_QueryInterface(ISWbemSecurity* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemSecurity_AddRef(ISWbemSecurity* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemSecurity_Release(ISWbemSecurity* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemSecurity_GetTypeInfoCount(ISWbemSecurity* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemSecurity_GetTypeInfo(ISWbemSecurity* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemSecurity_GetIDsOfNames(ISWbemSecurity* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemSecurity_Invoke(ISWbemSecurity* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemSecurity methods ***/
static FORCEINLINE HRESULT ISWbemSecurity_get_ImpersonationLevel(ISWbemSecurity* This,WbemImpersonationLevelEnum *iImpersonationLevel) {
    return This->lpVtbl->get_ImpersonationLevel(This,iImpersonationLevel);
}
static FORCEINLINE HRESULT ISWbemSecurity_put_ImpersonationLevel(ISWbemSecurity* This,WbemImpersonationLevelEnum iImpersonationLevel) {
    return This->lpVtbl->put_ImpersonationLevel(This,iImpersonationLevel);
}
static FORCEINLINE HRESULT ISWbemSecurity_get_AuthenticationLevel(ISWbemSecurity* This,WbemAuthenticationLevelEnum *iAuthenticationLevel) {
    return This->lpVtbl->get_AuthenticationLevel(This,iAuthenticationLevel);
}
static FORCEINLINE HRESULT ISWbemSecurity_put_AuthenticationLevel(ISWbemSecurity* This,WbemAuthenticationLevelEnum iAuthenticationLevel) {
    return This->lpVtbl->put_AuthenticationLevel(This,iAuthenticationLevel);
}
static FORCEINLINE HRESULT ISWbemSecurity_get_Privileges(ISWbemSecurity* This,ISWbemPrivilegeSet **objWbemPrivilegeSet) {
    return This->lpVtbl->get_Privileges(This,objWbemPrivilegeSet);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemSecurity_get_ImpersonationLevel_Proxy(
    ISWbemSecurity* This,
    WbemImpersonationLevelEnum *iImpersonationLevel);
void __RPC_STUB ISWbemSecurity_get_ImpersonationLevel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemSecurity_put_ImpersonationLevel_Proxy(
    ISWbemSecurity* This,
    WbemImpersonationLevelEnum iImpersonationLevel);
void __RPC_STUB ISWbemSecurity_put_ImpersonationLevel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemSecurity_get_AuthenticationLevel_Proxy(
    ISWbemSecurity* This,
    WbemAuthenticationLevelEnum *iAuthenticationLevel);
void __RPC_STUB ISWbemSecurity_get_AuthenticationLevel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemSecurity_put_AuthenticationLevel_Proxy(
    ISWbemSecurity* This,
    WbemAuthenticationLevelEnum iAuthenticationLevel);
void __RPC_STUB ISWbemSecurity_put_AuthenticationLevel_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemSecurity_get_Privileges_Proxy(
    ISWbemSecurity* This,
    ISWbemPrivilegeSet **objWbemPrivilegeSet);
void __RPC_STUB ISWbemSecurity_get_Privileges_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemSecurity_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemPrivilege interface
 */
#ifndef __ISWbemPrivilege_INTERFACE_DEFINED__
#define __ISWbemPrivilege_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemPrivilege, 0x26ee67bd, 0x5804, 0x11d2, 0x8b,0x4a, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("26ee67bd-5804-11d2-8b4a-00600806d9b6")
ISWbemPrivilege : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_IsEnabled(
        VARIANT_BOOL *bIsEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_IsEnabled(
        VARIANT_BOOL bIsEnabled) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *strDisplayName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DisplayName(
        BSTR *strDisplayName) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Identifier(
        WbemPrivilegeEnum *iPrivilege) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemPrivilege, 0x26ee67bd, 0x5804, 0x11d2, 0x8b,0x4a, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemPrivilegeVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemPrivilege methods ***/
    HRESULT (STDMETHODCALLTYPE *get_IsEnabled)(
        ISWbemPrivilege* This,
        VARIANT_BOOL *bIsEnabled);

    HRESULT (STDMETHODCALLTYPE *put_IsEnabled)(
        ISWbemPrivilege* This,
        VARIANT_BOOL bIsEnabled);

    HRESULT (STDMETHODCALLTYPE *get_Name)(
        ISWbemPrivilege* This,
        BSTR *strDisplayName);

    HRESULT (STDMETHODCALLTYPE *get_DisplayName)(
        ISWbemPrivilege* This,
        BSTR *strDisplayName);

    HRESULT (STDMETHODCALLTYPE *get_Identifier)(
        ISWbemPrivilege* This,
        WbemPrivilegeEnum *iPrivilege);

    END_INTERFACE
} ISWbemPrivilegeVtbl;
interface ISWbemPrivilege {
    CONST_VTBL ISWbemPrivilegeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemPrivilege_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemPrivilege_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemPrivilege_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemPrivilege_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemPrivilege_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemPrivilege_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemPrivilege_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemPrivilege methods ***/
#define ISWbemPrivilege_get_IsEnabled(This,bIsEnabled) (This)->lpVtbl->get_IsEnabled(This,bIsEnabled)
#define ISWbemPrivilege_put_IsEnabled(This,bIsEnabled) (This)->lpVtbl->put_IsEnabled(This,bIsEnabled)
#define ISWbemPrivilege_get_Name(This,strDisplayName) (This)->lpVtbl->get_Name(This,strDisplayName)
#define ISWbemPrivilege_get_DisplayName(This,strDisplayName) (This)->lpVtbl->get_DisplayName(This,strDisplayName)
#define ISWbemPrivilege_get_Identifier(This,iPrivilege) (This)->lpVtbl->get_Identifier(This,iPrivilege)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemPrivilege_QueryInterface(ISWbemPrivilege* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemPrivilege_AddRef(ISWbemPrivilege* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemPrivilege_Release(ISWbemPrivilege* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemPrivilege_GetTypeInfoCount(ISWbemPrivilege* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemPrivilege_GetTypeInfo(ISWbemPrivilege* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemPrivilege_GetIDsOfNames(ISWbemPrivilege* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemPrivilege_Invoke(ISWbemPrivilege* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemPrivilege methods ***/
static FORCEINLINE HRESULT ISWbemPrivilege_get_IsEnabled(ISWbemPrivilege* This,VARIANT_BOOL *bIsEnabled) {
    return This->lpVtbl->get_IsEnabled(This,bIsEnabled);
}
static FORCEINLINE HRESULT ISWbemPrivilege_put_IsEnabled(ISWbemPrivilege* This,VARIANT_BOOL bIsEnabled) {
    return This->lpVtbl->put_IsEnabled(This,bIsEnabled);
}
static FORCEINLINE HRESULT ISWbemPrivilege_get_Name(ISWbemPrivilege* This,BSTR *strDisplayName) {
    return This->lpVtbl->get_Name(This,strDisplayName);
}
static FORCEINLINE HRESULT ISWbemPrivilege_get_DisplayName(ISWbemPrivilege* This,BSTR *strDisplayName) {
    return This->lpVtbl->get_DisplayName(This,strDisplayName);
}
static FORCEINLINE HRESULT ISWbemPrivilege_get_Identifier(ISWbemPrivilege* This,WbemPrivilegeEnum *iPrivilege) {
    return This->lpVtbl->get_Identifier(This,iPrivilege);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemPrivilege_get_IsEnabled_Proxy(
    ISWbemPrivilege* This,
    VARIANT_BOOL *bIsEnabled);
void __RPC_STUB ISWbemPrivilege_get_IsEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemPrivilege_put_IsEnabled_Proxy(
    ISWbemPrivilege* This,
    VARIANT_BOOL bIsEnabled);
void __RPC_STUB ISWbemPrivilege_put_IsEnabled_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemPrivilege_get_Name_Proxy(
    ISWbemPrivilege* This,
    BSTR *strDisplayName);
void __RPC_STUB ISWbemPrivilege_get_Name_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemPrivilege_get_DisplayName_Proxy(
    ISWbemPrivilege* This,
    BSTR *strDisplayName);
void __RPC_STUB ISWbemPrivilege_get_DisplayName_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemPrivilege_get_Identifier_Proxy(
    ISWbemPrivilege* This,
    WbemPrivilegeEnum *iPrivilege);
void __RPC_STUB ISWbemPrivilege_get_Identifier_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemPrivilege_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemPrivilegeSet interface
 */
#ifndef __ISWbemPrivilegeSet_INTERFACE_DEFINED__
#define __ISWbemPrivilegeSet_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemPrivilegeSet, 0x26ee67bf, 0x5804, 0x11d2, 0x8b,0x4a, 0x00,0x60,0x08,0x06,0xd9,0xb6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("26ee67bf-5804-11d2-8b4a-00600806d9b6")
ISWbemPrivilegeSet : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **pUnk) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        WbemPrivilegeEnum iPrivilege,
        ISWbemPrivilege **objWbemPrivilege) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *iCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        WbemPrivilegeEnum iPrivilege,
        VARIANT_BOOL bIsEnabled = TRUE,
        ISWbemPrivilege **objWbemPrivilege) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        WbemPrivilegeEnum iPrivilege) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteAll(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddAsString(
        BSTR strPrivilege,
        VARIANT_BOOL bIsEnabled = TRUE,
        ISWbemPrivilege **objWbemPrivilege) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemPrivilegeSet, 0x26ee67bf, 0x5804, 0x11d2, 0x8b,0x4a, 0x00,0x60,0x08,0x06,0xd9,0xb6)
#endif
#else
typedef struct ISWbemPrivilegeSetVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemPrivilegeSet methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        ISWbemPrivilegeSet* This,
        IUnknown **pUnk);

    HRESULT (STDMETHODCALLTYPE *Item)(
        ISWbemPrivilegeSet* This,
        WbemPrivilegeEnum iPrivilege,
        ISWbemPrivilege **objWbemPrivilege);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        ISWbemPrivilegeSet* This,
        LONG *iCount);

    HRESULT (STDMETHODCALLTYPE *Add)(
        ISWbemPrivilegeSet* This,
        WbemPrivilegeEnum iPrivilege,
        VARIANT_BOOL bIsEnabled,
        ISWbemPrivilege **objWbemPrivilege);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        ISWbemPrivilegeSet* This,
        WbemPrivilegeEnum iPrivilege);

    HRESULT (STDMETHODCALLTYPE *DeleteAll)(
        ISWbemPrivilegeSet* This);

    HRESULT (STDMETHODCALLTYPE *AddAsString)(
        ISWbemPrivilegeSet* This,
        BSTR strPrivilege,
        VARIANT_BOOL bIsEnabled,
        ISWbemPrivilege **objWbemPrivilege);

    END_INTERFACE
} ISWbemPrivilegeSetVtbl;
interface ISWbemPrivilegeSet {
    CONST_VTBL ISWbemPrivilegeSetVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemPrivilegeSet_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemPrivilegeSet_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemPrivilegeSet_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemPrivilegeSet_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemPrivilegeSet_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemPrivilegeSet_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemPrivilegeSet_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemPrivilegeSet methods ***/
#define ISWbemPrivilegeSet_get__NewEnum(This,pUnk) (This)->lpVtbl->get__NewEnum(This,pUnk)
#define ISWbemPrivilegeSet_Item(This,iPrivilege,objWbemPrivilege) (This)->lpVtbl->Item(This,iPrivilege,objWbemPrivilege)
#define ISWbemPrivilegeSet_get_Count(This,iCount) (This)->lpVtbl->get_Count(This,iCount)
#define ISWbemPrivilegeSet_Add(This,iPrivilege,bIsEnabled,objWbemPrivilege) (This)->lpVtbl->Add(This,iPrivilege,bIsEnabled,objWbemPrivilege)
#define ISWbemPrivilegeSet_Remove(This,iPrivilege) (This)->lpVtbl->Remove(This,iPrivilege)
#define ISWbemPrivilegeSet_DeleteAll(This) (This)->lpVtbl->DeleteAll(This)
#define ISWbemPrivilegeSet_AddAsString(This,strPrivilege,bIsEnabled,objWbemPrivilege) (This)->lpVtbl->AddAsString(This,strPrivilege,bIsEnabled,objWbemPrivilege)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemPrivilegeSet_QueryInterface(ISWbemPrivilegeSet* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemPrivilegeSet_AddRef(ISWbemPrivilegeSet* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemPrivilegeSet_Release(ISWbemPrivilegeSet* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemPrivilegeSet_GetTypeInfoCount(ISWbemPrivilegeSet* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemPrivilegeSet_GetTypeInfo(ISWbemPrivilegeSet* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemPrivilegeSet_GetIDsOfNames(ISWbemPrivilegeSet* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemPrivilegeSet_Invoke(ISWbemPrivilegeSet* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemPrivilegeSet methods ***/
static FORCEINLINE HRESULT ISWbemPrivilegeSet_get__NewEnum(ISWbemPrivilegeSet* This,IUnknown **pUnk) {
    return This->lpVtbl->get__NewEnum(This,pUnk);
}
static FORCEINLINE HRESULT ISWbemPrivilegeSet_Item(ISWbemPrivilegeSet* This,WbemPrivilegeEnum iPrivilege,ISWbemPrivilege **objWbemPrivilege) {
    return This->lpVtbl->Item(This,iPrivilege,objWbemPrivilege);
}
static FORCEINLINE HRESULT ISWbemPrivilegeSet_get_Count(ISWbemPrivilegeSet* This,LONG *iCount) {
    return This->lpVtbl->get_Count(This,iCount);
}
static FORCEINLINE HRESULT ISWbemPrivilegeSet_Add(ISWbemPrivilegeSet* This,WbemPrivilegeEnum iPrivilege,VARIANT_BOOL bIsEnabled,ISWbemPrivilege **objWbemPrivilege) {
    return This->lpVtbl->Add(This,iPrivilege,bIsEnabled,objWbemPrivilege);
}
static FORCEINLINE HRESULT ISWbemPrivilegeSet_Remove(ISWbemPrivilegeSet* This,WbemPrivilegeEnum iPrivilege) {
    return This->lpVtbl->Remove(This,iPrivilege);
}
static FORCEINLINE HRESULT ISWbemPrivilegeSet_DeleteAll(ISWbemPrivilegeSet* This) {
    return This->lpVtbl->DeleteAll(This);
}
static FORCEINLINE HRESULT ISWbemPrivilegeSet_AddAsString(ISWbemPrivilegeSet* This,BSTR strPrivilege,VARIANT_BOOL bIsEnabled,ISWbemPrivilege **objWbemPrivilege) {
    return This->lpVtbl->AddAsString(This,strPrivilege,bIsEnabled,objWbemPrivilege);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemPrivilegeSet_get__NewEnum_Proxy(
    ISWbemPrivilegeSet* This,
    IUnknown **pUnk);
void __RPC_STUB ISWbemPrivilegeSet_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemPrivilegeSet_Item_Proxy(
    ISWbemPrivilegeSet* This,
    WbemPrivilegeEnum iPrivilege,
    ISWbemPrivilege **objWbemPrivilege);
void __RPC_STUB ISWbemPrivilegeSet_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemPrivilegeSet_get_Count_Proxy(
    ISWbemPrivilegeSet* This,
    LONG *iCount);
void __RPC_STUB ISWbemPrivilegeSet_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemPrivilegeSet_Add_Proxy(
    ISWbemPrivilegeSet* This,
    WbemPrivilegeEnum iPrivilege,
    VARIANT_BOOL bIsEnabled,
    ISWbemPrivilege **objWbemPrivilege);
void __RPC_STUB ISWbemPrivilegeSet_Add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemPrivilegeSet_Remove_Proxy(
    ISWbemPrivilegeSet* This,
    WbemPrivilegeEnum iPrivilege);
void __RPC_STUB ISWbemPrivilegeSet_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemPrivilegeSet_DeleteAll_Proxy(
    ISWbemPrivilegeSet* This);
void __RPC_STUB ISWbemPrivilegeSet_DeleteAll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemPrivilegeSet_AddAsString_Proxy(
    ISWbemPrivilegeSet* This,
    BSTR strPrivilege,
    VARIANT_BOOL bIsEnabled,
    ISWbemPrivilege **objWbemPrivilege);
void __RPC_STUB ISWbemPrivilegeSet_AddAsString_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemPrivilegeSet_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemDateTime interface
 */
#ifndef __ISWbemDateTime_INTERFACE_DEFINED__
#define __ISWbemDateTime_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemDateTime, 0x5e97458a, 0xcf77, 0x11d3, 0xb3,0x8f, 0x00,0x10,0x5a,0x1f,0x47,0x3a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5e97458a-cf77-11d3-b38f-00105a1f473a")
ISWbemDateTime : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Value(
        BSTR *strValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Value(
        BSTR strValue) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Year(
        LONG *iYear) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Year(
        LONG iYear) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_YearSpecified(
        VARIANT_BOOL *bYearSpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_YearSpecified(
        VARIANT_BOOL bYearSpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Month(
        LONG *iMonth) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Month(
        LONG iMonth) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MonthSpecified(
        VARIANT_BOOL *bMonthSpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MonthSpecified(
        VARIANT_BOOL bMonthSpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Day(
        LONG *iDay) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Day(
        LONG iDay) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DaySpecified(
        VARIANT_BOOL *bDaySpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_DaySpecified(
        VARIANT_BOOL bDaySpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Hours(
        LONG *iHours) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Hours(
        LONG iHours) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HoursSpecified(
        VARIANT_BOOL *bHoursSpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_HoursSpecified(
        VARIANT_BOOL bHoursSpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Minutes(
        LONG *iMinutes) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Minutes(
        LONG iMinutes) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MinutesSpecified(
        VARIANT_BOOL *bMinutesSpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MinutesSpecified(
        VARIANT_BOOL bMinutesSpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Seconds(
        LONG *iSeconds) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Seconds(
        LONG iSeconds) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SecondsSpecified(
        VARIANT_BOOL *bSecondsSpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_SecondsSpecified(
        VARIANT_BOOL bSecondsSpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Microseconds(
        LONG *iMicroseconds) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Microseconds(
        LONG iMicroseconds) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MicrosecondsSpecified(
        VARIANT_BOOL *bMicrosecondsSpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_MicrosecondsSpecified(
        VARIANT_BOOL bMicrosecondsSpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UTC(
        LONG *iUTC) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_UTC(
        LONG iUTC) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UTCSpecified(
        VARIANT_BOOL *bUTCSpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_UTCSpecified(
        VARIANT_BOOL bUTCSpecified) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsInterval(
        VARIANT_BOOL *bIsInterval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_IsInterval(
        VARIANT_BOOL bIsInterval) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetVarDate(
        VARIANT_BOOL bIsLocal = TRUE,
        DATE *dVarDate) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetVarDate(
        DATE dVarDate,
        VARIANT_BOOL bIsLocal = TRUE) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetFileTime(
        VARIANT_BOOL bIsLocal = TRUE,
        BSTR *strFileTime) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetFileTime(
        BSTR strFileTime,
        VARIANT_BOOL bIsLocal = TRUE) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemDateTime, 0x5e97458a, 0xcf77, 0x11d3, 0xb3,0x8f, 0x00,0x10,0x5a,0x1f,0x47,0x3a)
#endif
#else
typedef struct ISWbemDateTimeVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemDateTime methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Value)(
        ISWbemDateTime* This,
        BSTR *strValue);

    HRESULT (STDMETHODCALLTYPE *put_Value)(
        ISWbemDateTime* This,
        BSTR strValue);

    HRESULT (STDMETHODCALLTYPE *get_Year)(
        ISWbemDateTime* This,
        LONG *iYear);

    HRESULT (STDMETHODCALLTYPE *put_Year)(
        ISWbemDateTime* This,
        LONG iYear);

    HRESULT (STDMETHODCALLTYPE *get_YearSpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL *bYearSpecified);

    HRESULT (STDMETHODCALLTYPE *put_YearSpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL bYearSpecified);

    HRESULT (STDMETHODCALLTYPE *get_Month)(
        ISWbemDateTime* This,
        LONG *iMonth);

    HRESULT (STDMETHODCALLTYPE *put_Month)(
        ISWbemDateTime* This,
        LONG iMonth);

    HRESULT (STDMETHODCALLTYPE *get_MonthSpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL *bMonthSpecified);

    HRESULT (STDMETHODCALLTYPE *put_MonthSpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL bMonthSpecified);

    HRESULT (STDMETHODCALLTYPE *get_Day)(
        ISWbemDateTime* This,
        LONG *iDay);

    HRESULT (STDMETHODCALLTYPE *put_Day)(
        ISWbemDateTime* This,
        LONG iDay);

    HRESULT (STDMETHODCALLTYPE *get_DaySpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL *bDaySpecified);

    HRESULT (STDMETHODCALLTYPE *put_DaySpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL bDaySpecified);

    HRESULT (STDMETHODCALLTYPE *get_Hours)(
        ISWbemDateTime* This,
        LONG *iHours);

    HRESULT (STDMETHODCALLTYPE *put_Hours)(
        ISWbemDateTime* This,
        LONG iHours);

    HRESULT (STDMETHODCALLTYPE *get_HoursSpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL *bHoursSpecified);

    HRESULT (STDMETHODCALLTYPE *put_HoursSpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL bHoursSpecified);

    HRESULT (STDMETHODCALLTYPE *get_Minutes)(
        ISWbemDateTime* This,
        LONG *iMinutes);

    HRESULT (STDMETHODCALLTYPE *put_Minutes)(
        ISWbemDateTime* This,
        LONG iMinutes);

    HRESULT (STDMETHODCALLTYPE *get_MinutesSpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL *bMinutesSpecified);

    HRESULT (STDMETHODCALLTYPE *put_MinutesSpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL bMinutesSpecified);

    HRESULT (STDMETHODCALLTYPE *get_Seconds)(
        ISWbemDateTime* This,
        LONG *iSeconds);

    HRESULT (STDMETHODCALLTYPE *put_Seconds)(
        ISWbemDateTime* This,
        LONG iSeconds);

    HRESULT (STDMETHODCALLTYPE *get_SecondsSpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL *bSecondsSpecified);

    HRESULT (STDMETHODCALLTYPE *put_SecondsSpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL bSecondsSpecified);

    HRESULT (STDMETHODCALLTYPE *get_Microseconds)(
        ISWbemDateTime* This,
        LONG *iMicroseconds);

    HRESULT (STDMETHODCALLTYPE *put_Microseconds)(
        ISWbemDateTime* This,
        LONG iMicroseconds);

    HRESULT (STDMETHODCALLTYPE *get_MicrosecondsSpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL *bMicrosecondsSpecified);

    HRESULT (STDMETHODCALLTYPE *put_MicrosecondsSpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL bMicrosecondsSpecified);

    HRESULT (STDMETHODCALLTYPE *get_UTC)(
        ISWbemDateTime* This,
        LONG *iUTC);

    HRESULT (STDMETHODCALLTYPE *put_UTC)(
        ISWbemDateTime* This,
        LONG iUTC);

    HRESULT (STDMETHODCALLTYPE *get_UTCSpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL *bUTCSpecified);

    HRESULT (STDMETHODCALLTYPE *put_UTCSpecified)(
        ISWbemDateTime* This,
        VARIANT_BOOL bUTCSpecified);

    HRESULT (STDMETHODCALLTYPE *get_IsInterval)(
        ISWbemDateTime* This,
        VARIANT_BOOL *bIsInterval);

    HRESULT (STDMETHODCALLTYPE *put_IsInterval)(
        ISWbemDateTime* This,
        VARIANT_BOOL bIsInterval);

    HRESULT (STDMETHODCALLTYPE *GetVarDate)(
        ISWbemDateTime* This,
        VARIANT_BOOL bIsLocal,
        DATE *dVarDate);

    HRESULT (STDMETHODCALLTYPE *SetVarDate)(
        ISWbemDateTime* This,
        DATE dVarDate,
        VARIANT_BOOL bIsLocal);

    HRESULT (STDMETHODCALLTYPE *GetFileTime)(
        ISWbemDateTime* This,
        VARIANT_BOOL bIsLocal,
        BSTR *strFileTime);

    HRESULT (STDMETHODCALLTYPE *SetFileTime)(
        ISWbemDateTime* This,
        BSTR strFileTime,
        VARIANT_BOOL bIsLocal);

    END_INTERFACE
} ISWbemDateTimeVtbl;
interface ISWbemDateTime {
    CONST_VTBL ISWbemDateTimeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemDateTime_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemDateTime_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemDateTime_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemDateTime_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemDateTime_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemDateTime_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemDateTime_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemDateTime methods ***/
#define ISWbemDateTime_get_Value(This,strValue) (This)->lpVtbl->get_Value(This,strValue)
#define ISWbemDateTime_put_Value(This,strValue) (This)->lpVtbl->put_Value(This,strValue)
#define ISWbemDateTime_get_Year(This,iYear) (This)->lpVtbl->get_Year(This,iYear)
#define ISWbemDateTime_put_Year(This,iYear) (This)->lpVtbl->put_Year(This,iYear)
#define ISWbemDateTime_get_YearSpecified(This,bYearSpecified) (This)->lpVtbl->get_YearSpecified(This,bYearSpecified)
#define ISWbemDateTime_put_YearSpecified(This,bYearSpecified) (This)->lpVtbl->put_YearSpecified(This,bYearSpecified)
#define ISWbemDateTime_get_Month(This,iMonth) (This)->lpVtbl->get_Month(This,iMonth)
#define ISWbemDateTime_put_Month(This,iMonth) (This)->lpVtbl->put_Month(This,iMonth)
#define ISWbemDateTime_get_MonthSpecified(This,bMonthSpecified) (This)->lpVtbl->get_MonthSpecified(This,bMonthSpecified)
#define ISWbemDateTime_put_MonthSpecified(This,bMonthSpecified) (This)->lpVtbl->put_MonthSpecified(This,bMonthSpecified)
#define ISWbemDateTime_get_Day(This,iDay) (This)->lpVtbl->get_Day(This,iDay)
#define ISWbemDateTime_put_Day(This,iDay) (This)->lpVtbl->put_Day(This,iDay)
#define ISWbemDateTime_get_DaySpecified(This,bDaySpecified) (This)->lpVtbl->get_DaySpecified(This,bDaySpecified)
#define ISWbemDateTime_put_DaySpecified(This,bDaySpecified) (This)->lpVtbl->put_DaySpecified(This,bDaySpecified)
#define ISWbemDateTime_get_Hours(This,iHours) (This)->lpVtbl->get_Hours(This,iHours)
#define ISWbemDateTime_put_Hours(This,iHours) (This)->lpVtbl->put_Hours(This,iHours)
#define ISWbemDateTime_get_HoursSpecified(This,bHoursSpecified) (This)->lpVtbl->get_HoursSpecified(This,bHoursSpecified)
#define ISWbemDateTime_put_HoursSpecified(This,bHoursSpecified) (This)->lpVtbl->put_HoursSpecified(This,bHoursSpecified)
#define ISWbemDateTime_get_Minutes(This,iMinutes) (This)->lpVtbl->get_Minutes(This,iMinutes)
#define ISWbemDateTime_put_Minutes(This,iMinutes) (This)->lpVtbl->put_Minutes(This,iMinutes)
#define ISWbemDateTime_get_MinutesSpecified(This,bMinutesSpecified) (This)->lpVtbl->get_MinutesSpecified(This,bMinutesSpecified)
#define ISWbemDateTime_put_MinutesSpecified(This,bMinutesSpecified) (This)->lpVtbl->put_MinutesSpecified(This,bMinutesSpecified)
#define ISWbemDateTime_get_Seconds(This,iSeconds) (This)->lpVtbl->get_Seconds(This,iSeconds)
#define ISWbemDateTime_put_Seconds(This,iSeconds) (This)->lpVtbl->put_Seconds(This,iSeconds)
#define ISWbemDateTime_get_SecondsSpecified(This,bSecondsSpecified) (This)->lpVtbl->get_SecondsSpecified(This,bSecondsSpecified)
#define ISWbemDateTime_put_SecondsSpecified(This,bSecondsSpecified) (This)->lpVtbl->put_SecondsSpecified(This,bSecondsSpecified)
#define ISWbemDateTime_get_Microseconds(This,iMicroseconds) (This)->lpVtbl->get_Microseconds(This,iMicroseconds)
#define ISWbemDateTime_put_Microseconds(This,iMicroseconds) (This)->lpVtbl->put_Microseconds(This,iMicroseconds)
#define ISWbemDateTime_get_MicrosecondsSpecified(This,bMicrosecondsSpecified) (This)->lpVtbl->get_MicrosecondsSpecified(This,bMicrosecondsSpecified)
#define ISWbemDateTime_put_MicrosecondsSpecified(This,bMicrosecondsSpecified) (This)->lpVtbl->put_MicrosecondsSpecified(This,bMicrosecondsSpecified)
#define ISWbemDateTime_get_UTC(This,iUTC) (This)->lpVtbl->get_UTC(This,iUTC)
#define ISWbemDateTime_put_UTC(This,iUTC) (This)->lpVtbl->put_UTC(This,iUTC)
#define ISWbemDateTime_get_UTCSpecified(This,bUTCSpecified) (This)->lpVtbl->get_UTCSpecified(This,bUTCSpecified)
#define ISWbemDateTime_put_UTCSpecified(This,bUTCSpecified) (This)->lpVtbl->put_UTCSpecified(This,bUTCSpecified)
#define ISWbemDateTime_get_IsInterval(This,bIsInterval) (This)->lpVtbl->get_IsInterval(This,bIsInterval)
#define ISWbemDateTime_put_IsInterval(This,bIsInterval) (This)->lpVtbl->put_IsInterval(This,bIsInterval)
#define ISWbemDateTime_GetVarDate(This,bIsLocal,dVarDate) (This)->lpVtbl->GetVarDate(This,bIsLocal,dVarDate)
#define ISWbemDateTime_SetVarDate(This,dVarDate,bIsLocal) (This)->lpVtbl->SetVarDate(This,dVarDate,bIsLocal)
#define ISWbemDateTime_GetFileTime(This,bIsLocal,strFileTime) (This)->lpVtbl->GetFileTime(This,bIsLocal,strFileTime)
#define ISWbemDateTime_SetFileTime(This,strFileTime,bIsLocal) (This)->lpVtbl->SetFileTime(This,strFileTime,bIsLocal)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemDateTime_QueryInterface(ISWbemDateTime* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemDateTime_AddRef(ISWbemDateTime* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemDateTime_Release(ISWbemDateTime* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemDateTime_GetTypeInfoCount(ISWbemDateTime* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemDateTime_GetTypeInfo(ISWbemDateTime* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemDateTime_GetIDsOfNames(ISWbemDateTime* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemDateTime_Invoke(ISWbemDateTime* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemDateTime methods ***/
static FORCEINLINE HRESULT ISWbemDateTime_get_Value(ISWbemDateTime* This,BSTR *strValue) {
    return This->lpVtbl->get_Value(This,strValue);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_Value(ISWbemDateTime* This,BSTR strValue) {
    return This->lpVtbl->put_Value(This,strValue);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_Year(ISWbemDateTime* This,LONG *iYear) {
    return This->lpVtbl->get_Year(This,iYear);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_Year(ISWbemDateTime* This,LONG iYear) {
    return This->lpVtbl->put_Year(This,iYear);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_YearSpecified(ISWbemDateTime* This,VARIANT_BOOL *bYearSpecified) {
    return This->lpVtbl->get_YearSpecified(This,bYearSpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_YearSpecified(ISWbemDateTime* This,VARIANT_BOOL bYearSpecified) {
    return This->lpVtbl->put_YearSpecified(This,bYearSpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_Month(ISWbemDateTime* This,LONG *iMonth) {
    return This->lpVtbl->get_Month(This,iMonth);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_Month(ISWbemDateTime* This,LONG iMonth) {
    return This->lpVtbl->put_Month(This,iMonth);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_MonthSpecified(ISWbemDateTime* This,VARIANT_BOOL *bMonthSpecified) {
    return This->lpVtbl->get_MonthSpecified(This,bMonthSpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_MonthSpecified(ISWbemDateTime* This,VARIANT_BOOL bMonthSpecified) {
    return This->lpVtbl->put_MonthSpecified(This,bMonthSpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_Day(ISWbemDateTime* This,LONG *iDay) {
    return This->lpVtbl->get_Day(This,iDay);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_Day(ISWbemDateTime* This,LONG iDay) {
    return This->lpVtbl->put_Day(This,iDay);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_DaySpecified(ISWbemDateTime* This,VARIANT_BOOL *bDaySpecified) {
    return This->lpVtbl->get_DaySpecified(This,bDaySpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_DaySpecified(ISWbemDateTime* This,VARIANT_BOOL bDaySpecified) {
    return This->lpVtbl->put_DaySpecified(This,bDaySpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_Hours(ISWbemDateTime* This,LONG *iHours) {
    return This->lpVtbl->get_Hours(This,iHours);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_Hours(ISWbemDateTime* This,LONG iHours) {
    return This->lpVtbl->put_Hours(This,iHours);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_HoursSpecified(ISWbemDateTime* This,VARIANT_BOOL *bHoursSpecified) {
    return This->lpVtbl->get_HoursSpecified(This,bHoursSpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_HoursSpecified(ISWbemDateTime* This,VARIANT_BOOL bHoursSpecified) {
    return This->lpVtbl->put_HoursSpecified(This,bHoursSpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_Minutes(ISWbemDateTime* This,LONG *iMinutes) {
    return This->lpVtbl->get_Minutes(This,iMinutes);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_Minutes(ISWbemDateTime* This,LONG iMinutes) {
    return This->lpVtbl->put_Minutes(This,iMinutes);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_MinutesSpecified(ISWbemDateTime* This,VARIANT_BOOL *bMinutesSpecified) {
    return This->lpVtbl->get_MinutesSpecified(This,bMinutesSpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_MinutesSpecified(ISWbemDateTime* This,VARIANT_BOOL bMinutesSpecified) {
    return This->lpVtbl->put_MinutesSpecified(This,bMinutesSpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_Seconds(ISWbemDateTime* This,LONG *iSeconds) {
    return This->lpVtbl->get_Seconds(This,iSeconds);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_Seconds(ISWbemDateTime* This,LONG iSeconds) {
    return This->lpVtbl->put_Seconds(This,iSeconds);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_SecondsSpecified(ISWbemDateTime* This,VARIANT_BOOL *bSecondsSpecified) {
    return This->lpVtbl->get_SecondsSpecified(This,bSecondsSpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_SecondsSpecified(ISWbemDateTime* This,VARIANT_BOOL bSecondsSpecified) {
    return This->lpVtbl->put_SecondsSpecified(This,bSecondsSpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_Microseconds(ISWbemDateTime* This,LONG *iMicroseconds) {
    return This->lpVtbl->get_Microseconds(This,iMicroseconds);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_Microseconds(ISWbemDateTime* This,LONG iMicroseconds) {
    return This->lpVtbl->put_Microseconds(This,iMicroseconds);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_MicrosecondsSpecified(ISWbemDateTime* This,VARIANT_BOOL *bMicrosecondsSpecified) {
    return This->lpVtbl->get_MicrosecondsSpecified(This,bMicrosecondsSpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_MicrosecondsSpecified(ISWbemDateTime* This,VARIANT_BOOL bMicrosecondsSpecified) {
    return This->lpVtbl->put_MicrosecondsSpecified(This,bMicrosecondsSpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_UTC(ISWbemDateTime* This,LONG *iUTC) {
    return This->lpVtbl->get_UTC(This,iUTC);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_UTC(ISWbemDateTime* This,LONG iUTC) {
    return This->lpVtbl->put_UTC(This,iUTC);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_UTCSpecified(ISWbemDateTime* This,VARIANT_BOOL *bUTCSpecified) {
    return This->lpVtbl->get_UTCSpecified(This,bUTCSpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_UTCSpecified(ISWbemDateTime* This,VARIANT_BOOL bUTCSpecified) {
    return This->lpVtbl->put_UTCSpecified(This,bUTCSpecified);
}
static FORCEINLINE HRESULT ISWbemDateTime_get_IsInterval(ISWbemDateTime* This,VARIANT_BOOL *bIsInterval) {
    return This->lpVtbl->get_IsInterval(This,bIsInterval);
}
static FORCEINLINE HRESULT ISWbemDateTime_put_IsInterval(ISWbemDateTime* This,VARIANT_BOOL bIsInterval) {
    return This->lpVtbl->put_IsInterval(This,bIsInterval);
}
static FORCEINLINE HRESULT ISWbemDateTime_GetVarDate(ISWbemDateTime* This,VARIANT_BOOL bIsLocal,DATE *dVarDate) {
    return This->lpVtbl->GetVarDate(This,bIsLocal,dVarDate);
}
static FORCEINLINE HRESULT ISWbemDateTime_SetVarDate(ISWbemDateTime* This,DATE dVarDate,VARIANT_BOOL bIsLocal) {
    return This->lpVtbl->SetVarDate(This,dVarDate,bIsLocal);
}
static FORCEINLINE HRESULT ISWbemDateTime_GetFileTime(ISWbemDateTime* This,VARIANT_BOOL bIsLocal,BSTR *strFileTime) {
    return This->lpVtbl->GetFileTime(This,bIsLocal,strFileTime);
}
static FORCEINLINE HRESULT ISWbemDateTime_SetFileTime(ISWbemDateTime* This,BSTR strFileTime,VARIANT_BOOL bIsLocal) {
    return This->lpVtbl->SetFileTime(This,strFileTime,bIsLocal);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_Value_Proxy(
    ISWbemDateTime* This,
    BSTR *strValue);
void __RPC_STUB ISWbemDateTime_get_Value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_Value_Proxy(
    ISWbemDateTime* This,
    BSTR strValue);
void __RPC_STUB ISWbemDateTime_put_Value_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_Year_Proxy(
    ISWbemDateTime* This,
    LONG *iYear);
void __RPC_STUB ISWbemDateTime_get_Year_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_Year_Proxy(
    ISWbemDateTime* This,
    LONG iYear);
void __RPC_STUB ISWbemDateTime_put_Year_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_YearSpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL *bYearSpecified);
void __RPC_STUB ISWbemDateTime_get_YearSpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_YearSpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL bYearSpecified);
void __RPC_STUB ISWbemDateTime_put_YearSpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_Month_Proxy(
    ISWbemDateTime* This,
    LONG *iMonth);
void __RPC_STUB ISWbemDateTime_get_Month_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_Month_Proxy(
    ISWbemDateTime* This,
    LONG iMonth);
void __RPC_STUB ISWbemDateTime_put_Month_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_MonthSpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL *bMonthSpecified);
void __RPC_STUB ISWbemDateTime_get_MonthSpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_MonthSpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL bMonthSpecified);
void __RPC_STUB ISWbemDateTime_put_MonthSpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_Day_Proxy(
    ISWbemDateTime* This,
    LONG *iDay);
void __RPC_STUB ISWbemDateTime_get_Day_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_Day_Proxy(
    ISWbemDateTime* This,
    LONG iDay);
void __RPC_STUB ISWbemDateTime_put_Day_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_DaySpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL *bDaySpecified);
void __RPC_STUB ISWbemDateTime_get_DaySpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_DaySpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL bDaySpecified);
void __RPC_STUB ISWbemDateTime_put_DaySpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_Hours_Proxy(
    ISWbemDateTime* This,
    LONG *iHours);
void __RPC_STUB ISWbemDateTime_get_Hours_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_Hours_Proxy(
    ISWbemDateTime* This,
    LONG iHours);
void __RPC_STUB ISWbemDateTime_put_Hours_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_HoursSpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL *bHoursSpecified);
void __RPC_STUB ISWbemDateTime_get_HoursSpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_HoursSpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL bHoursSpecified);
void __RPC_STUB ISWbemDateTime_put_HoursSpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_Minutes_Proxy(
    ISWbemDateTime* This,
    LONG *iMinutes);
void __RPC_STUB ISWbemDateTime_get_Minutes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_Minutes_Proxy(
    ISWbemDateTime* This,
    LONG iMinutes);
void __RPC_STUB ISWbemDateTime_put_Minutes_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_MinutesSpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL *bMinutesSpecified);
void __RPC_STUB ISWbemDateTime_get_MinutesSpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_MinutesSpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL bMinutesSpecified);
void __RPC_STUB ISWbemDateTime_put_MinutesSpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_Seconds_Proxy(
    ISWbemDateTime* This,
    LONG *iSeconds);
void __RPC_STUB ISWbemDateTime_get_Seconds_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_Seconds_Proxy(
    ISWbemDateTime* This,
    LONG iSeconds);
void __RPC_STUB ISWbemDateTime_put_Seconds_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_SecondsSpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL *bSecondsSpecified);
void __RPC_STUB ISWbemDateTime_get_SecondsSpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_SecondsSpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL bSecondsSpecified);
void __RPC_STUB ISWbemDateTime_put_SecondsSpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_Microseconds_Proxy(
    ISWbemDateTime* This,
    LONG *iMicroseconds);
void __RPC_STUB ISWbemDateTime_get_Microseconds_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_Microseconds_Proxy(
    ISWbemDateTime* This,
    LONG iMicroseconds);
void __RPC_STUB ISWbemDateTime_put_Microseconds_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_MicrosecondsSpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL *bMicrosecondsSpecified);
void __RPC_STUB ISWbemDateTime_get_MicrosecondsSpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_MicrosecondsSpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL bMicrosecondsSpecified);
void __RPC_STUB ISWbemDateTime_put_MicrosecondsSpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_UTC_Proxy(
    ISWbemDateTime* This,
    LONG *iUTC);
void __RPC_STUB ISWbemDateTime_get_UTC_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_UTC_Proxy(
    ISWbemDateTime* This,
    LONG iUTC);
void __RPC_STUB ISWbemDateTime_put_UTC_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_UTCSpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL *bUTCSpecified);
void __RPC_STUB ISWbemDateTime_get_UTCSpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_UTCSpecified_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL bUTCSpecified);
void __RPC_STUB ISWbemDateTime_put_UTCSpecified_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_get_IsInterval_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL *bIsInterval);
void __RPC_STUB ISWbemDateTime_get_IsInterval_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_put_IsInterval_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL bIsInterval);
void __RPC_STUB ISWbemDateTime_put_IsInterval_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_GetVarDate_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL bIsLocal,
    DATE *dVarDate);
void __RPC_STUB ISWbemDateTime_GetVarDate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_SetVarDate_Proxy(
    ISWbemDateTime* This,
    DATE dVarDate,
    VARIANT_BOOL bIsLocal);
void __RPC_STUB ISWbemDateTime_SetVarDate_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_GetFileTime_Proxy(
    ISWbemDateTime* This,
    VARIANT_BOOL bIsLocal,
    BSTR *strFileTime);
void __RPC_STUB ISWbemDateTime_GetFileTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemDateTime_SetFileTime_Proxy(
    ISWbemDateTime* This,
    BSTR strFileTime,
    VARIANT_BOOL bIsLocal);
void __RPC_STUB ISWbemDateTime_SetFileTime_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemDateTime_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemRefreshableItem interface
 */
#ifndef __ISWbemRefreshableItem_INTERFACE_DEFINED__
#define __ISWbemRefreshableItem_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemRefreshableItem, 0x5ad4bf92, 0xdaab, 0x11d3, 0xb3,0x8f, 0x00,0x10,0x5a,0x1f,0x47,0x3a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5ad4bf92-daab-11d3-b38f-00105a1f473a")
ISWbemRefreshableItem : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Index(
        LONG *iIndex) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Refresher(
        ISWbemRefresher **objWbemRefresher) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsSet(
        VARIANT_BOOL *bIsSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Object(
        ISWbemObjectEx **objWbemObject) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ObjectSet(
        ISWbemObjectSet **objWbemObjectSet) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        LONG iFlags = 0) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemRefreshableItem, 0x5ad4bf92, 0xdaab, 0x11d3, 0xb3,0x8f, 0x00,0x10,0x5a,0x1f,0x47,0x3a)
#endif
#else
typedef struct ISWbemRefreshableItemVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemRefreshableItem methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Index)(
        ISWbemRefreshableItem* This,
        LONG *iIndex);

    HRESULT (STDMETHODCALLTYPE *get_Refresher)(
        ISWbemRefreshableItem* This,
        ISWbemRefresher **objWbemRefresher);

    HRESULT (STDMETHODCALLTYPE *get_IsSet)(
        ISWbemRefreshableItem* This,
        VARIANT_BOOL *bIsSet);

    HRESULT (STDMETHODCALLTYPE *get_Object)(
        ISWbemRefreshableItem* This,
        ISWbemObjectEx **objWbemObject);

    HRESULT (STDMETHODCALLTYPE *get_ObjectSet)(
        ISWbemRefreshableItem* This,
        ISWbemObjectSet **objWbemObjectSet);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        ISWbemRefreshableItem* This,
        LONG iFlags);

    END_INTERFACE
} ISWbemRefreshableItemVtbl;
interface ISWbemRefreshableItem {
    CONST_VTBL ISWbemRefreshableItemVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemRefreshableItem_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemRefreshableItem_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemRefreshableItem_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemRefreshableItem_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemRefreshableItem_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemRefreshableItem_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemRefreshableItem_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemRefreshableItem methods ***/
#define ISWbemRefreshableItem_get_Index(This,iIndex) (This)->lpVtbl->get_Index(This,iIndex)
#define ISWbemRefreshableItem_get_Refresher(This,objWbemRefresher) (This)->lpVtbl->get_Refresher(This,objWbemRefresher)
#define ISWbemRefreshableItem_get_IsSet(This,bIsSet) (This)->lpVtbl->get_IsSet(This,bIsSet)
#define ISWbemRefreshableItem_get_Object(This,objWbemObject) (This)->lpVtbl->get_Object(This,objWbemObject)
#define ISWbemRefreshableItem_get_ObjectSet(This,objWbemObjectSet) (This)->lpVtbl->get_ObjectSet(This,objWbemObjectSet)
#define ISWbemRefreshableItem_Remove(This,iFlags) (This)->lpVtbl->Remove(This,iFlags)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemRefreshableItem_QueryInterface(ISWbemRefreshableItem* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemRefreshableItem_AddRef(ISWbemRefreshableItem* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemRefreshableItem_Release(ISWbemRefreshableItem* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemRefreshableItem_GetTypeInfoCount(ISWbemRefreshableItem* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemRefreshableItem_GetTypeInfo(ISWbemRefreshableItem* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemRefreshableItem_GetIDsOfNames(ISWbemRefreshableItem* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemRefreshableItem_Invoke(ISWbemRefreshableItem* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemRefreshableItem methods ***/
static FORCEINLINE HRESULT ISWbemRefreshableItem_get_Index(ISWbemRefreshableItem* This,LONG *iIndex) {
    return This->lpVtbl->get_Index(This,iIndex);
}
static FORCEINLINE HRESULT ISWbemRefreshableItem_get_Refresher(ISWbemRefreshableItem* This,ISWbemRefresher **objWbemRefresher) {
    return This->lpVtbl->get_Refresher(This,objWbemRefresher);
}
static FORCEINLINE HRESULT ISWbemRefreshableItem_get_IsSet(ISWbemRefreshableItem* This,VARIANT_BOOL *bIsSet) {
    return This->lpVtbl->get_IsSet(This,bIsSet);
}
static FORCEINLINE HRESULT ISWbemRefreshableItem_get_Object(ISWbemRefreshableItem* This,ISWbemObjectEx **objWbemObject) {
    return This->lpVtbl->get_Object(This,objWbemObject);
}
static FORCEINLINE HRESULT ISWbemRefreshableItem_get_ObjectSet(ISWbemRefreshableItem* This,ISWbemObjectSet **objWbemObjectSet) {
    return This->lpVtbl->get_ObjectSet(This,objWbemObjectSet);
}
static FORCEINLINE HRESULT ISWbemRefreshableItem_Remove(ISWbemRefreshableItem* This,LONG iFlags) {
    return This->lpVtbl->Remove(This,iFlags);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemRefreshableItem_get_Index_Proxy(
    ISWbemRefreshableItem* This,
    LONG *iIndex);
void __RPC_STUB ISWbemRefreshableItem_get_Index_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemRefreshableItem_get_Refresher_Proxy(
    ISWbemRefreshableItem* This,
    ISWbemRefresher **objWbemRefresher);
void __RPC_STUB ISWbemRefreshableItem_get_Refresher_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemRefreshableItem_get_IsSet_Proxy(
    ISWbemRefreshableItem* This,
    VARIANT_BOOL *bIsSet);
void __RPC_STUB ISWbemRefreshableItem_get_IsSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemRefreshableItem_get_Object_Proxy(
    ISWbemRefreshableItem* This,
    ISWbemObjectEx **objWbemObject);
void __RPC_STUB ISWbemRefreshableItem_get_Object_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemRefreshableItem_get_ObjectSet_Proxy(
    ISWbemRefreshableItem* This,
    ISWbemObjectSet **objWbemObjectSet);
void __RPC_STUB ISWbemRefreshableItem_get_ObjectSet_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemRefreshableItem_Remove_Proxy(
    ISWbemRefreshableItem* This,
    LONG iFlags);
void __RPC_STUB ISWbemRefreshableItem_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemRefreshableItem_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISWbemRefresher interface
 */
#ifndef __ISWbemRefresher_INTERFACE_DEFINED__
#define __ISWbemRefresher_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISWbemRefresher, 0x14d8250e, 0xd9c2, 0x11d3, 0xb3,0x8f, 0x00,0x10,0x5a,0x1f,0x47,0x3a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("14d8250e-d9c2-11d3-b38f-00105a1f473a")
ISWbemRefresher : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **pUnk) = 0;

    virtual HRESULT STDMETHODCALLTYPE Item(
        LONG iIndex,
        ISWbemRefreshableItem **objWbemRefreshableItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Count(
        LONG *iCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        ISWbemServicesEx *objWbemServices,
        BSTR bsInstancePath,
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemRefreshableItem **objWbemRefreshableItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE AddEnum(
        ISWbemServicesEx *objWbemServices,
        BSTR bsClassName,
        LONG iFlags = 0,
        IDispatch *objWbemNamedValueSet = 0,
        ISWbemRefreshableItem **objWbemRefreshableItem) = 0;

    virtual HRESULT STDMETHODCALLTYPE Remove(
        LONG iIndex,
        LONG iFlags = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE Refresh(
        LONG iFlags = 0) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AutoReconnect(
        VARIANT_BOOL *bCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AutoReconnect(
        VARIANT_BOOL bCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE DeleteAll(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISWbemRefresher, 0x14d8250e, 0xd9c2, 0x11d3, 0xb3,0x8f, 0x00,0x10,0x5a,0x1f,0x47,0x3a)
#endif
#else
typedef struct ISWbemRefresherVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISWbemRefresher methods ***/
    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        ISWbemRefresher* This,
        IUnknown **pUnk);

    HRESULT (STDMETHODCALLTYPE *Item)(
        ISWbemRefresher* This,
        LONG iIndex,
        ISWbemRefreshableItem **objWbemRefreshableItem);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        ISWbemRefresher* This,
        LONG *iCount);

    HRESULT (STDMETHODCALLTYPE *Add)(
        ISWbemRefresher* This,
        ISWbemServicesEx *objWbemServices,
        BSTR bsInstancePath,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemRefreshableItem **objWbemRefreshableItem);

    HRESULT (STDMETHODCALLTYPE *AddEnum)(
        ISWbemRefresher* This,
        ISWbemServicesEx *objWbemServices,
        BSTR bsClassName,
        LONG iFlags,
        IDispatch *objWbemNamedValueSet,
        ISWbemRefreshableItem **objWbemRefreshableItem);

    HRESULT (STDMETHODCALLTYPE *Remove)(
        ISWbemRefresher* This,
        LONG iIndex,
        LONG iFlags);

    HRESULT (STDMETHODCALLTYPE *Refresh)(
        ISWbemRefresher* This,
        LONG iFlags);

    HRESULT (STDMETHODCALLTYPE *get_AutoReconnect)(
        ISWbemRefresher* This,
        VARIANT_BOOL *bCount);

    HRESULT (STDMETHODCALLTYPE *put_AutoReconnect)(
        ISWbemRefresher* This,
        VARIANT_BOOL bCount);

    HRESULT (STDMETHODCALLTYPE *DeleteAll)(
        ISWbemRefresher* This);

    END_INTERFACE
} ISWbemRefresherVtbl;
interface ISWbemRefresher {
    CONST_VTBL ISWbemRefresherVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISWbemRefresher_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISWbemRefresher_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISWbemRefresher_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISWbemRefresher_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISWbemRefresher_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISWbemRefresher_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISWbemRefresher_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISWbemRefresher methods ***/
#define ISWbemRefresher_get__NewEnum(This,pUnk) (This)->lpVtbl->get__NewEnum(This,pUnk)
#define ISWbemRefresher_Item(This,iIndex,objWbemRefreshableItem) (This)->lpVtbl->Item(This,iIndex,objWbemRefreshableItem)
#define ISWbemRefresher_get_Count(This,iCount) (This)->lpVtbl->get_Count(This,iCount)
#define ISWbemRefresher_Add(This,objWbemServices,bsInstancePath,iFlags,objWbemNamedValueSet,objWbemRefreshableItem) (This)->lpVtbl->Add(This,objWbemServices,bsInstancePath,iFlags,objWbemNamedValueSet,objWbemRefreshableItem)
#define ISWbemRefresher_AddEnum(This,objWbemServices,bsClassName,iFlags,objWbemNamedValueSet,objWbemRefreshableItem) (This)->lpVtbl->AddEnum(This,objWbemServices,bsClassName,iFlags,objWbemNamedValueSet,objWbemRefreshableItem)
#define ISWbemRefresher_Remove(This,iIndex,iFlags) (This)->lpVtbl->Remove(This,iIndex,iFlags)
#define ISWbemRefresher_Refresh(This,iFlags) (This)->lpVtbl->Refresh(This,iFlags)
#define ISWbemRefresher_get_AutoReconnect(This,bCount) (This)->lpVtbl->get_AutoReconnect(This,bCount)
#define ISWbemRefresher_put_AutoReconnect(This,bCount) (This)->lpVtbl->put_AutoReconnect(This,bCount)
#define ISWbemRefresher_DeleteAll(This) (This)->lpVtbl->DeleteAll(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISWbemRefresher_QueryInterface(ISWbemRefresher* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISWbemRefresher_AddRef(ISWbemRefresher* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISWbemRefresher_Release(ISWbemRefresher* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISWbemRefresher_GetTypeInfoCount(ISWbemRefresher* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISWbemRefresher_GetTypeInfo(ISWbemRefresher* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISWbemRefresher_GetIDsOfNames(ISWbemRefresher* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISWbemRefresher_Invoke(ISWbemRefresher* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISWbemRefresher methods ***/
static FORCEINLINE HRESULT ISWbemRefresher_get__NewEnum(ISWbemRefresher* This,IUnknown **pUnk) {
    return This->lpVtbl->get__NewEnum(This,pUnk);
}
static FORCEINLINE HRESULT ISWbemRefresher_Item(ISWbemRefresher* This,LONG iIndex,ISWbemRefreshableItem **objWbemRefreshableItem) {
    return This->lpVtbl->Item(This,iIndex,objWbemRefreshableItem);
}
static FORCEINLINE HRESULT ISWbemRefresher_get_Count(ISWbemRefresher* This,LONG *iCount) {
    return This->lpVtbl->get_Count(This,iCount);
}
static FORCEINLINE HRESULT ISWbemRefresher_Add(ISWbemRefresher* This,ISWbemServicesEx *objWbemServices,BSTR bsInstancePath,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemRefreshableItem **objWbemRefreshableItem) {
    return This->lpVtbl->Add(This,objWbemServices,bsInstancePath,iFlags,objWbemNamedValueSet,objWbemRefreshableItem);
}
static FORCEINLINE HRESULT ISWbemRefresher_AddEnum(ISWbemRefresher* This,ISWbemServicesEx *objWbemServices,BSTR bsClassName,LONG iFlags,IDispatch *objWbemNamedValueSet,ISWbemRefreshableItem **objWbemRefreshableItem) {
    return This->lpVtbl->AddEnum(This,objWbemServices,bsClassName,iFlags,objWbemNamedValueSet,objWbemRefreshableItem);
}
static FORCEINLINE HRESULT ISWbemRefresher_Remove(ISWbemRefresher* This,LONG iIndex,LONG iFlags) {
    return This->lpVtbl->Remove(This,iIndex,iFlags);
}
static FORCEINLINE HRESULT ISWbemRefresher_Refresh(ISWbemRefresher* This,LONG iFlags) {
    return This->lpVtbl->Refresh(This,iFlags);
}
static FORCEINLINE HRESULT ISWbemRefresher_get_AutoReconnect(ISWbemRefresher* This,VARIANT_BOOL *bCount) {
    return This->lpVtbl->get_AutoReconnect(This,bCount);
}
static FORCEINLINE HRESULT ISWbemRefresher_put_AutoReconnect(ISWbemRefresher* This,VARIANT_BOOL bCount) {
    return This->lpVtbl->put_AutoReconnect(This,bCount);
}
static FORCEINLINE HRESULT ISWbemRefresher_DeleteAll(ISWbemRefresher* This) {
    return This->lpVtbl->DeleteAll(This);
}
#endif
#endif

#endif

HRESULT STDMETHODCALLTYPE ISWbemRefresher_get__NewEnum_Proxy(
    ISWbemRefresher* This,
    IUnknown **pUnk);
void __RPC_STUB ISWbemRefresher_get__NewEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemRefresher_Item_Proxy(
    ISWbemRefresher* This,
    LONG iIndex,
    ISWbemRefreshableItem **objWbemRefreshableItem);
void __RPC_STUB ISWbemRefresher_Item_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemRefresher_get_Count_Proxy(
    ISWbemRefresher* This,
    LONG *iCount);
void __RPC_STUB ISWbemRefresher_get_Count_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemRefresher_Add_Proxy(
    ISWbemRefresher* This,
    ISWbemServicesEx *objWbemServices,
    BSTR bsInstancePath,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemRefreshableItem **objWbemRefreshableItem);
void __RPC_STUB ISWbemRefresher_Add_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemRefresher_AddEnum_Proxy(
    ISWbemRefresher* This,
    ISWbemServicesEx *objWbemServices,
    BSTR bsClassName,
    LONG iFlags,
    IDispatch *objWbemNamedValueSet,
    ISWbemRefreshableItem **objWbemRefreshableItem);
void __RPC_STUB ISWbemRefresher_AddEnum_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemRefresher_Remove_Proxy(
    ISWbemRefresher* This,
    LONG iIndex,
    LONG iFlags);
void __RPC_STUB ISWbemRefresher_Remove_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemRefresher_Refresh_Proxy(
    ISWbemRefresher* This,
    LONG iFlags);
void __RPC_STUB ISWbemRefresher_Refresh_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemRefresher_get_AutoReconnect_Proxy(
    ISWbemRefresher* This,
    VARIANT_BOOL *bCount);
void __RPC_STUB ISWbemRefresher_get_AutoReconnect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemRefresher_put_AutoReconnect_Proxy(
    ISWbemRefresher* This,
    VARIANT_BOOL bCount);
void __RPC_STUB ISWbemRefresher_put_AutoReconnect_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);
HRESULT STDMETHODCALLTYPE ISWbemRefresher_DeleteAll_Proxy(
    ISWbemRefresher* This);
void __RPC_STUB ISWbemRefresher_DeleteAll_Stub(
    IRpcStubBuffer* This,
    IRpcChannelBuffer* pRpcChannelBuffer,
    PRPC_MESSAGE pRpcMessage,
    DWORD* pdwStubPhase);

#endif  /* __ISWbemRefresher_INTERFACE_DEFINED__ */

#endif
/* Begin additional prototypes for all interfaces */


/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __wbemdisp_h__ */
