/*** Autogenerated by WIDL 6.4 from include/wuapi.idl - Do not edit ***/

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

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

#ifndef __wuapi_h__
#define __wuapi_h__

/* Forward declarations */

#ifndef __IAutomaticUpdatesSettings_FWD_DEFINED__
#define __IAutomaticUpdatesSettings_FWD_DEFINED__
typedef interface IAutomaticUpdatesSettings IAutomaticUpdatesSettings;
#ifdef __cplusplus
interface IAutomaticUpdatesSettings;
#endif /* __cplusplus */
#endif

#ifndef __IAutomaticUpdates_FWD_DEFINED__
#define __IAutomaticUpdates_FWD_DEFINED__
typedef interface IAutomaticUpdates IAutomaticUpdates;
#ifdef __cplusplus
interface IAutomaticUpdates;
#endif /* __cplusplus */
#endif

#ifndef __IWebProxy_FWD_DEFINED__
#define __IWebProxy_FWD_DEFINED__
typedef interface IWebProxy IWebProxy;
#ifdef __cplusplus
interface IWebProxy;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateSession_FWD_DEFINED__
#define __IUpdateSession_FWD_DEFINED__
typedef interface IUpdateSession IUpdateSession;
#ifdef __cplusplus
interface IUpdateSession;
#endif /* __cplusplus */
#endif

#ifndef __IImageInformation_FWD_DEFINED__
#define __IImageInformation_FWD_DEFINED__
typedef interface IImageInformation IImageInformation;
#ifdef __cplusplus
interface IImageInformation;
#endif /* __cplusplus */
#endif

#ifndef __ICategory_FWD_DEFINED__
#define __ICategory_FWD_DEFINED__
typedef interface ICategory ICategory;
#ifdef __cplusplus
interface ICategory;
#endif /* __cplusplus */
#endif

#ifndef __ICategoryCollection_FWD_DEFINED__
#define __ICategoryCollection_FWD_DEFINED__
typedef interface ICategoryCollection ICategoryCollection;
#ifdef __cplusplus
interface ICategoryCollection;
#endif /* __cplusplus */
#endif

#ifndef __IStringCollection_FWD_DEFINED__
#define __IStringCollection_FWD_DEFINED__
typedef interface IStringCollection IStringCollection;
#ifdef __cplusplus
interface IStringCollection;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateException_FWD_DEFINED__
#define __IUpdateException_FWD_DEFINED__
typedef interface IUpdateException IUpdateException;
#ifdef __cplusplus
interface IUpdateException;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateExceptionCollection_FWD_DEFINED__
#define __IUpdateExceptionCollection_FWD_DEFINED__
typedef interface IUpdateExceptionCollection IUpdateExceptionCollection;
#ifdef __cplusplus
interface IUpdateExceptionCollection;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateIdentity_FWD_DEFINED__
#define __IUpdateIdentity_FWD_DEFINED__
typedef interface IUpdateIdentity IUpdateIdentity;
#ifdef __cplusplus
interface IUpdateIdentity;
#endif /* __cplusplus */
#endif

#ifndef __IInstallationBehavior_FWD_DEFINED__
#define __IInstallationBehavior_FWD_DEFINED__
typedef interface IInstallationBehavior IInstallationBehavior;
#ifdef __cplusplus
interface IInstallationBehavior;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateDownloadContent_FWD_DEFINED__
#define __IUpdateDownloadContent_FWD_DEFINED__
typedef interface IUpdateDownloadContent IUpdateDownloadContent;
#ifdef __cplusplus
interface IUpdateDownloadContent;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateDownloadContentCollection_FWD_DEFINED__
#define __IUpdateDownloadContentCollection_FWD_DEFINED__
typedef interface IUpdateDownloadContentCollection IUpdateDownloadContentCollection;
#ifdef __cplusplus
interface IUpdateDownloadContentCollection;
#endif /* __cplusplus */
#endif

#ifndef __IUpdate_FWD_DEFINED__
#define __IUpdate_FWD_DEFINED__
typedef interface IUpdate IUpdate;
#ifdef __cplusplus
interface IUpdate;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateCollection_FWD_DEFINED__
#define __IUpdateCollection_FWD_DEFINED__
typedef interface IUpdateCollection IUpdateCollection;
#ifdef __cplusplus
interface IUpdateCollection;
#endif /* __cplusplus */
#endif

#ifndef __ISearchJob_FWD_DEFINED__
#define __ISearchJob_FWD_DEFINED__
typedef interface ISearchJob ISearchJob;
#ifdef __cplusplus
interface ISearchJob;
#endif /* __cplusplus */
#endif

#ifndef __ISearchResult_FWD_DEFINED__
#define __ISearchResult_FWD_DEFINED__
typedef interface ISearchResult ISearchResult;
#ifdef __cplusplus
interface ISearchResult;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateHistoryEntry_FWD_DEFINED__
#define __IUpdateHistoryEntry_FWD_DEFINED__
typedef interface IUpdateHistoryEntry IUpdateHistoryEntry;
#ifdef __cplusplus
interface IUpdateHistoryEntry;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateHistoryEntryCollection_FWD_DEFINED__
#define __IUpdateHistoryEntryCollection_FWD_DEFINED__
typedef interface IUpdateHistoryEntryCollection IUpdateHistoryEntryCollection;
#ifdef __cplusplus
interface IUpdateHistoryEntryCollection;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateSearcher_FWD_DEFINED__
#define __IUpdateSearcher_FWD_DEFINED__
typedef interface IUpdateSearcher IUpdateSearcher;
#ifdef __cplusplus
interface IUpdateSearcher;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateDownloadResult_FWD_DEFINED__
#define __IUpdateDownloadResult_FWD_DEFINED__
typedef interface IUpdateDownloadResult IUpdateDownloadResult;
#ifdef __cplusplus
interface IUpdateDownloadResult;
#endif /* __cplusplus */
#endif

#ifndef __IDownloadProgress_FWD_DEFINED__
#define __IDownloadProgress_FWD_DEFINED__
typedef interface IDownloadProgress IDownloadProgress;
#ifdef __cplusplus
interface IDownloadProgress;
#endif /* __cplusplus */
#endif

#ifndef __IDownloadJob_FWD_DEFINED__
#define __IDownloadJob_FWD_DEFINED__
typedef interface IDownloadJob IDownloadJob;
#ifdef __cplusplus
interface IDownloadJob;
#endif /* __cplusplus */
#endif

#ifndef __IDownloadResult_FWD_DEFINED__
#define __IDownloadResult_FWD_DEFINED__
typedef interface IDownloadResult IDownloadResult;
#ifdef __cplusplus
interface IDownloadResult;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateDownloader_FWD_DEFINED__
#define __IUpdateDownloader_FWD_DEFINED__
typedef interface IUpdateDownloader IUpdateDownloader;
#ifdef __cplusplus
interface IUpdateDownloader;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateInstallationResult_FWD_DEFINED__
#define __IUpdateInstallationResult_FWD_DEFINED__
typedef interface IUpdateInstallationResult IUpdateInstallationResult;
#ifdef __cplusplus
interface IUpdateInstallationResult;
#endif /* __cplusplus */
#endif

#ifndef __IInstallationProgress_FWD_DEFINED__
#define __IInstallationProgress_FWD_DEFINED__
typedef interface IInstallationProgress IInstallationProgress;
#ifdef __cplusplus
interface IInstallationProgress;
#endif /* __cplusplus */
#endif

#ifndef __IInstallationJob_FWD_DEFINED__
#define __IInstallationJob_FWD_DEFINED__
typedef interface IInstallationJob IInstallationJob;
#ifdef __cplusplus
interface IInstallationJob;
#endif /* __cplusplus */
#endif

#ifndef __IInstallationResult_FWD_DEFINED__
#define __IInstallationResult_FWD_DEFINED__
typedef interface IInstallationResult IInstallationResult;
#ifdef __cplusplus
interface IInstallationResult;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateInstaller_FWD_DEFINED__
#define __IUpdateInstaller_FWD_DEFINED__
typedef interface IUpdateInstaller IUpdateInstaller;
#ifdef __cplusplus
interface IUpdateInstaller;
#endif /* __cplusplus */
#endif

#ifndef __ISystemInformation_FWD_DEFINED__
#define __ISystemInformation_FWD_DEFINED__
typedef interface ISystemInformation ISystemInformation;
#ifdef __cplusplus
interface ISystemInformation;
#endif /* __cplusplus */
#endif

#ifndef __AutomaticUpdates_FWD_DEFINED__
#define __AutomaticUpdates_FWD_DEFINED__
#ifdef __cplusplus
typedef class AutomaticUpdates AutomaticUpdates;
#else
typedef struct AutomaticUpdates AutomaticUpdates;
#endif /* defined __cplusplus */
#endif /* defined __AutomaticUpdates_FWD_DEFINED__ */

#ifndef __UpdateInstaller_FWD_DEFINED__
#define __UpdateInstaller_FWD_DEFINED__
#ifdef __cplusplus
typedef class UpdateInstaller UpdateInstaller;
#else
typedef struct UpdateInstaller UpdateInstaller;
#endif /* defined __cplusplus */
#endif /* defined __UpdateInstaller_FWD_DEFINED__ */

#ifndef __UpdateSession_FWD_DEFINED__
#define __UpdateSession_FWD_DEFINED__
#ifdef __cplusplus
typedef class UpdateSession UpdateSession;
#else
typedef struct UpdateSession UpdateSession;
#endif /* defined __cplusplus */
#endif /* defined __UpdateSession_FWD_DEFINED__ */

#ifndef __SystemInformation_FWD_DEFINED__
#define __SystemInformation_FWD_DEFINED__
#ifdef __cplusplus
typedef class SystemInformation SystemInformation;
#else
typedef struct SystemInformation SystemInformation;
#endif /* defined __cplusplus */
#endif /* defined __SystemInformation_FWD_DEFINED__ */

/* Headers for imported files */

#include <oaidl.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __WUApiLib_LIBRARY_DEFINED__
#define __WUApiLib_LIBRARY_DEFINED__

DEFINE_GUID(LIBID_WUApiLib, 0xb596cc9f, 0x56e5, 0x419e, 0xa6,0x22, 0xe0,0x1b,0xb4,0x57,0x43,0x1e);

#ifndef __ICategoryCollection_FWD_DEFINED__
#define __ICategoryCollection_FWD_DEFINED__
typedef interface ICategoryCollection ICategoryCollection;
#ifdef __cplusplus
interface ICategoryCollection;
#endif /* __cplusplus */
#endif

#ifndef __IStringCollection_FWD_DEFINED__
#define __IStringCollection_FWD_DEFINED__
typedef interface IStringCollection IStringCollection;
#ifdef __cplusplus
interface IStringCollection;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateCollection_FWD_DEFINED__
#define __IUpdateCollection_FWD_DEFINED__
typedef interface IUpdateCollection IUpdateCollection;
#ifdef __cplusplus
interface IUpdateCollection;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateDownloader_FWD_DEFINED__
#define __IUpdateDownloader_FWD_DEFINED__
typedef interface IUpdateDownloader IUpdateDownloader;
#ifdef __cplusplus
interface IUpdateDownloader;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateInstaller_FWD_DEFINED__
#define __IUpdateInstaller_FWD_DEFINED__
typedef interface IUpdateInstaller IUpdateInstaller;
#ifdef __cplusplus
interface IUpdateInstaller;
#endif /* __cplusplus */
#endif

#ifndef __IUpdateSearcher_FWD_DEFINED__
#define __IUpdateSearcher_FWD_DEFINED__
typedef interface IUpdateSearcher IUpdateSearcher;
#ifdef __cplusplus
interface IUpdateSearcher;
#endif /* __cplusplus */
#endif

typedef enum tagDownloadPriority {
    dpLow = 1,
    dpNormal = 2,
    dpHigh = 3
} DownloadPriority;
typedef enum tagServerSelection {
    ssDefault = 0,
    ssManagedServer = 1,
    ssWindowsUpdate = 2,
    ssOthers = 3
} ServerSelection;
typedef enum tagAutomaticUpdatesNotificationLevel {
    aunlNotConfigured = 0,
    aunlDisabled = 1,
    aunlNotifyBeforeDownload = 2,
    aunlNotifyBeforeInstallation = 3,
    aunlScheduledInstallation = 4
} AutomaticUpdatesNotificationLevel;
typedef enum tagAutomaticUpdatesScheduledInstallationDay {
    ausidEveryDay = 0,
    ausidEverySunday = 1,
    ausidEveryMonday = 2,
    ausidEveryTuesday = 3,
    ausidEveryWednesday = 4,
    ausidEveryThursday = 5,
    ausidEveryFriday = 6,
    ausidEverySaturday = 7
} AutomaticUpdatesScheduledInstallationDay;
typedef enum tagDownloadPhase {
    dphInitializing = 0,
    dphDownloading = 1,
    dphVerifying = 2
} DownloadPhase;
typedef enum tagOperationResultCode {
    orcNotStarted = 0,
    orcInProgress = 1,
    orcSucceeded = 2,
    orcSucceededWithErrors = 3,
    orcFailed = 4,
    orcAborted = 5
} OperationResultCode;
typedef enum tagUpdateExceptionContext {
    uecGeneral = 1,
    uecWindowsDriver = 2,
    uecWindowsInstaller = 3
} UpdateExceptionContext;
typedef enum tagInstallationImpact {
    iiNormal = 0,
    iiMinor = 1,
    iiRequiresExclusiveHandling = 2
} InstallationImpact;
typedef enum tagInstallationRebootBehavior {
    irbNeverReboots = 0,
    irbAlwaysRequiresReboot = 1,
    irbCanRequestReboot = 2
} InstallationRebootBehavior;
typedef enum tagUpdateType {
    utSoftware = 1,
    utDriver = 2
} UpdateType;
typedef enum tagUpdateOperation {
    uoInstallation = 1,
    uoUninstallation = 2
} UpdateOperation;
typedef enum tagDeploymentAction {
    daNone = 0,
    daInstallation = 1,
    daUninstallation = 2,
    daDetection = 3
} DeploymentAction;
/*****************************************************************************
 * IAutomaticUpdatesSettings interface
 */
#ifndef __IAutomaticUpdatesSettings_INTERFACE_DEFINED__
#define __IAutomaticUpdatesSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAutomaticUpdatesSettings, 0x2ee48f22, 0xaf3c, 0x405f, 0x89,0x70, 0xf7,0x1b,0xe1,0x2e,0xe9,0xa2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("2ee48f22-af3c-405f-8970-f71be12ee9a2")
IAutomaticUpdatesSettings : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_NotificationLevel(
        AutomaticUpdatesNotificationLevel *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_NotificationLevel(
        AutomaticUpdatesNotificationLevel value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ReadOnly(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Required(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ScheduledInstallationDay(
        AutomaticUpdatesScheduledInstallationDay *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ScheduledInstallationDay(
        AutomaticUpdatesScheduledInstallationDay value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ScheduledInstallationTime(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ScheduledInstallationTime(
        LONG value) = 0;

    virtual HRESULT STDMETHODCALLTYPE Refresh(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Save(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAutomaticUpdatesSettings, 0x2ee48f22, 0xaf3c, 0x405f, 0x89,0x70, 0xf7,0x1b,0xe1,0x2e,0xe9,0xa2)
#endif
#else
typedef struct IAutomaticUpdatesSettingsVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IAutomaticUpdatesSettings methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NotificationLevel)(
        IAutomaticUpdatesSettings *This,
        AutomaticUpdatesNotificationLevel *retval);

    HRESULT (STDMETHODCALLTYPE *put_NotificationLevel)(
        IAutomaticUpdatesSettings *This,
        AutomaticUpdatesNotificationLevel value);

    HRESULT (STDMETHODCALLTYPE *get_ReadOnly)(
        IAutomaticUpdatesSettings *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_Required)(
        IAutomaticUpdatesSettings *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_ScheduledInstallationDay)(
        IAutomaticUpdatesSettings *This,
        AutomaticUpdatesScheduledInstallationDay *retval);

    HRESULT (STDMETHODCALLTYPE *put_ScheduledInstallationDay)(
        IAutomaticUpdatesSettings *This,
        AutomaticUpdatesScheduledInstallationDay value);

    HRESULT (STDMETHODCALLTYPE *get_ScheduledInstallationTime)(
        IAutomaticUpdatesSettings *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *put_ScheduledInstallationTime)(
        IAutomaticUpdatesSettings *This,
        LONG value);

    HRESULT (STDMETHODCALLTYPE *Refresh)(
        IAutomaticUpdatesSettings *This);

    HRESULT (STDMETHODCALLTYPE *Save)(
        IAutomaticUpdatesSettings *This);

    END_INTERFACE
} IAutomaticUpdatesSettingsVtbl;

interface IAutomaticUpdatesSettings {
    CONST_VTBL IAutomaticUpdatesSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAutomaticUpdatesSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAutomaticUpdatesSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAutomaticUpdatesSettings_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IAutomaticUpdatesSettings_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IAutomaticUpdatesSettings_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IAutomaticUpdatesSettings_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IAutomaticUpdatesSettings_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IAutomaticUpdatesSettings methods ***/
#define IAutomaticUpdatesSettings_get_NotificationLevel(This,retval) (This)->lpVtbl->get_NotificationLevel(This,retval)
#define IAutomaticUpdatesSettings_put_NotificationLevel(This,value) (This)->lpVtbl->put_NotificationLevel(This,value)
#define IAutomaticUpdatesSettings_get_ReadOnly(This,retval) (This)->lpVtbl->get_ReadOnly(This,retval)
#define IAutomaticUpdatesSettings_get_Required(This,retval) (This)->lpVtbl->get_Required(This,retval)
#define IAutomaticUpdatesSettings_get_ScheduledInstallationDay(This,retval) (This)->lpVtbl->get_ScheduledInstallationDay(This,retval)
#define IAutomaticUpdatesSettings_put_ScheduledInstallationDay(This,value) (This)->lpVtbl->put_ScheduledInstallationDay(This,value)
#define IAutomaticUpdatesSettings_get_ScheduledInstallationTime(This,retval) (This)->lpVtbl->get_ScheduledInstallationTime(This,retval)
#define IAutomaticUpdatesSettings_put_ScheduledInstallationTime(This,value) (This)->lpVtbl->put_ScheduledInstallationTime(This,value)
#define IAutomaticUpdatesSettings_Refresh(This) (This)->lpVtbl->Refresh(This)
#define IAutomaticUpdatesSettings_Save(This) (This)->lpVtbl->Save(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_QueryInterface(IAutomaticUpdatesSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAutomaticUpdatesSettings_AddRef(IAutomaticUpdatesSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAutomaticUpdatesSettings_Release(IAutomaticUpdatesSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_GetTypeInfoCount(IAutomaticUpdatesSettings* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_GetTypeInfo(IAutomaticUpdatesSettings* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_GetIDsOfNames(IAutomaticUpdatesSettings* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_Invoke(IAutomaticUpdatesSettings* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IAutomaticUpdatesSettings methods ***/
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_get_NotificationLevel(IAutomaticUpdatesSettings* This,AutomaticUpdatesNotificationLevel *retval) {
    return This->lpVtbl->get_NotificationLevel(This,retval);
}
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_put_NotificationLevel(IAutomaticUpdatesSettings* This,AutomaticUpdatesNotificationLevel value) {
    return This->lpVtbl->put_NotificationLevel(This,value);
}
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_get_ReadOnly(IAutomaticUpdatesSettings* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_ReadOnly(This,retval);
}
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_get_Required(IAutomaticUpdatesSettings* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_Required(This,retval);
}
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_get_ScheduledInstallationDay(IAutomaticUpdatesSettings* This,AutomaticUpdatesScheduledInstallationDay *retval) {
    return This->lpVtbl->get_ScheduledInstallationDay(This,retval);
}
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_put_ScheduledInstallationDay(IAutomaticUpdatesSettings* This,AutomaticUpdatesScheduledInstallationDay value) {
    return This->lpVtbl->put_ScheduledInstallationDay(This,value);
}
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_get_ScheduledInstallationTime(IAutomaticUpdatesSettings* This,LONG *retval) {
    return This->lpVtbl->get_ScheduledInstallationTime(This,retval);
}
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_put_ScheduledInstallationTime(IAutomaticUpdatesSettings* This,LONG value) {
    return This->lpVtbl->put_ScheduledInstallationTime(This,value);
}
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_Refresh(IAutomaticUpdatesSettings* This) {
    return This->lpVtbl->Refresh(This);
}
static FORCEINLINE HRESULT IAutomaticUpdatesSettings_Save(IAutomaticUpdatesSettings* This) {
    return This->lpVtbl->Save(This);
}
#endif
#endif

#endif


#endif  /* __IAutomaticUpdatesSettings_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAutomaticUpdates interface
 */
#ifndef __IAutomaticUpdates_INTERFACE_DEFINED__
#define __IAutomaticUpdates_INTERFACE_DEFINED__

DEFINE_GUID(IID_IAutomaticUpdates, 0x673425bf, 0xc082, 0x4c7c, 0xbd,0xfd, 0x56,0x94,0x64,0xb8,0xe0,0xce);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("673425bf-c082-4c7c-bdfd-569464b8e0ce")
IAutomaticUpdates : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE DetectNow(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Pause(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Resume(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE ShowSettingsDialog(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Settings(
        IAutomaticUpdatesSettings **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ServiceEnabled(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE EnableService(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IAutomaticUpdates, 0x673425bf, 0xc082, 0x4c7c, 0xbd,0xfd, 0x56,0x94,0x64,0xb8,0xe0,0xce)
#endif
#else
typedef struct IAutomaticUpdatesVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IAutomaticUpdates methods ***/
    HRESULT (STDMETHODCALLTYPE *DetectNow)(
        IAutomaticUpdates *This);

    HRESULT (STDMETHODCALLTYPE *Pause)(
        IAutomaticUpdates *This);

    HRESULT (STDMETHODCALLTYPE *Resume)(
        IAutomaticUpdates *This);

    HRESULT (STDMETHODCALLTYPE *ShowSettingsDialog)(
        IAutomaticUpdates *This);

    HRESULT (STDMETHODCALLTYPE *get_Settings)(
        IAutomaticUpdates *This,
        IAutomaticUpdatesSettings **retval);

    HRESULT (STDMETHODCALLTYPE *get_ServiceEnabled)(
        IAutomaticUpdates *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *EnableService)(
        IAutomaticUpdates *This);

    END_INTERFACE
} IAutomaticUpdatesVtbl;

interface IAutomaticUpdates {
    CONST_VTBL IAutomaticUpdatesVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IAutomaticUpdates_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IAutomaticUpdates_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IAutomaticUpdates_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IAutomaticUpdates_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IAutomaticUpdates_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IAutomaticUpdates_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IAutomaticUpdates_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IAutomaticUpdates methods ***/
#define IAutomaticUpdates_DetectNow(This) (This)->lpVtbl->DetectNow(This)
#define IAutomaticUpdates_Pause(This) (This)->lpVtbl->Pause(This)
#define IAutomaticUpdates_Resume(This) (This)->lpVtbl->Resume(This)
#define IAutomaticUpdates_ShowSettingsDialog(This) (This)->lpVtbl->ShowSettingsDialog(This)
#define IAutomaticUpdates_get_Settings(This,retval) (This)->lpVtbl->get_Settings(This,retval)
#define IAutomaticUpdates_get_ServiceEnabled(This,retval) (This)->lpVtbl->get_ServiceEnabled(This,retval)
#define IAutomaticUpdates_EnableService(This) (This)->lpVtbl->EnableService(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IAutomaticUpdates_QueryInterface(IAutomaticUpdates* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IAutomaticUpdates_AddRef(IAutomaticUpdates* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IAutomaticUpdates_Release(IAutomaticUpdates* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IAutomaticUpdates_GetTypeInfoCount(IAutomaticUpdates* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IAutomaticUpdates_GetTypeInfo(IAutomaticUpdates* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IAutomaticUpdates_GetIDsOfNames(IAutomaticUpdates* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IAutomaticUpdates_Invoke(IAutomaticUpdates* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IAutomaticUpdates methods ***/
static FORCEINLINE HRESULT IAutomaticUpdates_DetectNow(IAutomaticUpdates* This) {
    return This->lpVtbl->DetectNow(This);
}
static FORCEINLINE HRESULT IAutomaticUpdates_Pause(IAutomaticUpdates* This) {
    return This->lpVtbl->Pause(This);
}
static FORCEINLINE HRESULT IAutomaticUpdates_Resume(IAutomaticUpdates* This) {
    return This->lpVtbl->Resume(This);
}
static FORCEINLINE HRESULT IAutomaticUpdates_ShowSettingsDialog(IAutomaticUpdates* This) {
    return This->lpVtbl->ShowSettingsDialog(This);
}
static FORCEINLINE HRESULT IAutomaticUpdates_get_Settings(IAutomaticUpdates* This,IAutomaticUpdatesSettings **retval) {
    return This->lpVtbl->get_Settings(This,retval);
}
static FORCEINLINE HRESULT IAutomaticUpdates_get_ServiceEnabled(IAutomaticUpdates* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_ServiceEnabled(This,retval);
}
static FORCEINLINE HRESULT IAutomaticUpdates_EnableService(IAutomaticUpdates* This) {
    return This->lpVtbl->EnableService(This);
}
#endif
#endif

#endif


#endif  /* __IAutomaticUpdates_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IWebProxy interface
 */
#ifndef __IWebProxy_INTERFACE_DEFINED__
#define __IWebProxy_INTERFACE_DEFINED__

DEFINE_GUID(IID_IWebProxy, 0x174c81fe, 0xaecd, 0x4dae, 0xb8,0xa0, 0x2c,0x63,0x18,0xdd,0x86,0xa8);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("174c81fe-aecd-4dae-b8a0-2c6318dd86a8")
IWebProxy : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Address(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Address(
        BSTR value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_BypassList(
        IStringCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_BypassList(
        IStringCollection *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_BypassProxyOnLocal(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_BypassProxyOnLocal(
        VARIANT_BOOL value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ReadOnly(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UserName(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_UserName(
        BSTR value) = 0;

    virtual HRESULT STDMETHODCALLTYPE SetPassword(
        BSTR value) = 0;

    virtual HRESULT STDMETHODCALLTYPE PromptForCredentials(
        IUnknown *parentWindow,
        BSTR title) = 0;

    virtual HRESULT STDMETHODCALLTYPE PromptForCredentialsFromHwnd(
        HWND parentWindow,
        BSTR title) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AutoDetect(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AutoDetect(
        VARIANT_BOOL value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IWebProxy, 0x174c81fe, 0xaecd, 0x4dae, 0xb8,0xa0, 0x2c,0x63,0x18,0xdd,0x86,0xa8)
#endif
#else
typedef struct IWebProxyVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IWebProxy methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Address)(
        IWebProxy *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *put_Address)(
        IWebProxy *This,
        BSTR value);

    HRESULT (STDMETHODCALLTYPE *get_BypassList)(
        IWebProxy *This,
        IStringCollection **retval);

    HRESULT (STDMETHODCALLTYPE *put_BypassList)(
        IWebProxy *This,
        IStringCollection *value);

    HRESULT (STDMETHODCALLTYPE *get_BypassProxyOnLocal)(
        IWebProxy *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *put_BypassProxyOnLocal)(
        IWebProxy *This,
        VARIANT_BOOL value);

    HRESULT (STDMETHODCALLTYPE *get_ReadOnly)(
        IWebProxy *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_UserName)(
        IWebProxy *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *put_UserName)(
        IWebProxy *This,
        BSTR value);

    HRESULT (STDMETHODCALLTYPE *SetPassword)(
        IWebProxy *This,
        BSTR value);

    HRESULT (STDMETHODCALLTYPE *PromptForCredentials)(
        IWebProxy *This,
        IUnknown *parentWindow,
        BSTR title);

    HRESULT (STDMETHODCALLTYPE *PromptForCredentialsFromHwnd)(
        IWebProxy *This,
        HWND parentWindow,
        BSTR title);

    HRESULT (STDMETHODCALLTYPE *get_AutoDetect)(
        IWebProxy *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *put_AutoDetect)(
        IWebProxy *This,
        VARIANT_BOOL value);

    END_INTERFACE
} IWebProxyVtbl;

interface IWebProxy {
    CONST_VTBL IWebProxyVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IWebProxy_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IWebProxy_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IWebProxy_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IWebProxy_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IWebProxy_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IWebProxy_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IWebProxy_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IWebProxy methods ***/
#define IWebProxy_get_Address(This,retval) (This)->lpVtbl->get_Address(This,retval)
#define IWebProxy_put_Address(This,value) (This)->lpVtbl->put_Address(This,value)
#define IWebProxy_get_BypassList(This,retval) (This)->lpVtbl->get_BypassList(This,retval)
#define IWebProxy_put_BypassList(This,value) (This)->lpVtbl->put_BypassList(This,value)
#define IWebProxy_get_BypassProxyOnLocal(This,retval) (This)->lpVtbl->get_BypassProxyOnLocal(This,retval)
#define IWebProxy_put_BypassProxyOnLocal(This,value) (This)->lpVtbl->put_BypassProxyOnLocal(This,value)
#define IWebProxy_get_ReadOnly(This,retval) (This)->lpVtbl->get_ReadOnly(This,retval)
#define IWebProxy_get_UserName(This,retval) (This)->lpVtbl->get_UserName(This,retval)
#define IWebProxy_put_UserName(This,value) (This)->lpVtbl->put_UserName(This,value)
#define IWebProxy_SetPassword(This,value) (This)->lpVtbl->SetPassword(This,value)
#define IWebProxy_PromptForCredentials(This,parentWindow,title) (This)->lpVtbl->PromptForCredentials(This,parentWindow,title)
#define IWebProxy_PromptForCredentialsFromHwnd(This,parentWindow,title) (This)->lpVtbl->PromptForCredentialsFromHwnd(This,parentWindow,title)
#define IWebProxy_get_AutoDetect(This,retval) (This)->lpVtbl->get_AutoDetect(This,retval)
#define IWebProxy_put_AutoDetect(This,value) (This)->lpVtbl->put_AutoDetect(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IWebProxy_QueryInterface(IWebProxy* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IWebProxy_AddRef(IWebProxy* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IWebProxy_Release(IWebProxy* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IWebProxy_GetTypeInfoCount(IWebProxy* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IWebProxy_GetTypeInfo(IWebProxy* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IWebProxy_GetIDsOfNames(IWebProxy* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IWebProxy_Invoke(IWebProxy* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IWebProxy methods ***/
static FORCEINLINE HRESULT IWebProxy_get_Address(IWebProxy* This,BSTR *retval) {
    return This->lpVtbl->get_Address(This,retval);
}
static FORCEINLINE HRESULT IWebProxy_put_Address(IWebProxy* This,BSTR value) {
    return This->lpVtbl->put_Address(This,value);
}
static FORCEINLINE HRESULT IWebProxy_get_BypassList(IWebProxy* This,IStringCollection **retval) {
    return This->lpVtbl->get_BypassList(This,retval);
}
static FORCEINLINE HRESULT IWebProxy_put_BypassList(IWebProxy* This,IStringCollection *value) {
    return This->lpVtbl->put_BypassList(This,value);
}
static FORCEINLINE HRESULT IWebProxy_get_BypassProxyOnLocal(IWebProxy* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_BypassProxyOnLocal(This,retval);
}
static FORCEINLINE HRESULT IWebProxy_put_BypassProxyOnLocal(IWebProxy* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_BypassProxyOnLocal(This,value);
}
static FORCEINLINE HRESULT IWebProxy_get_ReadOnly(IWebProxy* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_ReadOnly(This,retval);
}
static FORCEINLINE HRESULT IWebProxy_get_UserName(IWebProxy* This,BSTR *retval) {
    return This->lpVtbl->get_UserName(This,retval);
}
static FORCEINLINE HRESULT IWebProxy_put_UserName(IWebProxy* This,BSTR value) {
    return This->lpVtbl->put_UserName(This,value);
}
static FORCEINLINE HRESULT IWebProxy_SetPassword(IWebProxy* This,BSTR value) {
    return This->lpVtbl->SetPassword(This,value);
}
static FORCEINLINE HRESULT IWebProxy_PromptForCredentials(IWebProxy* This,IUnknown *parentWindow,BSTR title) {
    return This->lpVtbl->PromptForCredentials(This,parentWindow,title);
}
static FORCEINLINE HRESULT IWebProxy_PromptForCredentialsFromHwnd(IWebProxy* This,HWND parentWindow,BSTR title) {
    return This->lpVtbl->PromptForCredentialsFromHwnd(This,parentWindow,title);
}
static FORCEINLINE HRESULT IWebProxy_get_AutoDetect(IWebProxy* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_AutoDetect(This,retval);
}
static FORCEINLINE HRESULT IWebProxy_put_AutoDetect(IWebProxy* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_AutoDetect(This,value);
}
#endif
#endif

#endif


#endif  /* __IWebProxy_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdateSession interface
 */
#ifndef __IUpdateSession_INTERFACE_DEFINED__
#define __IUpdateSession_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateSession, 0x816858a4, 0x260d, 0x4260, 0x93,0x3a, 0x25,0x85,0xf1,0xab,0xc7,0x6b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("816858a4-260d-4260-933a-2585f1abc76b")
IUpdateSession : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_ClientApplicationID(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ClientApplicationID(
        BSTR value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ReadOnly(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_WebProxy(
        IWebProxy **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_WebProxy(
        IWebProxy *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateUpdateSearcher(
        IUpdateSearcher **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateUpdateDownloader(
        IUpdateDownloader **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateUpdateInstaller(
        IUpdateInstaller **retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateSession, 0x816858a4, 0x260d, 0x4260, 0x93,0x3a, 0x25,0x85,0xf1,0xab,0xc7,0x6b)
#endif
#else
typedef struct IUpdateSessionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdateSession methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ClientApplicationID)(
        IUpdateSession *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *put_ClientApplicationID)(
        IUpdateSession *This,
        BSTR value);

    HRESULT (STDMETHODCALLTYPE *get_ReadOnly)(
        IUpdateSession *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_WebProxy)(
        IUpdateSession *This,
        IWebProxy **retval);

    HRESULT (STDMETHODCALLTYPE *put_WebProxy)(
        IUpdateSession *This,
        IWebProxy *value);

    HRESULT (STDMETHODCALLTYPE *CreateUpdateSearcher)(
        IUpdateSession *This,
        IUpdateSearcher **retval);

    HRESULT (STDMETHODCALLTYPE *CreateUpdateDownloader)(
        IUpdateSession *This,
        IUpdateDownloader **retval);

    HRESULT (STDMETHODCALLTYPE *CreateUpdateInstaller)(
        IUpdateSession *This,
        IUpdateInstaller **retval);

    END_INTERFACE
} IUpdateSessionVtbl;

interface IUpdateSession {
    CONST_VTBL IUpdateSessionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateSession_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateSession_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateSession_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdateSession_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdateSession_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdateSession_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdateSession_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdateSession methods ***/
#define IUpdateSession_get_ClientApplicationID(This,retval) (This)->lpVtbl->get_ClientApplicationID(This,retval)
#define IUpdateSession_put_ClientApplicationID(This,value) (This)->lpVtbl->put_ClientApplicationID(This,value)
#define IUpdateSession_get_ReadOnly(This,retval) (This)->lpVtbl->get_ReadOnly(This,retval)
#define IUpdateSession_get_WebProxy(This,retval) (This)->lpVtbl->get_WebProxy(This,retval)
#define IUpdateSession_put_WebProxy(This,value) (This)->lpVtbl->put_WebProxy(This,value)
#define IUpdateSession_CreateUpdateSearcher(This,retval) (This)->lpVtbl->CreateUpdateSearcher(This,retval)
#define IUpdateSession_CreateUpdateDownloader(This,retval) (This)->lpVtbl->CreateUpdateDownloader(This,retval)
#define IUpdateSession_CreateUpdateInstaller(This,retval) (This)->lpVtbl->CreateUpdateInstaller(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateSession_QueryInterface(IUpdateSession* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateSession_AddRef(IUpdateSession* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateSession_Release(IUpdateSession* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdateSession_GetTypeInfoCount(IUpdateSession* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdateSession_GetTypeInfo(IUpdateSession* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdateSession_GetIDsOfNames(IUpdateSession* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdateSession_Invoke(IUpdateSession* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdateSession methods ***/
static FORCEINLINE HRESULT IUpdateSession_get_ClientApplicationID(IUpdateSession* This,BSTR *retval) {
    return This->lpVtbl->get_ClientApplicationID(This,retval);
}
static FORCEINLINE HRESULT IUpdateSession_put_ClientApplicationID(IUpdateSession* This,BSTR value) {
    return This->lpVtbl->put_ClientApplicationID(This,value);
}
static FORCEINLINE HRESULT IUpdateSession_get_ReadOnly(IUpdateSession* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_ReadOnly(This,retval);
}
static FORCEINLINE HRESULT IUpdateSession_get_WebProxy(IUpdateSession* This,IWebProxy **retval) {
    return This->lpVtbl->get_WebProxy(This,retval);
}
static FORCEINLINE HRESULT IUpdateSession_put_WebProxy(IUpdateSession* This,IWebProxy *value) {
    return This->lpVtbl->put_WebProxy(This,value);
}
static FORCEINLINE HRESULT IUpdateSession_CreateUpdateSearcher(IUpdateSession* This,IUpdateSearcher **retval) {
    return This->lpVtbl->CreateUpdateSearcher(This,retval);
}
static FORCEINLINE HRESULT IUpdateSession_CreateUpdateDownloader(IUpdateSession* This,IUpdateDownloader **retval) {
    return This->lpVtbl->CreateUpdateDownloader(This,retval);
}
static FORCEINLINE HRESULT IUpdateSession_CreateUpdateInstaller(IUpdateSession* This,IUpdateInstaller **retval) {
    return This->lpVtbl->CreateUpdateInstaller(This,retval);
}
#endif
#endif

#endif


#endif  /* __IUpdateSession_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IImageInformation interface
 */
#ifndef __IImageInformation_INTERFACE_DEFINED__
#define __IImageInformation_INTERFACE_DEFINED__

DEFINE_GUID(IID_IImageInformation, 0x7c907864, 0x346c, 0x4aeb, 0x8f,0x3f, 0x57,0xda,0x28,0x9f,0x96,0x9f);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7c907864-346c-4aeb-8f3f-57da289f969f")
IImageInformation : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_AltText(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Height(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Source(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Width(
        LONG *retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IImageInformation, 0x7c907864, 0x346c, 0x4aeb, 0x8f,0x3f, 0x57,0xda,0x28,0x9f,0x96,0x9f)
#endif
#else
typedef struct IImageInformationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IImageInformation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AltText)(
        IImageInformation *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_Height)(
        IImageInformation *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_Source)(
        IImageInformation *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_Width)(
        IImageInformation *This,
        LONG *retval);

    END_INTERFACE
} IImageInformationVtbl;

interface IImageInformation {
    CONST_VTBL IImageInformationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IImageInformation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IImageInformation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IImageInformation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IImageInformation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IImageInformation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IImageInformation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IImageInformation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IImageInformation methods ***/
#define IImageInformation_get_AltText(This,retval) (This)->lpVtbl->get_AltText(This,retval)
#define IImageInformation_get_Height(This,retval) (This)->lpVtbl->get_Height(This,retval)
#define IImageInformation_get_Source(This,retval) (This)->lpVtbl->get_Source(This,retval)
#define IImageInformation_get_Width(This,retval) (This)->lpVtbl->get_Width(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IImageInformation_QueryInterface(IImageInformation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IImageInformation_AddRef(IImageInformation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IImageInformation_Release(IImageInformation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IImageInformation_GetTypeInfoCount(IImageInformation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IImageInformation_GetTypeInfo(IImageInformation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IImageInformation_GetIDsOfNames(IImageInformation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IImageInformation_Invoke(IImageInformation* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IImageInformation methods ***/
static FORCEINLINE HRESULT IImageInformation_get_AltText(IImageInformation* This,BSTR *retval) {
    return This->lpVtbl->get_AltText(This,retval);
}
static FORCEINLINE HRESULT IImageInformation_get_Height(IImageInformation* This,LONG *retval) {
    return This->lpVtbl->get_Height(This,retval);
}
static FORCEINLINE HRESULT IImageInformation_get_Source(IImageInformation* This,BSTR *retval) {
    return This->lpVtbl->get_Source(This,retval);
}
static FORCEINLINE HRESULT IImageInformation_get_Width(IImageInformation* This,LONG *retval) {
    return This->lpVtbl->get_Width(This,retval);
}
#endif
#endif

#endif


#endif  /* __IImageInformation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICategory interface
 */
#ifndef __ICategory_INTERFACE_DEFINED__
#define __ICategory_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICategory, 0x81ddc1b8, 0x9d35, 0x47a6, 0xb4,0x71, 0x5b,0x80,0xf5,0x19,0x22,0x3b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("81ddc1b8-9d35-47a6-b471-5b80f519223b")
ICategory : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Name(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CategoryID(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Children(
        ICategoryCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Description(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Image(
        IImageInformation **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Order(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Parent(
        ICategory **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Type(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Updates(
        IUpdateCollection **retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICategory, 0x81ddc1b8, 0x9d35, 0x47a6, 0xb4,0x71, 0x5b,0x80,0xf5,0x19,0x22,0x3b)
#endif
#else
typedef struct ICategoryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ICategory methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        ICategory *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_CategoryID)(
        ICategory *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_Children)(
        ICategory *This,
        ICategoryCollection **retval);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        ICategory *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_Image)(
        ICategory *This,
        IImageInformation **retval);

    HRESULT (STDMETHODCALLTYPE *get_Order)(
        ICategory *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_Parent)(
        ICategory *This,
        ICategory **retval);

    HRESULT (STDMETHODCALLTYPE *get_Type)(
        ICategory *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_Updates)(
        ICategory *This,
        IUpdateCollection **retval);

    END_INTERFACE
} ICategoryVtbl;

interface ICategory {
    CONST_VTBL ICategoryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICategory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICategory_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICategory_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ICategory_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ICategory_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ICategory_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ICategory_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ICategory methods ***/
#define ICategory_get_Name(This,retval) (This)->lpVtbl->get_Name(This,retval)
#define ICategory_get_CategoryID(This,retval) (This)->lpVtbl->get_CategoryID(This,retval)
#define ICategory_get_Children(This,retval) (This)->lpVtbl->get_Children(This,retval)
#define ICategory_get_Description(This,retval) (This)->lpVtbl->get_Description(This,retval)
#define ICategory_get_Image(This,retval) (This)->lpVtbl->get_Image(This,retval)
#define ICategory_get_Order(This,retval) (This)->lpVtbl->get_Order(This,retval)
#define ICategory_get_Parent(This,retval) (This)->lpVtbl->get_Parent(This,retval)
#define ICategory_get_Type(This,retval) (This)->lpVtbl->get_Type(This,retval)
#define ICategory_get_Updates(This,retval) (This)->lpVtbl->get_Updates(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICategory_QueryInterface(ICategory* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICategory_AddRef(ICategory* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICategory_Release(ICategory* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ICategory_GetTypeInfoCount(ICategory* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ICategory_GetTypeInfo(ICategory* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ICategory_GetIDsOfNames(ICategory* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ICategory_Invoke(ICategory* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ICategory methods ***/
static FORCEINLINE HRESULT ICategory_get_Name(ICategory* This,BSTR *retval) {
    return This->lpVtbl->get_Name(This,retval);
}
static FORCEINLINE HRESULT ICategory_get_CategoryID(ICategory* This,BSTR *retval) {
    return This->lpVtbl->get_CategoryID(This,retval);
}
static FORCEINLINE HRESULT ICategory_get_Children(ICategory* This,ICategoryCollection **retval) {
    return This->lpVtbl->get_Children(This,retval);
}
static FORCEINLINE HRESULT ICategory_get_Description(ICategory* This,BSTR *retval) {
    return This->lpVtbl->get_Description(This,retval);
}
static FORCEINLINE HRESULT ICategory_get_Image(ICategory* This,IImageInformation **retval) {
    return This->lpVtbl->get_Image(This,retval);
}
static FORCEINLINE HRESULT ICategory_get_Order(ICategory* This,LONG *retval) {
    return This->lpVtbl->get_Order(This,retval);
}
static FORCEINLINE HRESULT ICategory_get_Parent(ICategory* This,ICategory **retval) {
    return This->lpVtbl->get_Parent(This,retval);
}
static FORCEINLINE HRESULT ICategory_get_Type(ICategory* This,BSTR *retval) {
    return This->lpVtbl->get_Type(This,retval);
}
static FORCEINLINE HRESULT ICategory_get_Updates(ICategory* This,IUpdateCollection **retval) {
    return This->lpVtbl->get_Updates(This,retval);
}
#endif
#endif

#endif


#endif  /* __ICategory_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ICategoryCollection interface
 */
#ifndef __ICategoryCollection_INTERFACE_DEFINED__
#define __ICategoryCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_ICategoryCollection, 0x3a56bfb8, 0x576c, 0x43f7, 0x93,0x35, 0xfe,0x48,0x38,0xfd,0x7e,0x37);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("3a56bfb8-576c-43f7-9335-fe4838fd7e37")
ICategoryCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG index,
        ICategory **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **retval) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ICategoryCollection, 0x3a56bfb8, 0x576c, 0x43f7, 0x93,0x35, 0xfe,0x48,0x38,0xfd,0x7e,0x37)
#endif
#else
typedef struct ICategoryCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ICategoryCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Item)(
        ICategoryCollection *This,
        LONG index,
        ICategory **retval);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        ICategoryCollection *This,
        IUnknown **retval);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        ICategoryCollection *This,
        LONG *retval);

    END_INTERFACE
} ICategoryCollectionVtbl;

interface ICategoryCollection {
    CONST_VTBL ICategoryCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ICategoryCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ICategoryCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ICategoryCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ICategoryCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ICategoryCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ICategoryCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ICategoryCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ICategoryCollection methods ***/
#define ICategoryCollection_get_Item(This,index,retval) (This)->lpVtbl->get_Item(This,index,retval)
#define ICategoryCollection_get__NewEnum(This,retval) (This)->lpVtbl->get__NewEnum(This,retval)
#define ICategoryCollection_get_Count(This,retval) (This)->lpVtbl->get_Count(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ICategoryCollection_QueryInterface(ICategoryCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ICategoryCollection_AddRef(ICategoryCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ICategoryCollection_Release(ICategoryCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ICategoryCollection_GetTypeInfoCount(ICategoryCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ICategoryCollection_GetTypeInfo(ICategoryCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ICategoryCollection_GetIDsOfNames(ICategoryCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ICategoryCollection_Invoke(ICategoryCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ICategoryCollection methods ***/
static FORCEINLINE HRESULT ICategoryCollection_get_Item(ICategoryCollection* This,LONG index,ICategory **retval) {
    return This->lpVtbl->get_Item(This,index,retval);
}
static FORCEINLINE HRESULT ICategoryCollection_get__NewEnum(ICategoryCollection* This,IUnknown **retval) {
    return This->lpVtbl->get__NewEnum(This,retval);
}
static FORCEINLINE HRESULT ICategoryCollection_get_Count(ICategoryCollection* This,LONG *retval) {
    return This->lpVtbl->get_Count(This,retval);
}
#endif
#endif

#endif


#endif  /* __ICategoryCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IStringCollection interface
 */
#ifndef __IStringCollection_INTERFACE_DEFINED__
#define __IStringCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IStringCollection, 0xeff90582, 0x2ddc, 0x480f, 0xa0,0x6d, 0x60,0xf3,0xfb,0xc3,0x62,0xc3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("eff90582-2ddc-480f-a06d-60f3fbc362c3")
IStringCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG index,
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Item(
        LONG index,
        BSTR value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **retval) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_ReadOnly(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        BSTR value,
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clear(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Copy(
        IStringCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE Insert(
        LONG index,
        BSTR value) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        LONG index) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IStringCollection, 0xeff90582, 0x2ddc, 0x480f, 0xa0,0x6d, 0x60,0xf3,0xfb,0xc3,0x62,0xc3)
#endif
#else
typedef struct IStringCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IStringCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IStringCollection *This,
        LONG index,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *put_Item)(
        IStringCollection *This,
        LONG index,
        BSTR value);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IStringCollection *This,
        IUnknown **retval);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IStringCollection *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_ReadOnly)(
        IStringCollection *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *Add)(
        IStringCollection *This,
        BSTR value,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        IStringCollection *This);

    HRESULT (STDMETHODCALLTYPE *Copy)(
        IStringCollection *This,
        IStringCollection **retval);

    HRESULT (STDMETHODCALLTYPE *Insert)(
        IStringCollection *This,
        LONG index,
        BSTR value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IStringCollection *This,
        LONG index);

    END_INTERFACE
} IStringCollectionVtbl;

interface IStringCollection {
    CONST_VTBL IStringCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IStringCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IStringCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IStringCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IStringCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IStringCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IStringCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IStringCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IStringCollection methods ***/
#define IStringCollection_get_Item(This,index,retval) (This)->lpVtbl->get_Item(This,index,retval)
#define IStringCollection_put_Item(This,index,value) (This)->lpVtbl->put_Item(This,index,value)
#define IStringCollection_get__NewEnum(This,retval) (This)->lpVtbl->get__NewEnum(This,retval)
#define IStringCollection_get_Count(This,retval) (This)->lpVtbl->get_Count(This,retval)
#define IStringCollection_get_ReadOnly(This,retval) (This)->lpVtbl->get_ReadOnly(This,retval)
#define IStringCollection_Add(This,value,retval) (This)->lpVtbl->Add(This,value,retval)
#define IStringCollection_Clear(This) (This)->lpVtbl->Clear(This)
#define IStringCollection_Copy(This,retval) (This)->lpVtbl->Copy(This,retval)
#define IStringCollection_Insert(This,index,value) (This)->lpVtbl->Insert(This,index,value)
#define IStringCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IStringCollection_QueryInterface(IStringCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IStringCollection_AddRef(IStringCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IStringCollection_Release(IStringCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IStringCollection_GetTypeInfoCount(IStringCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IStringCollection_GetTypeInfo(IStringCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IStringCollection_GetIDsOfNames(IStringCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IStringCollection_Invoke(IStringCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IStringCollection methods ***/
static FORCEINLINE HRESULT IStringCollection_get_Item(IStringCollection* This,LONG index,BSTR *retval) {
    return This->lpVtbl->get_Item(This,index,retval);
}
static FORCEINLINE HRESULT IStringCollection_put_Item(IStringCollection* This,LONG index,BSTR value) {
    return This->lpVtbl->put_Item(This,index,value);
}
static FORCEINLINE HRESULT IStringCollection_get__NewEnum(IStringCollection* This,IUnknown **retval) {
    return This->lpVtbl->get__NewEnum(This,retval);
}
static FORCEINLINE HRESULT IStringCollection_get_Count(IStringCollection* This,LONG *retval) {
    return This->lpVtbl->get_Count(This,retval);
}
static FORCEINLINE HRESULT IStringCollection_get_ReadOnly(IStringCollection* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_ReadOnly(This,retval);
}
static FORCEINLINE HRESULT IStringCollection_Add(IStringCollection* This,BSTR value,LONG *retval) {
    return This->lpVtbl->Add(This,value,retval);
}
static FORCEINLINE HRESULT IStringCollection_Clear(IStringCollection* This) {
    return This->lpVtbl->Clear(This);
}
static FORCEINLINE HRESULT IStringCollection_Copy(IStringCollection* This,IStringCollection **retval) {
    return This->lpVtbl->Copy(This,retval);
}
static FORCEINLINE HRESULT IStringCollection_Insert(IStringCollection* This,LONG index,BSTR value) {
    return This->lpVtbl->Insert(This,index,value);
}
static FORCEINLINE HRESULT IStringCollection_RemoveAt(IStringCollection* This,LONG index) {
    return This->lpVtbl->RemoveAt(This,index);
}
#endif
#endif

#endif


#endif  /* __IStringCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdateException interface
 */
#ifndef __IUpdateException_INTERFACE_DEFINED__
#define __IUpdateException_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateException, 0xa376dd5e, 0x09d4, 0x427f, 0xaf,0x7c, 0xfe,0xd5,0xb6,0xe1,0xc1,0xd6);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a376dd5e-09d4-427f-af7c-fed5b6e1c1d6")
IUpdateException : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Message(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HResult(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Context(
        UpdateExceptionContext *retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateException, 0xa376dd5e, 0x09d4, 0x427f, 0xaf,0x7c, 0xfe,0xd5,0xb6,0xe1,0xc1,0xd6)
#endif
#else
typedef struct IUpdateExceptionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdateException methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Message)(
        IUpdateException *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_HResult)(
        IUpdateException *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_Context)(
        IUpdateException *This,
        UpdateExceptionContext *retval);

    END_INTERFACE
} IUpdateExceptionVtbl;

interface IUpdateException {
    CONST_VTBL IUpdateExceptionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateException_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateException_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateException_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdateException_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdateException_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdateException_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdateException_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdateException methods ***/
#define IUpdateException_get_Message(This,retval) (This)->lpVtbl->get_Message(This,retval)
#define IUpdateException_get_HResult(This,retval) (This)->lpVtbl->get_HResult(This,retval)
#define IUpdateException_get_Context(This,retval) (This)->lpVtbl->get_Context(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateException_QueryInterface(IUpdateException* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateException_AddRef(IUpdateException* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateException_Release(IUpdateException* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdateException_GetTypeInfoCount(IUpdateException* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdateException_GetTypeInfo(IUpdateException* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdateException_GetIDsOfNames(IUpdateException* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdateException_Invoke(IUpdateException* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdateException methods ***/
static FORCEINLINE HRESULT IUpdateException_get_Message(IUpdateException* This,BSTR *retval) {
    return This->lpVtbl->get_Message(This,retval);
}
static FORCEINLINE HRESULT IUpdateException_get_HResult(IUpdateException* This,LONG *retval) {
    return This->lpVtbl->get_HResult(This,retval);
}
static FORCEINLINE HRESULT IUpdateException_get_Context(IUpdateException* This,UpdateExceptionContext *retval) {
    return This->lpVtbl->get_Context(This,retval);
}
#endif
#endif

#endif


#endif  /* __IUpdateException_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdateExceptionCollection interface
 */
#ifndef __IUpdateExceptionCollection_INTERFACE_DEFINED__
#define __IUpdateExceptionCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateExceptionCollection, 0x503626a3, 0x8e14, 0x4729, 0x93,0x55, 0x0f,0xe6,0x64,0xbd,0x23,0x21);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("503626a3-8e14-4729-9355-0fe664bd2321")
IUpdateExceptionCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG index,
        IUpdateException **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **retval) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateExceptionCollection, 0x503626a3, 0x8e14, 0x4729, 0x93,0x55, 0x0f,0xe6,0x64,0xbd,0x23,0x21)
#endif
#else
typedef struct IUpdateExceptionCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdateExceptionCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IUpdateExceptionCollection *This,
        LONG index,
        IUpdateException **retval);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IUpdateExceptionCollection *This,
        IUnknown **retval);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IUpdateExceptionCollection *This,
        LONG *retval);

    END_INTERFACE
} IUpdateExceptionCollectionVtbl;

interface IUpdateExceptionCollection {
    CONST_VTBL IUpdateExceptionCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateExceptionCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateExceptionCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateExceptionCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdateExceptionCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdateExceptionCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdateExceptionCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdateExceptionCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdateExceptionCollection methods ***/
#define IUpdateExceptionCollection_get_Item(This,index,retval) (This)->lpVtbl->get_Item(This,index,retval)
#define IUpdateExceptionCollection_get__NewEnum(This,retval) (This)->lpVtbl->get__NewEnum(This,retval)
#define IUpdateExceptionCollection_get_Count(This,retval) (This)->lpVtbl->get_Count(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateExceptionCollection_QueryInterface(IUpdateExceptionCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateExceptionCollection_AddRef(IUpdateExceptionCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateExceptionCollection_Release(IUpdateExceptionCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdateExceptionCollection_GetTypeInfoCount(IUpdateExceptionCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdateExceptionCollection_GetTypeInfo(IUpdateExceptionCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdateExceptionCollection_GetIDsOfNames(IUpdateExceptionCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdateExceptionCollection_Invoke(IUpdateExceptionCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdateExceptionCollection methods ***/
static FORCEINLINE HRESULT IUpdateExceptionCollection_get_Item(IUpdateExceptionCollection* This,LONG index,IUpdateException **retval) {
    return This->lpVtbl->get_Item(This,index,retval);
}
static FORCEINLINE HRESULT IUpdateExceptionCollection_get__NewEnum(IUpdateExceptionCollection* This,IUnknown **retval) {
    return This->lpVtbl->get__NewEnum(This,retval);
}
static FORCEINLINE HRESULT IUpdateExceptionCollection_get_Count(IUpdateExceptionCollection* This,LONG *retval) {
    return This->lpVtbl->get_Count(This,retval);
}
#endif
#endif

#endif


#endif  /* __IUpdateExceptionCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdateIdentity interface
 */
#ifndef __IUpdateIdentity_INTERFACE_DEFINED__
#define __IUpdateIdentity_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateIdentity, 0x46297823, 0x9940, 0x4c09, 0xae,0xd9, 0xcd,0x3e,0xa6,0xd0,0x59,0x68);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("46297823-9940-4c09-aed9-cd3ea6d05968")
IUpdateIdentity : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_RevisionNumber(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UpdateID(
        BSTR *retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateIdentity, 0x46297823, 0x9940, 0x4c09, 0xae,0xd9, 0xcd,0x3e,0xa6,0xd0,0x59,0x68)
#endif
#else
typedef struct IUpdateIdentityVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdateIdentity methods ***/
    HRESULT (STDMETHODCALLTYPE *get_RevisionNumber)(
        IUpdateIdentity *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_UpdateID)(
        IUpdateIdentity *This,
        BSTR *retval);

    END_INTERFACE
} IUpdateIdentityVtbl;

interface IUpdateIdentity {
    CONST_VTBL IUpdateIdentityVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateIdentity_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateIdentity_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateIdentity_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdateIdentity_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdateIdentity_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdateIdentity_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdateIdentity_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdateIdentity methods ***/
#define IUpdateIdentity_get_RevisionNumber(This,retval) (This)->lpVtbl->get_RevisionNumber(This,retval)
#define IUpdateIdentity_get_UpdateID(This,retval) (This)->lpVtbl->get_UpdateID(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateIdentity_QueryInterface(IUpdateIdentity* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateIdentity_AddRef(IUpdateIdentity* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateIdentity_Release(IUpdateIdentity* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdateIdentity_GetTypeInfoCount(IUpdateIdentity* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdateIdentity_GetTypeInfo(IUpdateIdentity* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdateIdentity_GetIDsOfNames(IUpdateIdentity* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdateIdentity_Invoke(IUpdateIdentity* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdateIdentity methods ***/
static FORCEINLINE HRESULT IUpdateIdentity_get_RevisionNumber(IUpdateIdentity* This,LONG *retval) {
    return This->lpVtbl->get_RevisionNumber(This,retval);
}
static FORCEINLINE HRESULT IUpdateIdentity_get_UpdateID(IUpdateIdentity* This,BSTR *retval) {
    return This->lpVtbl->get_UpdateID(This,retval);
}
#endif
#endif

#endif


#endif  /* __IUpdateIdentity_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInstallationBehavior interface
 */
#ifndef __IInstallationBehavior_INTERFACE_DEFINED__
#define __IInstallationBehavior_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInstallationBehavior, 0xd9a59339, 0xe245, 0x4dbd, 0x96,0x86, 0x4d,0x57,0x63,0xe3,0x96,0x24);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d9a59339-e245-4dbd-9686-4d5763e39624")
IInstallationBehavior : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_CanRequestUserInput(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Impact(
        InstallationImpact *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RebootBehavior(
        InstallationRebootBehavior *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RequiresNetworkConnectivity(
        VARIANT_BOOL *retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInstallationBehavior, 0xd9a59339, 0xe245, 0x4dbd, 0x96,0x86, 0x4d,0x57,0x63,0xe3,0x96,0x24)
#endif
#else
typedef struct IInstallationBehaviorVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IInstallationBehavior methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CanRequestUserInput)(
        IInstallationBehavior *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_Impact)(
        IInstallationBehavior *This,
        InstallationImpact *retval);

    HRESULT (STDMETHODCALLTYPE *get_RebootBehavior)(
        IInstallationBehavior *This,
        InstallationRebootBehavior *retval);

    HRESULT (STDMETHODCALLTYPE *get_RequiresNetworkConnectivity)(
        IInstallationBehavior *This,
        VARIANT_BOOL *retval);

    END_INTERFACE
} IInstallationBehaviorVtbl;

interface IInstallationBehavior {
    CONST_VTBL IInstallationBehaviorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInstallationBehavior_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInstallationBehavior_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInstallationBehavior_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInstallationBehavior_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInstallationBehavior_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInstallationBehavior_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInstallationBehavior_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInstallationBehavior methods ***/
#define IInstallationBehavior_get_CanRequestUserInput(This,retval) (This)->lpVtbl->get_CanRequestUserInput(This,retval)
#define IInstallationBehavior_get_Impact(This,retval) (This)->lpVtbl->get_Impact(This,retval)
#define IInstallationBehavior_get_RebootBehavior(This,retval) (This)->lpVtbl->get_RebootBehavior(This,retval)
#define IInstallationBehavior_get_RequiresNetworkConnectivity(This,retval) (This)->lpVtbl->get_RequiresNetworkConnectivity(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInstallationBehavior_QueryInterface(IInstallationBehavior* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInstallationBehavior_AddRef(IInstallationBehavior* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInstallationBehavior_Release(IInstallationBehavior* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInstallationBehavior_GetTypeInfoCount(IInstallationBehavior* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInstallationBehavior_GetTypeInfo(IInstallationBehavior* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInstallationBehavior_GetIDsOfNames(IInstallationBehavior* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInstallationBehavior_Invoke(IInstallationBehavior* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInstallationBehavior methods ***/
static FORCEINLINE HRESULT IInstallationBehavior_get_CanRequestUserInput(IInstallationBehavior* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_CanRequestUserInput(This,retval);
}
static FORCEINLINE HRESULT IInstallationBehavior_get_Impact(IInstallationBehavior* This,InstallationImpact *retval) {
    return This->lpVtbl->get_Impact(This,retval);
}
static FORCEINLINE HRESULT IInstallationBehavior_get_RebootBehavior(IInstallationBehavior* This,InstallationRebootBehavior *retval) {
    return This->lpVtbl->get_RebootBehavior(This,retval);
}
static FORCEINLINE HRESULT IInstallationBehavior_get_RequiresNetworkConnectivity(IInstallationBehavior* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_RequiresNetworkConnectivity(This,retval);
}
#endif
#endif

#endif


#endif  /* __IInstallationBehavior_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdateDownloadContent interface
 */
#ifndef __IUpdateDownloadContent_INTERFACE_DEFINED__
#define __IUpdateDownloadContent_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateDownloadContent, 0x54a2cb2d, 0x9a0c, 0x48b6, 0x8a,0x50, 0x9a,0xbb,0x69,0xee,0x2d,0x02);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("54a2cb2d-9a0c-48b6-8a50-9abb69ee2d02")
IUpdateDownloadContent : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_DownloadUrl(
        BSTR *retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateDownloadContent, 0x54a2cb2d, 0x9a0c, 0x48b6, 0x8a,0x50, 0x9a,0xbb,0x69,0xee,0x2d,0x02)
#endif
#else
typedef struct IUpdateDownloadContentVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdateDownloadContent methods ***/
    HRESULT (STDMETHODCALLTYPE *get_DownloadUrl)(
        IUpdateDownloadContent *This,
        BSTR *retval);

    END_INTERFACE
} IUpdateDownloadContentVtbl;

interface IUpdateDownloadContent {
    CONST_VTBL IUpdateDownloadContentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateDownloadContent_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateDownloadContent_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateDownloadContent_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdateDownloadContent_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdateDownloadContent_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdateDownloadContent_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdateDownloadContent_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdateDownloadContent methods ***/
#define IUpdateDownloadContent_get_DownloadUrl(This,retval) (This)->lpVtbl->get_DownloadUrl(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateDownloadContent_QueryInterface(IUpdateDownloadContent* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateDownloadContent_AddRef(IUpdateDownloadContent* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateDownloadContent_Release(IUpdateDownloadContent* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdateDownloadContent_GetTypeInfoCount(IUpdateDownloadContent* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdateDownloadContent_GetTypeInfo(IUpdateDownloadContent* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdateDownloadContent_GetIDsOfNames(IUpdateDownloadContent* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdateDownloadContent_Invoke(IUpdateDownloadContent* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdateDownloadContent methods ***/
static FORCEINLINE HRESULT IUpdateDownloadContent_get_DownloadUrl(IUpdateDownloadContent* This,BSTR *retval) {
    return This->lpVtbl->get_DownloadUrl(This,retval);
}
#endif
#endif

#endif


#endif  /* __IUpdateDownloadContent_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdateDownloadContentCollection interface
 */
#ifndef __IUpdateDownloadContentCollection_INTERFACE_DEFINED__
#define __IUpdateDownloadContentCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateDownloadContentCollection, 0xbc5513c8, 0xb3b8, 0x4bf7, 0xa4,0xd4, 0x36,0x1c,0x0d,0x8c,0x88,0xba);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bc5513c8-b3b8-4bf7-a4d4-361c0d8c88ba")
IUpdateDownloadContentCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG index,
        IUpdateDownloadContent **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **retval) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateDownloadContentCollection, 0xbc5513c8, 0xb3b8, 0x4bf7, 0xa4,0xd4, 0x36,0x1c,0x0d,0x8c,0x88,0xba)
#endif
#else
typedef struct IUpdateDownloadContentCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdateDownloadContentCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IUpdateDownloadContentCollection *This,
        LONG index,
        IUpdateDownloadContent **retval);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IUpdateDownloadContentCollection *This,
        IUnknown **retval);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IUpdateDownloadContentCollection *This,
        LONG *retval);

    END_INTERFACE
} IUpdateDownloadContentCollectionVtbl;

interface IUpdateDownloadContentCollection {
    CONST_VTBL IUpdateDownloadContentCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateDownloadContentCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateDownloadContentCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateDownloadContentCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdateDownloadContentCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdateDownloadContentCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdateDownloadContentCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdateDownloadContentCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdateDownloadContentCollection methods ***/
#define IUpdateDownloadContentCollection_get_Item(This,index,retval) (This)->lpVtbl->get_Item(This,index,retval)
#define IUpdateDownloadContentCollection_get__NewEnum(This,retval) (This)->lpVtbl->get__NewEnum(This,retval)
#define IUpdateDownloadContentCollection_get_Count(This,retval) (This)->lpVtbl->get_Count(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateDownloadContentCollection_QueryInterface(IUpdateDownloadContentCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateDownloadContentCollection_AddRef(IUpdateDownloadContentCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateDownloadContentCollection_Release(IUpdateDownloadContentCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdateDownloadContentCollection_GetTypeInfoCount(IUpdateDownloadContentCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdateDownloadContentCollection_GetTypeInfo(IUpdateDownloadContentCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdateDownloadContentCollection_GetIDsOfNames(IUpdateDownloadContentCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdateDownloadContentCollection_Invoke(IUpdateDownloadContentCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdateDownloadContentCollection methods ***/
static FORCEINLINE HRESULT IUpdateDownloadContentCollection_get_Item(IUpdateDownloadContentCollection* This,LONG index,IUpdateDownloadContent **retval) {
    return This->lpVtbl->get_Item(This,index,retval);
}
static FORCEINLINE HRESULT IUpdateDownloadContentCollection_get__NewEnum(IUpdateDownloadContentCollection* This,IUnknown **retval) {
    return This->lpVtbl->get__NewEnum(This,retval);
}
static FORCEINLINE HRESULT IUpdateDownloadContentCollection_get_Count(IUpdateDownloadContentCollection* This,LONG *retval) {
    return This->lpVtbl->get_Count(This,retval);
}
#endif
#endif

#endif


#endif  /* __IUpdateDownloadContentCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdate interface
 */
#ifndef __IUpdate_INTERFACE_DEFINED__
#define __IUpdate_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdate, 0x6a92b07a, 0xd821, 0x4682, 0xb4,0x23, 0x5c,0x80,0x50,0x22,0xcc,0x4d);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("6a92b07a-d821-4682-b423-5c805022cc4d")
IUpdate : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Title(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AutoSelectOnWebSites(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_BundledUpdates(
        IUpdateCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CanRequireSource(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Categories(
        ICategoryCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Deadline(
        VARIANT *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DeltaCompressedContentAvailable(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DeltaCompressedContentPreferred(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Description(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_EulaAccepted(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_EulaText(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HandlerID(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Identity(
        IUpdateIdentity **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Image(
        IImageInformation **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_InstallationBehavior(
        IInstallationBehavior **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsBeta(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsDownloaded(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsHidden(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_IsHidden(
        VARIANT_BOOL value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsInstalled(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsMandatory(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsUninstallable(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Languages(
        IStringCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_LastDeploymentChangeTime(
        DATE *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MaxDownloadSize(
        DECIMAL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MinDownloadSize(
        DECIMAL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MoreInfoUrls(
        IStringCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_MsrcSeverity(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RecommendedCpuSpeed(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RecommendedHardDiskSpace(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RecommendedMemory(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ReleaseNotes(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SecurityBulletinIDs(
        IStringCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SupersededUpdateIDs(
        IStringCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SupportUrl(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Type(
        UpdateType *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UninstallationNotes(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UninstallationBehavior(
        IInstallationBehavior **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UninstallationSteps(
        IStringCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_KBArticleIDs(
        IStringCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE AcceptEula(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DeploymentAction(
        DeploymentAction *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE CopyFromCache(
        BSTR path,
        VARIANT_BOOL toExtractCabFiles) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DownloadPriority(
        DownloadPriority *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_DownloadContents(
        IUpdateDownloadContentCollection **retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdate, 0x6a92b07a, 0xd821, 0x4682, 0xb4,0x23, 0x5c,0x80,0x50,0x22,0xcc,0x4d)
#endif
#else
typedef struct IUpdateVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdate methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Title)(
        IUpdate *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_AutoSelectOnWebSites)(
        IUpdate *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_BundledUpdates)(
        IUpdate *This,
        IUpdateCollection **retval);

    HRESULT (STDMETHODCALLTYPE *get_CanRequireSource)(
        IUpdate *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_Categories)(
        IUpdate *This,
        ICategoryCollection **retval);

    HRESULT (STDMETHODCALLTYPE *get_Deadline)(
        IUpdate *This,
        VARIANT *retval);

    HRESULT (STDMETHODCALLTYPE *get_DeltaCompressedContentAvailable)(
        IUpdate *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_DeltaCompressedContentPreferred)(
        IUpdate *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IUpdate *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_EulaAccepted)(
        IUpdate *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_EulaText)(
        IUpdate *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_HandlerID)(
        IUpdate *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_Identity)(
        IUpdate *This,
        IUpdateIdentity **retval);

    HRESULT (STDMETHODCALLTYPE *get_Image)(
        IUpdate *This,
        IImageInformation **retval);

    HRESULT (STDMETHODCALLTYPE *get_InstallationBehavior)(
        IUpdate *This,
        IInstallationBehavior **retval);

    HRESULT (STDMETHODCALLTYPE *get_IsBeta)(
        IUpdate *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_IsDownloaded)(
        IUpdate *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_IsHidden)(
        IUpdate *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *put_IsHidden)(
        IUpdate *This,
        VARIANT_BOOL value);

    HRESULT (STDMETHODCALLTYPE *get_IsInstalled)(
        IUpdate *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_IsMandatory)(
        IUpdate *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_IsUninstallable)(
        IUpdate *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_Languages)(
        IUpdate *This,
        IStringCollection **retval);

    HRESULT (STDMETHODCALLTYPE *get_LastDeploymentChangeTime)(
        IUpdate *This,
        DATE *retval);

    HRESULT (STDMETHODCALLTYPE *get_MaxDownloadSize)(
        IUpdate *This,
        DECIMAL *retval);

    HRESULT (STDMETHODCALLTYPE *get_MinDownloadSize)(
        IUpdate *This,
        DECIMAL *retval);

    HRESULT (STDMETHODCALLTYPE *get_MoreInfoUrls)(
        IUpdate *This,
        IStringCollection **retval);

    HRESULT (STDMETHODCALLTYPE *get_MsrcSeverity)(
        IUpdate *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_RecommendedCpuSpeed)(
        IUpdate *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_RecommendedHardDiskSpace)(
        IUpdate *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_RecommendedMemory)(
        IUpdate *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_ReleaseNotes)(
        IUpdate *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_SecurityBulletinIDs)(
        IUpdate *This,
        IStringCollection **retval);

    HRESULT (STDMETHODCALLTYPE *get_SupersededUpdateIDs)(
        IUpdate *This,
        IStringCollection **retval);

    HRESULT (STDMETHODCALLTYPE *get_SupportUrl)(
        IUpdate *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_Type)(
        IUpdate *This,
        UpdateType *retval);

    HRESULT (STDMETHODCALLTYPE *get_UninstallationNotes)(
        IUpdate *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_UninstallationBehavior)(
        IUpdate *This,
        IInstallationBehavior **retval);

    HRESULT (STDMETHODCALLTYPE *get_UninstallationSteps)(
        IUpdate *This,
        IStringCollection **retval);

    HRESULT (STDMETHODCALLTYPE *get_KBArticleIDs)(
        IUpdate *This,
        IStringCollection **retval);

    HRESULT (STDMETHODCALLTYPE *AcceptEula)(
        IUpdate *This);

    HRESULT (STDMETHODCALLTYPE *get_DeploymentAction)(
        IUpdate *This,
        DeploymentAction *retval);

    HRESULT (STDMETHODCALLTYPE *CopyFromCache)(
        IUpdate *This,
        BSTR path,
        VARIANT_BOOL toExtractCabFiles);

    HRESULT (STDMETHODCALLTYPE *get_DownloadPriority)(
        IUpdate *This,
        DownloadPriority *retval);

    HRESULT (STDMETHODCALLTYPE *get_DownloadContents)(
        IUpdate *This,
        IUpdateDownloadContentCollection **retval);

    END_INTERFACE
} IUpdateVtbl;

interface IUpdate {
    CONST_VTBL IUpdateVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdate_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdate_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdate_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdate_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdate_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdate_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdate_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdate methods ***/
#define IUpdate_get_Title(This,retval) (This)->lpVtbl->get_Title(This,retval)
#define IUpdate_get_AutoSelectOnWebSites(This,retval) (This)->lpVtbl->get_AutoSelectOnWebSites(This,retval)
#define IUpdate_get_BundledUpdates(This,retval) (This)->lpVtbl->get_BundledUpdates(This,retval)
#define IUpdate_get_CanRequireSource(This,retval) (This)->lpVtbl->get_CanRequireSource(This,retval)
#define IUpdate_get_Categories(This,retval) (This)->lpVtbl->get_Categories(This,retval)
#define IUpdate_get_Deadline(This,retval) (This)->lpVtbl->get_Deadline(This,retval)
#define IUpdate_get_DeltaCompressedContentAvailable(This,retval) (This)->lpVtbl->get_DeltaCompressedContentAvailable(This,retval)
#define IUpdate_get_DeltaCompressedContentPreferred(This,retval) (This)->lpVtbl->get_DeltaCompressedContentPreferred(This,retval)
#define IUpdate_get_Description(This,retval) (This)->lpVtbl->get_Description(This,retval)
#define IUpdate_get_EulaAccepted(This,retval) (This)->lpVtbl->get_EulaAccepted(This,retval)
#define IUpdate_get_EulaText(This,retval) (This)->lpVtbl->get_EulaText(This,retval)
#define IUpdate_get_HandlerID(This,retval) (This)->lpVtbl->get_HandlerID(This,retval)
#define IUpdate_get_Identity(This,retval) (This)->lpVtbl->get_Identity(This,retval)
#define IUpdate_get_Image(This,retval) (This)->lpVtbl->get_Image(This,retval)
#define IUpdate_get_InstallationBehavior(This,retval) (This)->lpVtbl->get_InstallationBehavior(This,retval)
#define IUpdate_get_IsBeta(This,retval) (This)->lpVtbl->get_IsBeta(This,retval)
#define IUpdate_get_IsDownloaded(This,retval) (This)->lpVtbl->get_IsDownloaded(This,retval)
#define IUpdate_get_IsHidden(This,retval) (This)->lpVtbl->get_IsHidden(This,retval)
#define IUpdate_put_IsHidden(This,value) (This)->lpVtbl->put_IsHidden(This,value)
#define IUpdate_get_IsInstalled(This,retval) (This)->lpVtbl->get_IsInstalled(This,retval)
#define IUpdate_get_IsMandatory(This,retval) (This)->lpVtbl->get_IsMandatory(This,retval)
#define IUpdate_get_IsUninstallable(This,retval) (This)->lpVtbl->get_IsUninstallable(This,retval)
#define IUpdate_get_Languages(This,retval) (This)->lpVtbl->get_Languages(This,retval)
#define IUpdate_get_LastDeploymentChangeTime(This,retval) (This)->lpVtbl->get_LastDeploymentChangeTime(This,retval)
#define IUpdate_get_MaxDownloadSize(This,retval) (This)->lpVtbl->get_MaxDownloadSize(This,retval)
#define IUpdate_get_MinDownloadSize(This,retval) (This)->lpVtbl->get_MinDownloadSize(This,retval)
#define IUpdate_get_MoreInfoUrls(This,retval) (This)->lpVtbl->get_MoreInfoUrls(This,retval)
#define IUpdate_get_MsrcSeverity(This,retval) (This)->lpVtbl->get_MsrcSeverity(This,retval)
#define IUpdate_get_RecommendedCpuSpeed(This,retval) (This)->lpVtbl->get_RecommendedCpuSpeed(This,retval)
#define IUpdate_get_RecommendedHardDiskSpace(This,retval) (This)->lpVtbl->get_RecommendedHardDiskSpace(This,retval)
#define IUpdate_get_RecommendedMemory(This,retval) (This)->lpVtbl->get_RecommendedMemory(This,retval)
#define IUpdate_get_ReleaseNotes(This,retval) (This)->lpVtbl->get_ReleaseNotes(This,retval)
#define IUpdate_get_SecurityBulletinIDs(This,retval) (This)->lpVtbl->get_SecurityBulletinIDs(This,retval)
#define IUpdate_get_SupersededUpdateIDs(This,retval) (This)->lpVtbl->get_SupersededUpdateIDs(This,retval)
#define IUpdate_get_SupportUrl(This,retval) (This)->lpVtbl->get_SupportUrl(This,retval)
#define IUpdate_get_Type(This,retval) (This)->lpVtbl->get_Type(This,retval)
#define IUpdate_get_UninstallationNotes(This,retval) (This)->lpVtbl->get_UninstallationNotes(This,retval)
#define IUpdate_get_UninstallationBehavior(This,retval) (This)->lpVtbl->get_UninstallationBehavior(This,retval)
#define IUpdate_get_UninstallationSteps(This,retval) (This)->lpVtbl->get_UninstallationSteps(This,retval)
#define IUpdate_get_KBArticleIDs(This,retval) (This)->lpVtbl->get_KBArticleIDs(This,retval)
#define IUpdate_AcceptEula(This) (This)->lpVtbl->AcceptEula(This)
#define IUpdate_get_DeploymentAction(This,retval) (This)->lpVtbl->get_DeploymentAction(This,retval)
#define IUpdate_CopyFromCache(This,path,toExtractCabFiles) (This)->lpVtbl->CopyFromCache(This,path,toExtractCabFiles)
#define IUpdate_get_DownloadPriority(This,retval) (This)->lpVtbl->get_DownloadPriority(This,retval)
#define IUpdate_get_DownloadContents(This,retval) (This)->lpVtbl->get_DownloadContents(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdate_QueryInterface(IUpdate* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdate_AddRef(IUpdate* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdate_Release(IUpdate* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdate_GetTypeInfoCount(IUpdate* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdate_GetTypeInfo(IUpdate* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdate_GetIDsOfNames(IUpdate* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdate_Invoke(IUpdate* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdate methods ***/
static FORCEINLINE HRESULT IUpdate_get_Title(IUpdate* This,BSTR *retval) {
    return This->lpVtbl->get_Title(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_AutoSelectOnWebSites(IUpdate* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_AutoSelectOnWebSites(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_BundledUpdates(IUpdate* This,IUpdateCollection **retval) {
    return This->lpVtbl->get_BundledUpdates(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_CanRequireSource(IUpdate* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_CanRequireSource(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_Categories(IUpdate* This,ICategoryCollection **retval) {
    return This->lpVtbl->get_Categories(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_Deadline(IUpdate* This,VARIANT *retval) {
    return This->lpVtbl->get_Deadline(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_DeltaCompressedContentAvailable(IUpdate* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_DeltaCompressedContentAvailable(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_DeltaCompressedContentPreferred(IUpdate* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_DeltaCompressedContentPreferred(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_Description(IUpdate* This,BSTR *retval) {
    return This->lpVtbl->get_Description(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_EulaAccepted(IUpdate* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_EulaAccepted(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_EulaText(IUpdate* This,BSTR *retval) {
    return This->lpVtbl->get_EulaText(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_HandlerID(IUpdate* This,BSTR *retval) {
    return This->lpVtbl->get_HandlerID(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_Identity(IUpdate* This,IUpdateIdentity **retval) {
    return This->lpVtbl->get_Identity(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_Image(IUpdate* This,IImageInformation **retval) {
    return This->lpVtbl->get_Image(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_InstallationBehavior(IUpdate* This,IInstallationBehavior **retval) {
    return This->lpVtbl->get_InstallationBehavior(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_IsBeta(IUpdate* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_IsBeta(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_IsDownloaded(IUpdate* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_IsDownloaded(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_IsHidden(IUpdate* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_IsHidden(This,retval);
}
static FORCEINLINE HRESULT IUpdate_put_IsHidden(IUpdate* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_IsHidden(This,value);
}
static FORCEINLINE HRESULT IUpdate_get_IsInstalled(IUpdate* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_IsInstalled(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_IsMandatory(IUpdate* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_IsMandatory(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_IsUninstallable(IUpdate* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_IsUninstallable(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_Languages(IUpdate* This,IStringCollection **retval) {
    return This->lpVtbl->get_Languages(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_LastDeploymentChangeTime(IUpdate* This,DATE *retval) {
    return This->lpVtbl->get_LastDeploymentChangeTime(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_MaxDownloadSize(IUpdate* This,DECIMAL *retval) {
    return This->lpVtbl->get_MaxDownloadSize(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_MinDownloadSize(IUpdate* This,DECIMAL *retval) {
    return This->lpVtbl->get_MinDownloadSize(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_MoreInfoUrls(IUpdate* This,IStringCollection **retval) {
    return This->lpVtbl->get_MoreInfoUrls(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_MsrcSeverity(IUpdate* This,BSTR *retval) {
    return This->lpVtbl->get_MsrcSeverity(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_RecommendedCpuSpeed(IUpdate* This,LONG *retval) {
    return This->lpVtbl->get_RecommendedCpuSpeed(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_RecommendedHardDiskSpace(IUpdate* This,LONG *retval) {
    return This->lpVtbl->get_RecommendedHardDiskSpace(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_RecommendedMemory(IUpdate* This,LONG *retval) {
    return This->lpVtbl->get_RecommendedMemory(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_ReleaseNotes(IUpdate* This,BSTR *retval) {
    return This->lpVtbl->get_ReleaseNotes(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_SecurityBulletinIDs(IUpdate* This,IStringCollection **retval) {
    return This->lpVtbl->get_SecurityBulletinIDs(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_SupersededUpdateIDs(IUpdate* This,IStringCollection **retval) {
    return This->lpVtbl->get_SupersededUpdateIDs(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_SupportUrl(IUpdate* This,BSTR *retval) {
    return This->lpVtbl->get_SupportUrl(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_Type(IUpdate* This,UpdateType *retval) {
    return This->lpVtbl->get_Type(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_UninstallationNotes(IUpdate* This,BSTR *retval) {
    return This->lpVtbl->get_UninstallationNotes(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_UninstallationBehavior(IUpdate* This,IInstallationBehavior **retval) {
    return This->lpVtbl->get_UninstallationBehavior(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_UninstallationSteps(IUpdate* This,IStringCollection **retval) {
    return This->lpVtbl->get_UninstallationSteps(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_KBArticleIDs(IUpdate* This,IStringCollection **retval) {
    return This->lpVtbl->get_KBArticleIDs(This,retval);
}
static FORCEINLINE HRESULT IUpdate_AcceptEula(IUpdate* This) {
    return This->lpVtbl->AcceptEula(This);
}
static FORCEINLINE HRESULT IUpdate_get_DeploymentAction(IUpdate* This,DeploymentAction *retval) {
    return This->lpVtbl->get_DeploymentAction(This,retval);
}
static FORCEINLINE HRESULT IUpdate_CopyFromCache(IUpdate* This,BSTR path,VARIANT_BOOL toExtractCabFiles) {
    return This->lpVtbl->CopyFromCache(This,path,toExtractCabFiles);
}
static FORCEINLINE HRESULT IUpdate_get_DownloadPriority(IUpdate* This,DownloadPriority *retval) {
    return This->lpVtbl->get_DownloadPriority(This,retval);
}
static FORCEINLINE HRESULT IUpdate_get_DownloadContents(IUpdate* This,IUpdateDownloadContentCollection **retval) {
    return This->lpVtbl->get_DownloadContents(This,retval);
}
#endif
#endif

#endif


#endif  /* __IUpdate_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdateCollection interface
 */
#ifndef __IUpdateCollection_INTERFACE_DEFINED__
#define __IUpdateCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateCollection, 0x07f7438c, 0x7709, 0x4ca5, 0xb5,0x18, 0x91,0x27,0x92,0x88,0x13,0x4e);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("07f7438c-7709-4ca5-b518-91279288134e")
IUpdateCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG index,
        IUpdate **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Item(
        LONG index,
        IUpdate *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **retval) = 0;

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

    virtual HRESULT STDMETHODCALLTYPE get_ReadOnly(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE Add(
        IUpdate *value,
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE Clear(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE Copy(
        IUpdateCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE Insert(
        LONG index,
        IUpdate *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveAt(
        LONG index) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateCollection, 0x07f7438c, 0x7709, 0x4ca5, 0xb5,0x18, 0x91,0x27,0x92,0x88,0x13,0x4e)
#endif
#else
typedef struct IUpdateCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdateCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IUpdateCollection *This,
        LONG index,
        IUpdate **retval);

    HRESULT (STDMETHODCALLTYPE *put_Item)(
        IUpdateCollection *This,
        LONG index,
        IUpdate *value);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IUpdateCollection *This,
        IUnknown **retval);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IUpdateCollection *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_ReadOnly)(
        IUpdateCollection *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *Add)(
        IUpdateCollection *This,
        IUpdate *value,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *Clear)(
        IUpdateCollection *This);

    HRESULT (STDMETHODCALLTYPE *Copy)(
        IUpdateCollection *This,
        IUpdateCollection **retval);

    HRESULT (STDMETHODCALLTYPE *Insert)(
        IUpdateCollection *This,
        LONG index,
        IUpdate *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAt)(
        IUpdateCollection *This,
        LONG index);

    END_INTERFACE
} IUpdateCollectionVtbl;

interface IUpdateCollection {
    CONST_VTBL IUpdateCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdateCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdateCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdateCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdateCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdateCollection methods ***/
#define IUpdateCollection_get_Item(This,index,retval) (This)->lpVtbl->get_Item(This,index,retval)
#define IUpdateCollection_put_Item(This,index,value) (This)->lpVtbl->put_Item(This,index,value)
#define IUpdateCollection_get__NewEnum(This,retval) (This)->lpVtbl->get__NewEnum(This,retval)
#define IUpdateCollection_get_Count(This,retval) (This)->lpVtbl->get_Count(This,retval)
#define IUpdateCollection_get_ReadOnly(This,retval) (This)->lpVtbl->get_ReadOnly(This,retval)
#define IUpdateCollection_Add(This,value,retval) (This)->lpVtbl->Add(This,value,retval)
#define IUpdateCollection_Clear(This) (This)->lpVtbl->Clear(This)
#define IUpdateCollection_Copy(This,retval) (This)->lpVtbl->Copy(This,retval)
#define IUpdateCollection_Insert(This,index,value) (This)->lpVtbl->Insert(This,index,value)
#define IUpdateCollection_RemoveAt(This,index) (This)->lpVtbl->RemoveAt(This,index)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateCollection_QueryInterface(IUpdateCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateCollection_AddRef(IUpdateCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateCollection_Release(IUpdateCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdateCollection_GetTypeInfoCount(IUpdateCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdateCollection_GetTypeInfo(IUpdateCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdateCollection_GetIDsOfNames(IUpdateCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdateCollection_Invoke(IUpdateCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdateCollection methods ***/
static FORCEINLINE HRESULT IUpdateCollection_get_Item(IUpdateCollection* This,LONG index,IUpdate **retval) {
    return This->lpVtbl->get_Item(This,index,retval);
}
static FORCEINLINE HRESULT IUpdateCollection_put_Item(IUpdateCollection* This,LONG index,IUpdate *value) {
    return This->lpVtbl->put_Item(This,index,value);
}
static FORCEINLINE HRESULT IUpdateCollection_get__NewEnum(IUpdateCollection* This,IUnknown **retval) {
    return This->lpVtbl->get__NewEnum(This,retval);
}
static FORCEINLINE HRESULT IUpdateCollection_get_Count(IUpdateCollection* This,LONG *retval) {
    return This->lpVtbl->get_Count(This,retval);
}
static FORCEINLINE HRESULT IUpdateCollection_get_ReadOnly(IUpdateCollection* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_ReadOnly(This,retval);
}
static FORCEINLINE HRESULT IUpdateCollection_Add(IUpdateCollection* This,IUpdate *value,LONG *retval) {
    return This->lpVtbl->Add(This,value,retval);
}
static FORCEINLINE HRESULT IUpdateCollection_Clear(IUpdateCollection* This) {
    return This->lpVtbl->Clear(This);
}
static FORCEINLINE HRESULT IUpdateCollection_Copy(IUpdateCollection* This,IUpdateCollection **retval) {
    return This->lpVtbl->Copy(This,retval);
}
static FORCEINLINE HRESULT IUpdateCollection_Insert(IUpdateCollection* This,LONG index,IUpdate *value) {
    return This->lpVtbl->Insert(This,index,value);
}
static FORCEINLINE HRESULT IUpdateCollection_RemoveAt(IUpdateCollection* This,LONG index) {
    return This->lpVtbl->RemoveAt(This,index);
}
#endif
#endif

#endif


#endif  /* __IUpdateCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISearchJob interface
 */
#ifndef __ISearchJob_INTERFACE_DEFINED__
#define __ISearchJob_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISearchJob, 0x7366ea16, 0x7a1a, 0x4ea2, 0xb0,0x42, 0x97,0x3d,0x3e,0x9c,0xd9,0x9b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7366ea16-7a1a-4ea2-b042-973d3e9cd99b")
ISearchJob : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_AsyncState(
        VARIANT *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsCompleted(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE CleanUp(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE RequestAbort(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISearchJob, 0x7366ea16, 0x7a1a, 0x4ea2, 0xb0,0x42, 0x97,0x3d,0x3e,0x9c,0xd9,0x9b)
#endif
#else
typedef struct ISearchJobVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISearchJob methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AsyncState)(
        ISearchJob *This,
        VARIANT *retval);

    HRESULT (STDMETHODCALLTYPE *get_IsCompleted)(
        ISearchJob *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *CleanUp)(
        ISearchJob *This);

    HRESULT (STDMETHODCALLTYPE *RequestAbort)(
        ISearchJob *This);

    END_INTERFACE
} ISearchJobVtbl;

interface ISearchJob {
    CONST_VTBL ISearchJobVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISearchJob_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISearchJob_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISearchJob_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISearchJob_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISearchJob_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISearchJob_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISearchJob_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISearchJob methods ***/
#define ISearchJob_get_AsyncState(This,retval) (This)->lpVtbl->get_AsyncState(This,retval)
#define ISearchJob_get_IsCompleted(This,retval) (This)->lpVtbl->get_IsCompleted(This,retval)
#define ISearchJob_CleanUp(This) (This)->lpVtbl->CleanUp(This)
#define ISearchJob_RequestAbort(This) (This)->lpVtbl->RequestAbort(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISearchJob_QueryInterface(ISearchJob* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISearchJob_AddRef(ISearchJob* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISearchJob_Release(ISearchJob* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISearchJob_GetTypeInfoCount(ISearchJob* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISearchJob_GetTypeInfo(ISearchJob* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISearchJob_GetIDsOfNames(ISearchJob* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISearchJob_Invoke(ISearchJob* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISearchJob methods ***/
static FORCEINLINE HRESULT ISearchJob_get_AsyncState(ISearchJob* This,VARIANT *retval) {
    return This->lpVtbl->get_AsyncState(This,retval);
}
static FORCEINLINE HRESULT ISearchJob_get_IsCompleted(ISearchJob* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_IsCompleted(This,retval);
}
static FORCEINLINE HRESULT ISearchJob_CleanUp(ISearchJob* This) {
    return This->lpVtbl->CleanUp(This);
}
static FORCEINLINE HRESULT ISearchJob_RequestAbort(ISearchJob* This) {
    return This->lpVtbl->RequestAbort(This);
}
#endif
#endif

#endif


#endif  /* __ISearchJob_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISearchResult interface
 */
#ifndef __ISearchResult_INTERFACE_DEFINED__
#define __ISearchResult_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISearchResult, 0xd40cff62, 0xe08c, 0x4498, 0x94,0x1a, 0x01,0xe2,0x5f,0x0f,0xd3,0x3c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d40cff62-e08c-4498-941a-01e25f0fd33c")
ISearchResult : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_ResultCode(
        OperationResultCode *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RootCategories(
        ICategoryCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Updates(
        IUpdateCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Warnings(
        IUpdateExceptionCollection **retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISearchResult, 0xd40cff62, 0xe08c, 0x4498, 0x94,0x1a, 0x01,0xe2,0x5f,0x0f,0xd3,0x3c)
#endif
#else
typedef struct ISearchResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISearchResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ResultCode)(
        ISearchResult *This,
        OperationResultCode *retval);

    HRESULT (STDMETHODCALLTYPE *get_RootCategories)(
        ISearchResult *This,
        ICategoryCollection **retval);

    HRESULT (STDMETHODCALLTYPE *get_Updates)(
        ISearchResult *This,
        IUpdateCollection **retval);

    HRESULT (STDMETHODCALLTYPE *get_Warnings)(
        ISearchResult *This,
        IUpdateExceptionCollection **retval);

    END_INTERFACE
} ISearchResultVtbl;

interface ISearchResult {
    CONST_VTBL ISearchResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISearchResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISearchResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISearchResult_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISearchResult_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISearchResult_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISearchResult_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISearchResult_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISearchResult methods ***/
#define ISearchResult_get_ResultCode(This,retval) (This)->lpVtbl->get_ResultCode(This,retval)
#define ISearchResult_get_RootCategories(This,retval) (This)->lpVtbl->get_RootCategories(This,retval)
#define ISearchResult_get_Updates(This,retval) (This)->lpVtbl->get_Updates(This,retval)
#define ISearchResult_get_Warnings(This,retval) (This)->lpVtbl->get_Warnings(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISearchResult_QueryInterface(ISearchResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISearchResult_AddRef(ISearchResult* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISearchResult_Release(ISearchResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISearchResult_GetTypeInfoCount(ISearchResult* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISearchResult_GetTypeInfo(ISearchResult* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISearchResult_GetIDsOfNames(ISearchResult* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISearchResult_Invoke(ISearchResult* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISearchResult methods ***/
static FORCEINLINE HRESULT ISearchResult_get_ResultCode(ISearchResult* This,OperationResultCode *retval) {
    return This->lpVtbl->get_ResultCode(This,retval);
}
static FORCEINLINE HRESULT ISearchResult_get_RootCategories(ISearchResult* This,ICategoryCollection **retval) {
    return This->lpVtbl->get_RootCategories(This,retval);
}
static FORCEINLINE HRESULT ISearchResult_get_Updates(ISearchResult* This,IUpdateCollection **retval) {
    return This->lpVtbl->get_Updates(This,retval);
}
static FORCEINLINE HRESULT ISearchResult_get_Warnings(ISearchResult* This,IUpdateExceptionCollection **retval) {
    return This->lpVtbl->get_Warnings(This,retval);
}
#endif
#endif

#endif


#endif  /* __ISearchResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdateHistoryEntry interface
 */
#ifndef __IUpdateHistoryEntry_INTERFACE_DEFINED__
#define __IUpdateHistoryEntry_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateHistoryEntry, 0xbe56a644, 0xaf0e, 0x4e0e, 0xa3,0x11, 0xc1,0xd8,0xe6,0x95,0xcb,0xff);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("be56a644-af0e-4e0e-a311-c1d8e695cbff")
IUpdateHistoryEntry : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Operation(
        UpdateOperation *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ResultCode(
        OperationResultCode *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_HResult(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Date(
        DATE *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UpdateIdentity(
        IUpdateIdentity **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Title(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Description(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UnmappedResultCode(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ClientApplicationID(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ServerSelection(
        ServerSelection *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ServiceID(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UninstallationSteps(
        IStringCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_UninstallationNotes(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_SupportUrl(
        BSTR *retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateHistoryEntry, 0xbe56a644, 0xaf0e, 0x4e0e, 0xa3,0x11, 0xc1,0xd8,0xe6,0x95,0xcb,0xff)
#endif
#else
typedef struct IUpdateHistoryEntryVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdateHistoryEntry methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Operation)(
        IUpdateHistoryEntry *This,
        UpdateOperation *retval);

    HRESULT (STDMETHODCALLTYPE *get_ResultCode)(
        IUpdateHistoryEntry *This,
        OperationResultCode *retval);

    HRESULT (STDMETHODCALLTYPE *get_HResult)(
        IUpdateHistoryEntry *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_Date)(
        IUpdateHistoryEntry *This,
        DATE *retval);

    HRESULT (STDMETHODCALLTYPE *get_UpdateIdentity)(
        IUpdateHistoryEntry *This,
        IUpdateIdentity **retval);

    HRESULT (STDMETHODCALLTYPE *get_Title)(
        IUpdateHistoryEntry *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_Description)(
        IUpdateHistoryEntry *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_UnmappedResultCode)(
        IUpdateHistoryEntry *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_ClientApplicationID)(
        IUpdateHistoryEntry *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_ServerSelection)(
        IUpdateHistoryEntry *This,
        ServerSelection *retval);

    HRESULT (STDMETHODCALLTYPE *get_ServiceID)(
        IUpdateHistoryEntry *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_UninstallationSteps)(
        IUpdateHistoryEntry *This,
        IStringCollection **retval);

    HRESULT (STDMETHODCALLTYPE *get_UninstallationNotes)(
        IUpdateHistoryEntry *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_SupportUrl)(
        IUpdateHistoryEntry *This,
        BSTR *retval);

    END_INTERFACE
} IUpdateHistoryEntryVtbl;

interface IUpdateHistoryEntry {
    CONST_VTBL IUpdateHistoryEntryVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateHistoryEntry_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateHistoryEntry_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateHistoryEntry_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdateHistoryEntry_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdateHistoryEntry_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdateHistoryEntry_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdateHistoryEntry_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdateHistoryEntry methods ***/
#define IUpdateHistoryEntry_get_Operation(This,retval) (This)->lpVtbl->get_Operation(This,retval)
#define IUpdateHistoryEntry_get_ResultCode(This,retval) (This)->lpVtbl->get_ResultCode(This,retval)
#define IUpdateHistoryEntry_get_HResult(This,retval) (This)->lpVtbl->get_HResult(This,retval)
#define IUpdateHistoryEntry_get_Date(This,retval) (This)->lpVtbl->get_Date(This,retval)
#define IUpdateHistoryEntry_get_UpdateIdentity(This,retval) (This)->lpVtbl->get_UpdateIdentity(This,retval)
#define IUpdateHistoryEntry_get_Title(This,retval) (This)->lpVtbl->get_Title(This,retval)
#define IUpdateHistoryEntry_get_Description(This,retval) (This)->lpVtbl->get_Description(This,retval)
#define IUpdateHistoryEntry_get_UnmappedResultCode(This,retval) (This)->lpVtbl->get_UnmappedResultCode(This,retval)
#define IUpdateHistoryEntry_get_ClientApplicationID(This,retval) (This)->lpVtbl->get_ClientApplicationID(This,retval)
#define IUpdateHistoryEntry_get_ServerSelection(This,retval) (This)->lpVtbl->get_ServerSelection(This,retval)
#define IUpdateHistoryEntry_get_ServiceID(This,retval) (This)->lpVtbl->get_ServiceID(This,retval)
#define IUpdateHistoryEntry_get_UninstallationSteps(This,retval) (This)->lpVtbl->get_UninstallationSteps(This,retval)
#define IUpdateHistoryEntry_get_UninstallationNotes(This,retval) (This)->lpVtbl->get_UninstallationNotes(This,retval)
#define IUpdateHistoryEntry_get_SupportUrl(This,retval) (This)->lpVtbl->get_SupportUrl(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateHistoryEntry_QueryInterface(IUpdateHistoryEntry* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateHistoryEntry_AddRef(IUpdateHistoryEntry* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateHistoryEntry_Release(IUpdateHistoryEntry* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdateHistoryEntry_GetTypeInfoCount(IUpdateHistoryEntry* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_GetTypeInfo(IUpdateHistoryEntry* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_GetIDsOfNames(IUpdateHistoryEntry* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_Invoke(IUpdateHistoryEntry* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdateHistoryEntry methods ***/
static FORCEINLINE HRESULT IUpdateHistoryEntry_get_Operation(IUpdateHistoryEntry* This,UpdateOperation *retval) {
    return This->lpVtbl->get_Operation(This,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_get_ResultCode(IUpdateHistoryEntry* This,OperationResultCode *retval) {
    return This->lpVtbl->get_ResultCode(This,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_get_HResult(IUpdateHistoryEntry* This,LONG *retval) {
    return This->lpVtbl->get_HResult(This,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_get_Date(IUpdateHistoryEntry* This,DATE *retval) {
    return This->lpVtbl->get_Date(This,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_get_UpdateIdentity(IUpdateHistoryEntry* This,IUpdateIdentity **retval) {
    return This->lpVtbl->get_UpdateIdentity(This,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_get_Title(IUpdateHistoryEntry* This,BSTR *retval) {
    return This->lpVtbl->get_Title(This,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_get_Description(IUpdateHistoryEntry* This,BSTR *retval) {
    return This->lpVtbl->get_Description(This,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_get_UnmappedResultCode(IUpdateHistoryEntry* This,LONG *retval) {
    return This->lpVtbl->get_UnmappedResultCode(This,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_get_ClientApplicationID(IUpdateHistoryEntry* This,BSTR *retval) {
    return This->lpVtbl->get_ClientApplicationID(This,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_get_ServerSelection(IUpdateHistoryEntry* This,ServerSelection *retval) {
    return This->lpVtbl->get_ServerSelection(This,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_get_ServiceID(IUpdateHistoryEntry* This,BSTR *retval) {
    return This->lpVtbl->get_ServiceID(This,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_get_UninstallationSteps(IUpdateHistoryEntry* This,IStringCollection **retval) {
    return This->lpVtbl->get_UninstallationSteps(This,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_get_UninstallationNotes(IUpdateHistoryEntry* This,BSTR *retval) {
    return This->lpVtbl->get_UninstallationNotes(This,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntry_get_SupportUrl(IUpdateHistoryEntry* This,BSTR *retval) {
    return This->lpVtbl->get_SupportUrl(This,retval);
}
#endif
#endif

#endif


#endif  /* __IUpdateHistoryEntry_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdateHistoryEntryCollection interface
 */
#ifndef __IUpdateHistoryEntryCollection_INTERFACE_DEFINED__
#define __IUpdateHistoryEntryCollection_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateHistoryEntryCollection, 0xa7f04f3c, 0xa290, 0x435b, 0xaa,0xdf, 0xa1,0x16,0xc3,0x35,0x7a,0x5c);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a7f04f3c-a290-435b-aadf-a116c3357a5c")
IUpdateHistoryEntryCollection : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_Item(
        LONG index,
        IUpdateHistoryEntry **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get__NewEnum(
        IUnknown **retval) = 0;

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

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateHistoryEntryCollection, 0xa7f04f3c, 0xa290, 0x435b, 0xaa,0xdf, 0xa1,0x16,0xc3,0x35,0x7a,0x5c)
#endif
#else
typedef struct IUpdateHistoryEntryCollectionVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdateHistoryEntryCollection methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Item)(
        IUpdateHistoryEntryCollection *This,
        LONG index,
        IUpdateHistoryEntry **retval);

    HRESULT (STDMETHODCALLTYPE *get__NewEnum)(
        IUpdateHistoryEntryCollection *This,
        IUnknown **retval);

    HRESULT (STDMETHODCALLTYPE *get_Count)(
        IUpdateHistoryEntryCollection *This,
        LONG *retval);

    END_INTERFACE
} IUpdateHistoryEntryCollectionVtbl;

interface IUpdateHistoryEntryCollection {
    CONST_VTBL IUpdateHistoryEntryCollectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateHistoryEntryCollection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateHistoryEntryCollection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateHistoryEntryCollection_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdateHistoryEntryCollection_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdateHistoryEntryCollection_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdateHistoryEntryCollection_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdateHistoryEntryCollection_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdateHistoryEntryCollection methods ***/
#define IUpdateHistoryEntryCollection_get_Item(This,index,retval) (This)->lpVtbl->get_Item(This,index,retval)
#define IUpdateHistoryEntryCollection_get__NewEnum(This,retval) (This)->lpVtbl->get__NewEnum(This,retval)
#define IUpdateHistoryEntryCollection_get_Count(This,retval) (This)->lpVtbl->get_Count(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateHistoryEntryCollection_QueryInterface(IUpdateHistoryEntryCollection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateHistoryEntryCollection_AddRef(IUpdateHistoryEntryCollection* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateHistoryEntryCollection_Release(IUpdateHistoryEntryCollection* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdateHistoryEntryCollection_GetTypeInfoCount(IUpdateHistoryEntryCollection* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdateHistoryEntryCollection_GetTypeInfo(IUpdateHistoryEntryCollection* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdateHistoryEntryCollection_GetIDsOfNames(IUpdateHistoryEntryCollection* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdateHistoryEntryCollection_Invoke(IUpdateHistoryEntryCollection* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdateHistoryEntryCollection methods ***/
static FORCEINLINE HRESULT IUpdateHistoryEntryCollection_get_Item(IUpdateHistoryEntryCollection* This,LONG index,IUpdateHistoryEntry **retval) {
    return This->lpVtbl->get_Item(This,index,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntryCollection_get__NewEnum(IUpdateHistoryEntryCollection* This,IUnknown **retval) {
    return This->lpVtbl->get__NewEnum(This,retval);
}
static FORCEINLINE HRESULT IUpdateHistoryEntryCollection_get_Count(IUpdateHistoryEntryCollection* This,LONG *retval) {
    return This->lpVtbl->get_Count(This,retval);
}
#endif
#endif

#endif


#endif  /* __IUpdateHistoryEntryCollection_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdateSearcher interface
 */
#ifndef __IUpdateSearcher_INTERFACE_DEFINED__
#define __IUpdateSearcher_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateSearcher, 0x8f45abf1, 0xf9ae, 0x4b95, 0xa9,0x33, 0xf0,0xf6,0x6e,0x50,0x56,0xea);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("8f45abf1-f9ae-4b95-a933-f0f66e5056ea")
IUpdateSearcher : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_CanAutomaticallyUpgradeService(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_CanAutomaticallyUpgradeService(
        VARIANT_BOOL value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ClientApplicationID(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ClientApplicationID(
        BSTR value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IncludePotentiallySupersededUpdates(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_IncludePotentiallySupersededUpdates(
        VARIANT_BOOL value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ServerSelection(
        ServerSelection *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ServerSelection(
        ServerSelection value) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginSearch(
        BSTR criteria,
        IUnknown *onCompleted,
        VARIANT state,
        ISearchJob **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndSearch(
        ISearchJob *searchJob,
        ISearchResult **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE EscapeString(
        BSTR unescaped,
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE QueryHistory(
        LONG startIndex,
        LONG count,
        IUpdateHistoryEntryCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE Search(
        BSTR criteria,
        ISearchResult **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Online(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Online(
        VARIANT_BOOL value) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetTotalHistoryCount(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ServiceID(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ServiceID(
        BSTR value) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateSearcher, 0x8f45abf1, 0xf9ae, 0x4b95, 0xa9,0x33, 0xf0,0xf6,0x6e,0x50,0x56,0xea)
#endif
#else
typedef struct IUpdateSearcherVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdateSearcher methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CanAutomaticallyUpgradeService)(
        IUpdateSearcher *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *put_CanAutomaticallyUpgradeService)(
        IUpdateSearcher *This,
        VARIANT_BOOL value);

    HRESULT (STDMETHODCALLTYPE *get_ClientApplicationID)(
        IUpdateSearcher *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *put_ClientApplicationID)(
        IUpdateSearcher *This,
        BSTR value);

    HRESULT (STDMETHODCALLTYPE *get_IncludePotentiallySupersededUpdates)(
        IUpdateSearcher *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *put_IncludePotentiallySupersededUpdates)(
        IUpdateSearcher *This,
        VARIANT_BOOL value);

    HRESULT (STDMETHODCALLTYPE *get_ServerSelection)(
        IUpdateSearcher *This,
        ServerSelection *retval);

    HRESULT (STDMETHODCALLTYPE *put_ServerSelection)(
        IUpdateSearcher *This,
        ServerSelection value);

    HRESULT (STDMETHODCALLTYPE *BeginSearch)(
        IUpdateSearcher *This,
        BSTR criteria,
        IUnknown *onCompleted,
        VARIANT state,
        ISearchJob **retval);

    HRESULT (STDMETHODCALLTYPE *EndSearch)(
        IUpdateSearcher *This,
        ISearchJob *searchJob,
        ISearchResult **retval);

    HRESULT (STDMETHODCALLTYPE *EscapeString)(
        IUpdateSearcher *This,
        BSTR unescaped,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *QueryHistory)(
        IUpdateSearcher *This,
        LONG startIndex,
        LONG count,
        IUpdateHistoryEntryCollection **retval);

    HRESULT (STDMETHODCALLTYPE *Search)(
        IUpdateSearcher *This,
        BSTR criteria,
        ISearchResult **retval);

    HRESULT (STDMETHODCALLTYPE *get_Online)(
        IUpdateSearcher *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *put_Online)(
        IUpdateSearcher *This,
        VARIANT_BOOL value);

    HRESULT (STDMETHODCALLTYPE *GetTotalHistoryCount)(
        IUpdateSearcher *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_ServiceID)(
        IUpdateSearcher *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *put_ServiceID)(
        IUpdateSearcher *This,
        BSTR value);

    END_INTERFACE
} IUpdateSearcherVtbl;

interface IUpdateSearcher {
    CONST_VTBL IUpdateSearcherVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateSearcher_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateSearcher_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateSearcher_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdateSearcher_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdateSearcher_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdateSearcher_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdateSearcher_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdateSearcher methods ***/
#define IUpdateSearcher_get_CanAutomaticallyUpgradeService(This,retval) (This)->lpVtbl->get_CanAutomaticallyUpgradeService(This,retval)
#define IUpdateSearcher_put_CanAutomaticallyUpgradeService(This,value) (This)->lpVtbl->put_CanAutomaticallyUpgradeService(This,value)
#define IUpdateSearcher_get_ClientApplicationID(This,retval) (This)->lpVtbl->get_ClientApplicationID(This,retval)
#define IUpdateSearcher_put_ClientApplicationID(This,value) (This)->lpVtbl->put_ClientApplicationID(This,value)
#define IUpdateSearcher_get_IncludePotentiallySupersededUpdates(This,retval) (This)->lpVtbl->get_IncludePotentiallySupersededUpdates(This,retval)
#define IUpdateSearcher_put_IncludePotentiallySupersededUpdates(This,value) (This)->lpVtbl->put_IncludePotentiallySupersededUpdates(This,value)
#define IUpdateSearcher_get_ServerSelection(This,retval) (This)->lpVtbl->get_ServerSelection(This,retval)
#define IUpdateSearcher_put_ServerSelection(This,value) (This)->lpVtbl->put_ServerSelection(This,value)
#define IUpdateSearcher_BeginSearch(This,criteria,onCompleted,state,retval) (This)->lpVtbl->BeginSearch(This,criteria,onCompleted,state,retval)
#define IUpdateSearcher_EndSearch(This,searchJob,retval) (This)->lpVtbl->EndSearch(This,searchJob,retval)
#define IUpdateSearcher_EscapeString(This,unescaped,retval) (This)->lpVtbl->EscapeString(This,unescaped,retval)
#define IUpdateSearcher_QueryHistory(This,startIndex,count,retval) (This)->lpVtbl->QueryHistory(This,startIndex,count,retval)
#define IUpdateSearcher_Search(This,criteria,retval) (This)->lpVtbl->Search(This,criteria,retval)
#define IUpdateSearcher_get_Online(This,retval) (This)->lpVtbl->get_Online(This,retval)
#define IUpdateSearcher_put_Online(This,value) (This)->lpVtbl->put_Online(This,value)
#define IUpdateSearcher_GetTotalHistoryCount(This,retval) (This)->lpVtbl->GetTotalHistoryCount(This,retval)
#define IUpdateSearcher_get_ServiceID(This,retval) (This)->lpVtbl->get_ServiceID(This,retval)
#define IUpdateSearcher_put_ServiceID(This,value) (This)->lpVtbl->put_ServiceID(This,value)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateSearcher_QueryInterface(IUpdateSearcher* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateSearcher_AddRef(IUpdateSearcher* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateSearcher_Release(IUpdateSearcher* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdateSearcher_GetTypeInfoCount(IUpdateSearcher* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdateSearcher_GetTypeInfo(IUpdateSearcher* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdateSearcher_GetIDsOfNames(IUpdateSearcher* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdateSearcher_Invoke(IUpdateSearcher* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdateSearcher methods ***/
static FORCEINLINE HRESULT IUpdateSearcher_get_CanAutomaticallyUpgradeService(IUpdateSearcher* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_CanAutomaticallyUpgradeService(This,retval);
}
static FORCEINLINE HRESULT IUpdateSearcher_put_CanAutomaticallyUpgradeService(IUpdateSearcher* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_CanAutomaticallyUpgradeService(This,value);
}
static FORCEINLINE HRESULT IUpdateSearcher_get_ClientApplicationID(IUpdateSearcher* This,BSTR *retval) {
    return This->lpVtbl->get_ClientApplicationID(This,retval);
}
static FORCEINLINE HRESULT IUpdateSearcher_put_ClientApplicationID(IUpdateSearcher* This,BSTR value) {
    return This->lpVtbl->put_ClientApplicationID(This,value);
}
static FORCEINLINE HRESULT IUpdateSearcher_get_IncludePotentiallySupersededUpdates(IUpdateSearcher* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_IncludePotentiallySupersededUpdates(This,retval);
}
static FORCEINLINE HRESULT IUpdateSearcher_put_IncludePotentiallySupersededUpdates(IUpdateSearcher* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_IncludePotentiallySupersededUpdates(This,value);
}
static FORCEINLINE HRESULT IUpdateSearcher_get_ServerSelection(IUpdateSearcher* This,ServerSelection *retval) {
    return This->lpVtbl->get_ServerSelection(This,retval);
}
static FORCEINLINE HRESULT IUpdateSearcher_put_ServerSelection(IUpdateSearcher* This,ServerSelection value) {
    return This->lpVtbl->put_ServerSelection(This,value);
}
static FORCEINLINE HRESULT IUpdateSearcher_BeginSearch(IUpdateSearcher* This,BSTR criteria,IUnknown *onCompleted,VARIANT state,ISearchJob **retval) {
    return This->lpVtbl->BeginSearch(This,criteria,onCompleted,state,retval);
}
static FORCEINLINE HRESULT IUpdateSearcher_EndSearch(IUpdateSearcher* This,ISearchJob *searchJob,ISearchResult **retval) {
    return This->lpVtbl->EndSearch(This,searchJob,retval);
}
static FORCEINLINE HRESULT IUpdateSearcher_EscapeString(IUpdateSearcher* This,BSTR unescaped,BSTR *retval) {
    return This->lpVtbl->EscapeString(This,unescaped,retval);
}
static FORCEINLINE HRESULT IUpdateSearcher_QueryHistory(IUpdateSearcher* This,LONG startIndex,LONG count,IUpdateHistoryEntryCollection **retval) {
    return This->lpVtbl->QueryHistory(This,startIndex,count,retval);
}
static FORCEINLINE HRESULT IUpdateSearcher_Search(IUpdateSearcher* This,BSTR criteria,ISearchResult **retval) {
    return This->lpVtbl->Search(This,criteria,retval);
}
static FORCEINLINE HRESULT IUpdateSearcher_get_Online(IUpdateSearcher* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_Online(This,retval);
}
static FORCEINLINE HRESULT IUpdateSearcher_put_Online(IUpdateSearcher* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_Online(This,value);
}
static FORCEINLINE HRESULT IUpdateSearcher_GetTotalHistoryCount(IUpdateSearcher* This,LONG *retval) {
    return This->lpVtbl->GetTotalHistoryCount(This,retval);
}
static FORCEINLINE HRESULT IUpdateSearcher_get_ServiceID(IUpdateSearcher* This,BSTR *retval) {
    return This->lpVtbl->get_ServiceID(This,retval);
}
static FORCEINLINE HRESULT IUpdateSearcher_put_ServiceID(IUpdateSearcher* This,BSTR value) {
    return This->lpVtbl->put_ServiceID(This,value);
}
#endif
#endif

#endif


#endif  /* __IUpdateSearcher_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdateDownloadResult interface
 */
#ifndef __IUpdateDownloadResult_INTERFACE_DEFINED__
#define __IUpdateDownloadResult_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateDownloadResult, 0xbf99af76, 0xb575, 0x42ad, 0x8a,0xa4, 0x33,0xcb,0xb5,0x47,0x7a,0xf1);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("bf99af76-b575-42ad-8aa4-33cbb5477af1")
IUpdateDownloadResult : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_HResult(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ResultCode(
        OperationResultCode *retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateDownloadResult, 0xbf99af76, 0xb575, 0x42ad, 0x8a,0xa4, 0x33,0xcb,0xb5,0x47,0x7a,0xf1)
#endif
#else
typedef struct IUpdateDownloadResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdateDownloadResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_HResult)(
        IUpdateDownloadResult *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_ResultCode)(
        IUpdateDownloadResult *This,
        OperationResultCode *retval);

    END_INTERFACE
} IUpdateDownloadResultVtbl;

interface IUpdateDownloadResult {
    CONST_VTBL IUpdateDownloadResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateDownloadResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateDownloadResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateDownloadResult_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdateDownloadResult_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdateDownloadResult_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdateDownloadResult_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdateDownloadResult_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdateDownloadResult methods ***/
#define IUpdateDownloadResult_get_HResult(This,retval) (This)->lpVtbl->get_HResult(This,retval)
#define IUpdateDownloadResult_get_ResultCode(This,retval) (This)->lpVtbl->get_ResultCode(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateDownloadResult_QueryInterface(IUpdateDownloadResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateDownloadResult_AddRef(IUpdateDownloadResult* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateDownloadResult_Release(IUpdateDownloadResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdateDownloadResult_GetTypeInfoCount(IUpdateDownloadResult* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdateDownloadResult_GetTypeInfo(IUpdateDownloadResult* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdateDownloadResult_GetIDsOfNames(IUpdateDownloadResult* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdateDownloadResult_Invoke(IUpdateDownloadResult* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdateDownloadResult methods ***/
static FORCEINLINE HRESULT IUpdateDownloadResult_get_HResult(IUpdateDownloadResult* This,LONG *retval) {
    return This->lpVtbl->get_HResult(This,retval);
}
static FORCEINLINE HRESULT IUpdateDownloadResult_get_ResultCode(IUpdateDownloadResult* This,OperationResultCode *retval) {
    return This->lpVtbl->get_ResultCode(This,retval);
}
#endif
#endif

#endif


#endif  /* __IUpdateDownloadResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDownloadProgress interface
 */
#ifndef __IDownloadProgress_INTERFACE_DEFINED__
#define __IDownloadProgress_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDownloadProgress, 0xd31a5bac, 0xf719, 0x4178, 0x9d,0xbb, 0x5e,0x2c,0xb4,0x7f,0xd1,0x8a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d31a5bac-f719-4178-9dbb-5e2cb47fd18a")
IDownloadProgress : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentUpdateBytesDownloaded(
        DECIMAL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentUpdateBytesToDownload(
        DECIMAL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentUpdateIndex(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PercentComplete(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TotalBytesDownloaded(
        DECIMAL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_TotalBytesToDownload(
        DECIMAL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUpdateResult(
        LONG updateIndex,
        IUpdateDownloadResult **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentUpdateDownloadPhase(
        DownloadPhase *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentUpdatePercentComplete(
        LONG *retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDownloadProgress, 0xd31a5bac, 0xf719, 0x4178, 0x9d,0xbb, 0x5e,0x2c,0xb4,0x7f,0xd1,0x8a)
#endif
#else
typedef struct IDownloadProgressVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IDownloadProgress methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentUpdateBytesDownloaded)(
        IDownloadProgress *This,
        DECIMAL *retval);

    HRESULT (STDMETHODCALLTYPE *get_CurrentUpdateBytesToDownload)(
        IDownloadProgress *This,
        DECIMAL *retval);

    HRESULT (STDMETHODCALLTYPE *get_CurrentUpdateIndex)(
        IDownloadProgress *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_PercentComplete)(
        IDownloadProgress *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_TotalBytesDownloaded)(
        IDownloadProgress *This,
        DECIMAL *retval);

    HRESULT (STDMETHODCALLTYPE *get_TotalBytesToDownload)(
        IDownloadProgress *This,
        DECIMAL *retval);

    HRESULT (STDMETHODCALLTYPE *GetUpdateResult)(
        IDownloadProgress *This,
        LONG updateIndex,
        IUpdateDownloadResult **retval);

    HRESULT (STDMETHODCALLTYPE *get_CurrentUpdateDownloadPhase)(
        IDownloadProgress *This,
        DownloadPhase *retval);

    HRESULT (STDMETHODCALLTYPE *get_CurrentUpdatePercentComplete)(
        IDownloadProgress *This,
        LONG *retval);

    END_INTERFACE
} IDownloadProgressVtbl;

interface IDownloadProgress {
    CONST_VTBL IDownloadProgressVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDownloadProgress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDownloadProgress_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDownloadProgress_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDownloadProgress_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDownloadProgress_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDownloadProgress_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDownloadProgress_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDownloadProgress methods ***/
#define IDownloadProgress_get_CurrentUpdateBytesDownloaded(This,retval) (This)->lpVtbl->get_CurrentUpdateBytesDownloaded(This,retval)
#define IDownloadProgress_get_CurrentUpdateBytesToDownload(This,retval) (This)->lpVtbl->get_CurrentUpdateBytesToDownload(This,retval)
#define IDownloadProgress_get_CurrentUpdateIndex(This,retval) (This)->lpVtbl->get_CurrentUpdateIndex(This,retval)
#define IDownloadProgress_get_PercentComplete(This,retval) (This)->lpVtbl->get_PercentComplete(This,retval)
#define IDownloadProgress_get_TotalBytesDownloaded(This,retval) (This)->lpVtbl->get_TotalBytesDownloaded(This,retval)
#define IDownloadProgress_get_TotalBytesToDownload(This,retval) (This)->lpVtbl->get_TotalBytesToDownload(This,retval)
#define IDownloadProgress_GetUpdateResult(This,updateIndex,retval) (This)->lpVtbl->GetUpdateResult(This,updateIndex,retval)
#define IDownloadProgress_get_CurrentUpdateDownloadPhase(This,retval) (This)->lpVtbl->get_CurrentUpdateDownloadPhase(This,retval)
#define IDownloadProgress_get_CurrentUpdatePercentComplete(This,retval) (This)->lpVtbl->get_CurrentUpdatePercentComplete(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDownloadProgress_QueryInterface(IDownloadProgress* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDownloadProgress_AddRef(IDownloadProgress* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDownloadProgress_Release(IDownloadProgress* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDownloadProgress_GetTypeInfoCount(IDownloadProgress* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDownloadProgress_GetTypeInfo(IDownloadProgress* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDownloadProgress_GetIDsOfNames(IDownloadProgress* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDownloadProgress_Invoke(IDownloadProgress* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IDownloadProgress methods ***/
static FORCEINLINE HRESULT IDownloadProgress_get_CurrentUpdateBytesDownloaded(IDownloadProgress* This,DECIMAL *retval) {
    return This->lpVtbl->get_CurrentUpdateBytesDownloaded(This,retval);
}
static FORCEINLINE HRESULT IDownloadProgress_get_CurrentUpdateBytesToDownload(IDownloadProgress* This,DECIMAL *retval) {
    return This->lpVtbl->get_CurrentUpdateBytesToDownload(This,retval);
}
static FORCEINLINE HRESULT IDownloadProgress_get_CurrentUpdateIndex(IDownloadProgress* This,LONG *retval) {
    return This->lpVtbl->get_CurrentUpdateIndex(This,retval);
}
static FORCEINLINE HRESULT IDownloadProgress_get_PercentComplete(IDownloadProgress* This,LONG *retval) {
    return This->lpVtbl->get_PercentComplete(This,retval);
}
static FORCEINLINE HRESULT IDownloadProgress_get_TotalBytesDownloaded(IDownloadProgress* This,DECIMAL *retval) {
    return This->lpVtbl->get_TotalBytesDownloaded(This,retval);
}
static FORCEINLINE HRESULT IDownloadProgress_get_TotalBytesToDownload(IDownloadProgress* This,DECIMAL *retval) {
    return This->lpVtbl->get_TotalBytesToDownload(This,retval);
}
static FORCEINLINE HRESULT IDownloadProgress_GetUpdateResult(IDownloadProgress* This,LONG updateIndex,IUpdateDownloadResult **retval) {
    return This->lpVtbl->GetUpdateResult(This,updateIndex,retval);
}
static FORCEINLINE HRESULT IDownloadProgress_get_CurrentUpdateDownloadPhase(IDownloadProgress* This,DownloadPhase *retval) {
    return This->lpVtbl->get_CurrentUpdateDownloadPhase(This,retval);
}
static FORCEINLINE HRESULT IDownloadProgress_get_CurrentUpdatePercentComplete(IDownloadProgress* This,LONG *retval) {
    return This->lpVtbl->get_CurrentUpdatePercentComplete(This,retval);
}
#endif
#endif

#endif


#endif  /* __IDownloadProgress_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDownloadJob interface
 */
#ifndef __IDownloadJob_INTERFACE_DEFINED__
#define __IDownloadJob_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDownloadJob, 0xc574de85, 0x7358, 0x43f6, 0xaa,0xe8, 0x86,0x97,0xe6,0x2d,0x8b,0xa7);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("c574de85-7358-43f6-aae8-8697e62d8ba7")
IDownloadJob : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_AsyncState(
        VARIANT *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsCompleted(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Updates(
        IUpdateCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE CleanUp(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProgress(
        IDownloadProgress **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE RequestAbort(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDownloadJob, 0xc574de85, 0x7358, 0x43f6, 0xaa,0xe8, 0x86,0x97,0xe6,0x2d,0x8b,0xa7)
#endif
#else
typedef struct IDownloadJobVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IDownloadJob methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AsyncState)(
        IDownloadJob *This,
        VARIANT *retval);

    HRESULT (STDMETHODCALLTYPE *get_IsCompleted)(
        IDownloadJob *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_Updates)(
        IDownloadJob *This,
        IUpdateCollection **retval);

    HRESULT (STDMETHODCALLTYPE *CleanUp)(
        IDownloadJob *This);

    HRESULT (STDMETHODCALLTYPE *GetProgress)(
        IDownloadJob *This,
        IDownloadProgress **retval);

    HRESULT (STDMETHODCALLTYPE *RequestAbort)(
        IDownloadJob *This);

    END_INTERFACE
} IDownloadJobVtbl;

interface IDownloadJob {
    CONST_VTBL IDownloadJobVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDownloadJob_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDownloadJob_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDownloadJob_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDownloadJob_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDownloadJob_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDownloadJob_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDownloadJob_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDownloadJob methods ***/
#define IDownloadJob_get_AsyncState(This,retval) (This)->lpVtbl->get_AsyncState(This,retval)
#define IDownloadJob_get_IsCompleted(This,retval) (This)->lpVtbl->get_IsCompleted(This,retval)
#define IDownloadJob_get_Updates(This,retval) (This)->lpVtbl->get_Updates(This,retval)
#define IDownloadJob_CleanUp(This) (This)->lpVtbl->CleanUp(This)
#define IDownloadJob_GetProgress(This,retval) (This)->lpVtbl->GetProgress(This,retval)
#define IDownloadJob_RequestAbort(This) (This)->lpVtbl->RequestAbort(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDownloadJob_QueryInterface(IDownloadJob* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDownloadJob_AddRef(IDownloadJob* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDownloadJob_Release(IDownloadJob* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDownloadJob_GetTypeInfoCount(IDownloadJob* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDownloadJob_GetTypeInfo(IDownloadJob* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDownloadJob_GetIDsOfNames(IDownloadJob* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDownloadJob_Invoke(IDownloadJob* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IDownloadJob methods ***/
static FORCEINLINE HRESULT IDownloadJob_get_AsyncState(IDownloadJob* This,VARIANT *retval) {
    return This->lpVtbl->get_AsyncState(This,retval);
}
static FORCEINLINE HRESULT IDownloadJob_get_IsCompleted(IDownloadJob* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_IsCompleted(This,retval);
}
static FORCEINLINE HRESULT IDownloadJob_get_Updates(IDownloadJob* This,IUpdateCollection **retval) {
    return This->lpVtbl->get_Updates(This,retval);
}
static FORCEINLINE HRESULT IDownloadJob_CleanUp(IDownloadJob* This) {
    return This->lpVtbl->CleanUp(This);
}
static FORCEINLINE HRESULT IDownloadJob_GetProgress(IDownloadJob* This,IDownloadProgress **retval) {
    return This->lpVtbl->GetProgress(This,retval);
}
static FORCEINLINE HRESULT IDownloadJob_RequestAbort(IDownloadJob* This) {
    return This->lpVtbl->RequestAbort(This);
}
#endif
#endif

#endif


#endif  /* __IDownloadJob_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IDownloadResult interface
 */
#ifndef __IDownloadResult_INTERFACE_DEFINED__
#define __IDownloadResult_INTERFACE_DEFINED__

DEFINE_GUID(IID_IDownloadResult, 0xdaa4fdd0, 0x4727, 0x4dbe, 0xa1,0xe7, 0x74,0x5d,0xca,0x31,0x71,0x44);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("daa4fdd0-4727-4dbe-a1e7-745dca317144")
IDownloadResult : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_HResult(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ResultCode(
        OperationResultCode *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUpdateResult(
        LONG updateIndex,
        IUpdateDownloadResult **retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IDownloadResult, 0xdaa4fdd0, 0x4727, 0x4dbe, 0xa1,0xe7, 0x74,0x5d,0xca,0x31,0x71,0x44)
#endif
#else
typedef struct IDownloadResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IDownloadResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_HResult)(
        IDownloadResult *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_ResultCode)(
        IDownloadResult *This,
        OperationResultCode *retval);

    HRESULT (STDMETHODCALLTYPE *GetUpdateResult)(
        IDownloadResult *This,
        LONG updateIndex,
        IUpdateDownloadResult **retval);

    END_INTERFACE
} IDownloadResultVtbl;

interface IDownloadResult {
    CONST_VTBL IDownloadResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IDownloadResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IDownloadResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IDownloadResult_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IDownloadResult_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IDownloadResult_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IDownloadResult_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IDownloadResult_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IDownloadResult methods ***/
#define IDownloadResult_get_HResult(This,retval) (This)->lpVtbl->get_HResult(This,retval)
#define IDownloadResult_get_ResultCode(This,retval) (This)->lpVtbl->get_ResultCode(This,retval)
#define IDownloadResult_GetUpdateResult(This,updateIndex,retval) (This)->lpVtbl->GetUpdateResult(This,updateIndex,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IDownloadResult_QueryInterface(IDownloadResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IDownloadResult_AddRef(IDownloadResult* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IDownloadResult_Release(IDownloadResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IDownloadResult_GetTypeInfoCount(IDownloadResult* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IDownloadResult_GetTypeInfo(IDownloadResult* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IDownloadResult_GetIDsOfNames(IDownloadResult* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IDownloadResult_Invoke(IDownloadResult* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IDownloadResult methods ***/
static FORCEINLINE HRESULT IDownloadResult_get_HResult(IDownloadResult* This,LONG *retval) {
    return This->lpVtbl->get_HResult(This,retval);
}
static FORCEINLINE HRESULT IDownloadResult_get_ResultCode(IDownloadResult* This,OperationResultCode *retval) {
    return This->lpVtbl->get_ResultCode(This,retval);
}
static FORCEINLINE HRESULT IDownloadResult_GetUpdateResult(IDownloadResult* This,LONG updateIndex,IUpdateDownloadResult **retval) {
    return This->lpVtbl->GetUpdateResult(This,updateIndex,retval);
}
#endif
#endif

#endif


#endif  /* __IDownloadResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdateDownloader interface
 */
#ifndef __IUpdateDownloader_INTERFACE_DEFINED__
#define __IUpdateDownloader_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateDownloader, 0x68f1c6f9, 0x7ecc, 0x4666, 0xa4,0x64, 0x24,0x7f,0xe1,0x24,0x96,0xc3);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("68f1c6f9-7ecc-4666-a464-247fe12496c3")
IUpdateDownloader : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_ClientApplicationID(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ClientApplicationID(
        BSTR value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsForced(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_IsForced(
        VARIANT_BOOL value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Priority(
        DownloadPriority *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Priority(
        DownloadPriority value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Updates(
        IUpdateCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Updates(
        IUpdateCollection *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginDownload(
        IUnknown *onProgressChanged,
        IUnknown *onCompleted,
        VARIANT state,
        IDownloadJob **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE Download(
        IDownloadResult **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndDownload(
        IDownloadJob *value,
        IDownloadResult **retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateDownloader, 0x68f1c6f9, 0x7ecc, 0x4666, 0xa4,0x64, 0x24,0x7f,0xe1,0x24,0x96,0xc3)
#endif
#else
typedef struct IUpdateDownloaderVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdateDownloader methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ClientApplicationID)(
        IUpdateDownloader *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *put_ClientApplicationID)(
        IUpdateDownloader *This,
        BSTR value);

    HRESULT (STDMETHODCALLTYPE *get_IsForced)(
        IUpdateDownloader *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *put_IsForced)(
        IUpdateDownloader *This,
        VARIANT_BOOL value);

    HRESULT (STDMETHODCALLTYPE *get_Priority)(
        IUpdateDownloader *This,
        DownloadPriority *retval);

    HRESULT (STDMETHODCALLTYPE *put_Priority)(
        IUpdateDownloader *This,
        DownloadPriority value);

    HRESULT (STDMETHODCALLTYPE *get_Updates)(
        IUpdateDownloader *This,
        IUpdateCollection **retval);

    HRESULT (STDMETHODCALLTYPE *put_Updates)(
        IUpdateDownloader *This,
        IUpdateCollection *value);

    HRESULT (STDMETHODCALLTYPE *BeginDownload)(
        IUpdateDownloader *This,
        IUnknown *onProgressChanged,
        IUnknown *onCompleted,
        VARIANT state,
        IDownloadJob **retval);

    HRESULT (STDMETHODCALLTYPE *Download)(
        IUpdateDownloader *This,
        IDownloadResult **retval);

    HRESULT (STDMETHODCALLTYPE *EndDownload)(
        IUpdateDownloader *This,
        IDownloadJob *value,
        IDownloadResult **retval);

    END_INTERFACE
} IUpdateDownloaderVtbl;

interface IUpdateDownloader {
    CONST_VTBL IUpdateDownloaderVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateDownloader_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateDownloader_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateDownloader_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdateDownloader_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdateDownloader_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdateDownloader_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdateDownloader_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdateDownloader methods ***/
#define IUpdateDownloader_get_ClientApplicationID(This,retval) (This)->lpVtbl->get_ClientApplicationID(This,retval)
#define IUpdateDownloader_put_ClientApplicationID(This,value) (This)->lpVtbl->put_ClientApplicationID(This,value)
#define IUpdateDownloader_get_IsForced(This,retval) (This)->lpVtbl->get_IsForced(This,retval)
#define IUpdateDownloader_put_IsForced(This,value) (This)->lpVtbl->put_IsForced(This,value)
#define IUpdateDownloader_get_Priority(This,retval) (This)->lpVtbl->get_Priority(This,retval)
#define IUpdateDownloader_put_Priority(This,value) (This)->lpVtbl->put_Priority(This,value)
#define IUpdateDownloader_get_Updates(This,retval) (This)->lpVtbl->get_Updates(This,retval)
#define IUpdateDownloader_put_Updates(This,value) (This)->lpVtbl->put_Updates(This,value)
#define IUpdateDownloader_BeginDownload(This,onProgressChanged,onCompleted,state,retval) (This)->lpVtbl->BeginDownload(This,onProgressChanged,onCompleted,state,retval)
#define IUpdateDownloader_Download(This,retval) (This)->lpVtbl->Download(This,retval)
#define IUpdateDownloader_EndDownload(This,value,retval) (This)->lpVtbl->EndDownload(This,value,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateDownloader_QueryInterface(IUpdateDownloader* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateDownloader_AddRef(IUpdateDownloader* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateDownloader_Release(IUpdateDownloader* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdateDownloader_GetTypeInfoCount(IUpdateDownloader* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdateDownloader_GetTypeInfo(IUpdateDownloader* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdateDownloader_GetIDsOfNames(IUpdateDownloader* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdateDownloader_Invoke(IUpdateDownloader* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdateDownloader methods ***/
static FORCEINLINE HRESULT IUpdateDownloader_get_ClientApplicationID(IUpdateDownloader* This,BSTR *retval) {
    return This->lpVtbl->get_ClientApplicationID(This,retval);
}
static FORCEINLINE HRESULT IUpdateDownloader_put_ClientApplicationID(IUpdateDownloader* This,BSTR value) {
    return This->lpVtbl->put_ClientApplicationID(This,value);
}
static FORCEINLINE HRESULT IUpdateDownloader_get_IsForced(IUpdateDownloader* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_IsForced(This,retval);
}
static FORCEINLINE HRESULT IUpdateDownloader_put_IsForced(IUpdateDownloader* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_IsForced(This,value);
}
static FORCEINLINE HRESULT IUpdateDownloader_get_Priority(IUpdateDownloader* This,DownloadPriority *retval) {
    return This->lpVtbl->get_Priority(This,retval);
}
static FORCEINLINE HRESULT IUpdateDownloader_put_Priority(IUpdateDownloader* This,DownloadPriority value) {
    return This->lpVtbl->put_Priority(This,value);
}
static FORCEINLINE HRESULT IUpdateDownloader_get_Updates(IUpdateDownloader* This,IUpdateCollection **retval) {
    return This->lpVtbl->get_Updates(This,retval);
}
static FORCEINLINE HRESULT IUpdateDownloader_put_Updates(IUpdateDownloader* This,IUpdateCollection *value) {
    return This->lpVtbl->put_Updates(This,value);
}
static FORCEINLINE HRESULT IUpdateDownloader_BeginDownload(IUpdateDownloader* This,IUnknown *onProgressChanged,IUnknown *onCompleted,VARIANT state,IDownloadJob **retval) {
    return This->lpVtbl->BeginDownload(This,onProgressChanged,onCompleted,state,retval);
}
static FORCEINLINE HRESULT IUpdateDownloader_Download(IUpdateDownloader* This,IDownloadResult **retval) {
    return This->lpVtbl->Download(This,retval);
}
static FORCEINLINE HRESULT IUpdateDownloader_EndDownload(IUpdateDownloader* This,IDownloadJob *value,IDownloadResult **retval) {
    return This->lpVtbl->EndDownload(This,value,retval);
}
#endif
#endif

#endif


#endif  /* __IUpdateDownloader_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdateInstallationResult interface
 */
#ifndef __IUpdateInstallationResult_INTERFACE_DEFINED__
#define __IUpdateInstallationResult_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateInstallationResult, 0xd940f0f8, 0x3cbb, 0x4fd0, 0x99,0x3f, 0x47,0x1e,0x7f,0x23,0x28,0xad);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("d940f0f8-3cbb-4fd0-993f-471e7f2328ad")
IUpdateInstallationResult : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_HResult(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RebootRequired(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ResultCode(
        OperationResultCode *retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateInstallationResult, 0xd940f0f8, 0x3cbb, 0x4fd0, 0x99,0x3f, 0x47,0x1e,0x7f,0x23,0x28,0xad)
#endif
#else
typedef struct IUpdateInstallationResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdateInstallationResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_HResult)(
        IUpdateInstallationResult *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_RebootRequired)(
        IUpdateInstallationResult *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_ResultCode)(
        IUpdateInstallationResult *This,
        OperationResultCode *retval);

    END_INTERFACE
} IUpdateInstallationResultVtbl;

interface IUpdateInstallationResult {
    CONST_VTBL IUpdateInstallationResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateInstallationResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateInstallationResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateInstallationResult_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdateInstallationResult_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdateInstallationResult_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdateInstallationResult_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdateInstallationResult_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdateInstallationResult methods ***/
#define IUpdateInstallationResult_get_HResult(This,retval) (This)->lpVtbl->get_HResult(This,retval)
#define IUpdateInstallationResult_get_RebootRequired(This,retval) (This)->lpVtbl->get_RebootRequired(This,retval)
#define IUpdateInstallationResult_get_ResultCode(This,retval) (This)->lpVtbl->get_ResultCode(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateInstallationResult_QueryInterface(IUpdateInstallationResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateInstallationResult_AddRef(IUpdateInstallationResult* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateInstallationResult_Release(IUpdateInstallationResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdateInstallationResult_GetTypeInfoCount(IUpdateInstallationResult* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdateInstallationResult_GetTypeInfo(IUpdateInstallationResult* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdateInstallationResult_GetIDsOfNames(IUpdateInstallationResult* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdateInstallationResult_Invoke(IUpdateInstallationResult* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdateInstallationResult methods ***/
static FORCEINLINE HRESULT IUpdateInstallationResult_get_HResult(IUpdateInstallationResult* This,LONG *retval) {
    return This->lpVtbl->get_HResult(This,retval);
}
static FORCEINLINE HRESULT IUpdateInstallationResult_get_RebootRequired(IUpdateInstallationResult* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_RebootRequired(This,retval);
}
static FORCEINLINE HRESULT IUpdateInstallationResult_get_ResultCode(IUpdateInstallationResult* This,OperationResultCode *retval) {
    return This->lpVtbl->get_ResultCode(This,retval);
}
#endif
#endif

#endif


#endif  /* __IUpdateInstallationResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInstallationProgress interface
 */
#ifndef __IInstallationProgress_INTERFACE_DEFINED__
#define __IInstallationProgress_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInstallationProgress, 0x345c8244, 0x43a3, 0x4e32, 0xa3,0x68, 0x65,0xf0,0x73,0xb7,0x6f,0x36);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("345c8244-43a3-4e32-a368-65f073b76f36")
IInstallationProgress : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_CurrentUpdateIndex(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_CurrentUpdatePercentComplete(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_PercentComplete(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUpdateResult(
        LONG updateIndex,
        IUpdateInstallationResult **retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInstallationProgress, 0x345c8244, 0x43a3, 0x4e32, 0xa3,0x68, 0x65,0xf0,0x73,0xb7,0x6f,0x36)
#endif
#else
typedef struct IInstallationProgressVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IInstallationProgress methods ***/
    HRESULT (STDMETHODCALLTYPE *get_CurrentUpdateIndex)(
        IInstallationProgress *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_CurrentUpdatePercentComplete)(
        IInstallationProgress *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_PercentComplete)(
        IInstallationProgress *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *GetUpdateResult)(
        IInstallationProgress *This,
        LONG updateIndex,
        IUpdateInstallationResult **retval);

    END_INTERFACE
} IInstallationProgressVtbl;

interface IInstallationProgress {
    CONST_VTBL IInstallationProgressVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInstallationProgress_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInstallationProgress_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInstallationProgress_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInstallationProgress_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInstallationProgress_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInstallationProgress_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInstallationProgress_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInstallationProgress methods ***/
#define IInstallationProgress_get_CurrentUpdateIndex(This,retval) (This)->lpVtbl->get_CurrentUpdateIndex(This,retval)
#define IInstallationProgress_get_CurrentUpdatePercentComplete(This,retval) (This)->lpVtbl->get_CurrentUpdatePercentComplete(This,retval)
#define IInstallationProgress_get_PercentComplete(This,retval) (This)->lpVtbl->get_PercentComplete(This,retval)
#define IInstallationProgress_GetUpdateResult(This,updateIndex,retval) (This)->lpVtbl->GetUpdateResult(This,updateIndex,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInstallationProgress_QueryInterface(IInstallationProgress* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInstallationProgress_AddRef(IInstallationProgress* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInstallationProgress_Release(IInstallationProgress* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInstallationProgress_GetTypeInfoCount(IInstallationProgress* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInstallationProgress_GetTypeInfo(IInstallationProgress* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInstallationProgress_GetIDsOfNames(IInstallationProgress* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInstallationProgress_Invoke(IInstallationProgress* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInstallationProgress methods ***/
static FORCEINLINE HRESULT IInstallationProgress_get_CurrentUpdateIndex(IInstallationProgress* This,LONG *retval) {
    return This->lpVtbl->get_CurrentUpdateIndex(This,retval);
}
static FORCEINLINE HRESULT IInstallationProgress_get_CurrentUpdatePercentComplete(IInstallationProgress* This,LONG *retval) {
    return This->lpVtbl->get_CurrentUpdatePercentComplete(This,retval);
}
static FORCEINLINE HRESULT IInstallationProgress_get_PercentComplete(IInstallationProgress* This,LONG *retval) {
    return This->lpVtbl->get_PercentComplete(This,retval);
}
static FORCEINLINE HRESULT IInstallationProgress_GetUpdateResult(IInstallationProgress* This,LONG updateIndex,IUpdateInstallationResult **retval) {
    return This->lpVtbl->GetUpdateResult(This,updateIndex,retval);
}
#endif
#endif

#endif


#endif  /* __IInstallationProgress_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInstallationJob interface
 */
#ifndef __IInstallationJob_INTERFACE_DEFINED__
#define __IInstallationJob_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInstallationJob, 0x5c209f0b, 0xbad5, 0x432a, 0x95,0x56, 0x46,0x99,0xbe,0xd2,0x63,0x8a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("5c209f0b-bad5-432a-9556-4699bed2638a")
IInstallationJob : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_AsyncState(
        VARIANT *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsCompleted(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Updates(
        IUpdateCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE CleanUp(
        ) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetProgress(
        IInstallationProgress **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE RequestAbort(
        ) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInstallationJob, 0x5c209f0b, 0xbad5, 0x432a, 0x95,0x56, 0x46,0x99,0xbe,0xd2,0x63,0x8a)
#endif
#else
typedef struct IInstallationJobVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IInstallationJob methods ***/
    HRESULT (STDMETHODCALLTYPE *get_AsyncState)(
        IInstallationJob *This,
        VARIANT *retval);

    HRESULT (STDMETHODCALLTYPE *get_IsCompleted)(
        IInstallationJob *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_Updates)(
        IInstallationJob *This,
        IUpdateCollection **retval);

    HRESULT (STDMETHODCALLTYPE *CleanUp)(
        IInstallationJob *This);

    HRESULT (STDMETHODCALLTYPE *GetProgress)(
        IInstallationJob *This,
        IInstallationProgress **retval);

    HRESULT (STDMETHODCALLTYPE *RequestAbort)(
        IInstallationJob *This);

    END_INTERFACE
} IInstallationJobVtbl;

interface IInstallationJob {
    CONST_VTBL IInstallationJobVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInstallationJob_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInstallationJob_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInstallationJob_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInstallationJob_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInstallationJob_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInstallationJob_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInstallationJob_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInstallationJob methods ***/
#define IInstallationJob_get_AsyncState(This,retval) (This)->lpVtbl->get_AsyncState(This,retval)
#define IInstallationJob_get_IsCompleted(This,retval) (This)->lpVtbl->get_IsCompleted(This,retval)
#define IInstallationJob_get_Updates(This,retval) (This)->lpVtbl->get_Updates(This,retval)
#define IInstallationJob_CleanUp(This) (This)->lpVtbl->CleanUp(This)
#define IInstallationJob_GetProgress(This,retval) (This)->lpVtbl->GetProgress(This,retval)
#define IInstallationJob_RequestAbort(This) (This)->lpVtbl->RequestAbort(This)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInstallationJob_QueryInterface(IInstallationJob* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInstallationJob_AddRef(IInstallationJob* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInstallationJob_Release(IInstallationJob* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInstallationJob_GetTypeInfoCount(IInstallationJob* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInstallationJob_GetTypeInfo(IInstallationJob* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInstallationJob_GetIDsOfNames(IInstallationJob* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInstallationJob_Invoke(IInstallationJob* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInstallationJob methods ***/
static FORCEINLINE HRESULT IInstallationJob_get_AsyncState(IInstallationJob* This,VARIANT *retval) {
    return This->lpVtbl->get_AsyncState(This,retval);
}
static FORCEINLINE HRESULT IInstallationJob_get_IsCompleted(IInstallationJob* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_IsCompleted(This,retval);
}
static FORCEINLINE HRESULT IInstallationJob_get_Updates(IInstallationJob* This,IUpdateCollection **retval) {
    return This->lpVtbl->get_Updates(This,retval);
}
static FORCEINLINE HRESULT IInstallationJob_CleanUp(IInstallationJob* This) {
    return This->lpVtbl->CleanUp(This);
}
static FORCEINLINE HRESULT IInstallationJob_GetProgress(IInstallationJob* This,IInstallationProgress **retval) {
    return This->lpVtbl->GetProgress(This,retval);
}
static FORCEINLINE HRESULT IInstallationJob_RequestAbort(IInstallationJob* This) {
    return This->lpVtbl->RequestAbort(This);
}
#endif
#endif

#endif


#endif  /* __IInstallationJob_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IInstallationResult interface
 */
#ifndef __IInstallationResult_INTERFACE_DEFINED__
#define __IInstallationResult_INTERFACE_DEFINED__

DEFINE_GUID(IID_IInstallationResult, 0xa43c56d6, 0x7451, 0x48d4, 0xaf,0x96, 0xb6,0xcd,0x2d,0x0d,0x9b,0x7a);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("a43c56d6-7451-48d4-af96-b6cd2d0d9b7a")
IInstallationResult : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_HResult(
        LONG *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RebootRequired(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ResultCode(
        OperationResultCode *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetUpdateResult(
        LONG updateIndex,
        IUpdateInstallationResult **retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IInstallationResult, 0xa43c56d6, 0x7451, 0x48d4, 0xaf,0x96, 0xb6,0xcd,0x2d,0x0d,0x9b,0x7a)
#endif
#else
typedef struct IInstallationResultVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IInstallationResult methods ***/
    HRESULT (STDMETHODCALLTYPE *get_HResult)(
        IInstallationResult *This,
        LONG *retval);

    HRESULT (STDMETHODCALLTYPE *get_RebootRequired)(
        IInstallationResult *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *get_ResultCode)(
        IInstallationResult *This,
        OperationResultCode *retval);

    HRESULT (STDMETHODCALLTYPE *GetUpdateResult)(
        IInstallationResult *This,
        LONG updateIndex,
        IUpdateInstallationResult **retval);

    END_INTERFACE
} IInstallationResultVtbl;

interface IInstallationResult {
    CONST_VTBL IInstallationResultVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IInstallationResult_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IInstallationResult_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IInstallationResult_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IInstallationResult_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IInstallationResult_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IInstallationResult_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IInstallationResult_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IInstallationResult methods ***/
#define IInstallationResult_get_HResult(This,retval) (This)->lpVtbl->get_HResult(This,retval)
#define IInstallationResult_get_RebootRequired(This,retval) (This)->lpVtbl->get_RebootRequired(This,retval)
#define IInstallationResult_get_ResultCode(This,retval) (This)->lpVtbl->get_ResultCode(This,retval)
#define IInstallationResult_GetUpdateResult(This,updateIndex,retval) (This)->lpVtbl->GetUpdateResult(This,updateIndex,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IInstallationResult_QueryInterface(IInstallationResult* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IInstallationResult_AddRef(IInstallationResult* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IInstallationResult_Release(IInstallationResult* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IInstallationResult_GetTypeInfoCount(IInstallationResult* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IInstallationResult_GetTypeInfo(IInstallationResult* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IInstallationResult_GetIDsOfNames(IInstallationResult* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IInstallationResult_Invoke(IInstallationResult* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IInstallationResult methods ***/
static FORCEINLINE HRESULT IInstallationResult_get_HResult(IInstallationResult* This,LONG *retval) {
    return This->lpVtbl->get_HResult(This,retval);
}
static FORCEINLINE HRESULT IInstallationResult_get_RebootRequired(IInstallationResult* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_RebootRequired(This,retval);
}
static FORCEINLINE HRESULT IInstallationResult_get_ResultCode(IInstallationResult* This,OperationResultCode *retval) {
    return This->lpVtbl->get_ResultCode(This,retval);
}
static FORCEINLINE HRESULT IInstallationResult_GetUpdateResult(IInstallationResult* This,LONG updateIndex,IUpdateInstallationResult **retval) {
    return This->lpVtbl->GetUpdateResult(This,updateIndex,retval);
}
#endif
#endif

#endif


#endif  /* __IInstallationResult_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IUpdateInstaller interface
 */
#ifndef __IUpdateInstaller_INTERFACE_DEFINED__
#define __IUpdateInstaller_INTERFACE_DEFINED__

DEFINE_GUID(IID_IUpdateInstaller, 0x7b929c68, 0xccdc, 0x4226, 0x96,0xb1, 0x87,0x24,0x60,0x0b,0x54,0xc2);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("7b929c68-ccdc-4226-96b1-8724600b54c2")
IUpdateInstaller : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_ClientApplicationID(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ClientApplicationID(
        BSTR value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsForced(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_IsForced(
        VARIANT_BOOL value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ParentHwnd(
        HWND *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ParentHwnd(
        HWND value) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_ParentWindow(
        IUnknown *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_ParentWindow(
        IUnknown **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_Updates(
        IUpdateCollection **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_Updates(
        IUpdateCollection *value) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginInstall(
        IUnknown *onProgressChanged,
        IUnknown *onCompleted,
        VARIANT state,
        IInstallationJob **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE BeginUninstall(
        IUnknown *onProgressChanged,
        IUnknown *onCompleted,
        VARIANT state,
        IInstallationJob **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndInstall(
        IInstallationJob *value,
        IInstallationResult **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE EndUninstall(
        IInstallationJob *value,
        IInstallationResult **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE Install(
        IInstallationResult **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE RunWizard(
        BSTR dialogTitle,
        IInstallationResult **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_IsBusy(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE Uninstall(
        IInstallationResult **retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_AllowSourcePrompts(
        VARIANT_BOOL *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE put_AllowSourcePrompts(
        VARIANT_BOOL value) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RebootRequiredBeforeInstallation(
        VARIANT_BOOL *retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(IUpdateInstaller, 0x7b929c68, 0xccdc, 0x4226, 0x96,0xb1, 0x87,0x24,0x60,0x0b,0x54,0xc2)
#endif
#else
typedef struct IUpdateInstallerVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** IUpdateInstaller methods ***/
    HRESULT (STDMETHODCALLTYPE *get_ClientApplicationID)(
        IUpdateInstaller *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *put_ClientApplicationID)(
        IUpdateInstaller *This,
        BSTR value);

    HRESULT (STDMETHODCALLTYPE *get_IsForced)(
        IUpdateInstaller *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *put_IsForced)(
        IUpdateInstaller *This,
        VARIANT_BOOL value);

    HRESULT (STDMETHODCALLTYPE *get_ParentHwnd)(
        IUpdateInstaller *This,
        HWND *retval);

    HRESULT (STDMETHODCALLTYPE *put_ParentHwnd)(
        IUpdateInstaller *This,
        HWND value);

    HRESULT (STDMETHODCALLTYPE *put_ParentWindow)(
        IUpdateInstaller *This,
        IUnknown *value);

    HRESULT (STDMETHODCALLTYPE *get_ParentWindow)(
        IUpdateInstaller *This,
        IUnknown **retval);

    HRESULT (STDMETHODCALLTYPE *get_Updates)(
        IUpdateInstaller *This,
        IUpdateCollection **retval);

    HRESULT (STDMETHODCALLTYPE *put_Updates)(
        IUpdateInstaller *This,
        IUpdateCollection *value);

    HRESULT (STDMETHODCALLTYPE *BeginInstall)(
        IUpdateInstaller *This,
        IUnknown *onProgressChanged,
        IUnknown *onCompleted,
        VARIANT state,
        IInstallationJob **retval);

    HRESULT (STDMETHODCALLTYPE *BeginUninstall)(
        IUpdateInstaller *This,
        IUnknown *onProgressChanged,
        IUnknown *onCompleted,
        VARIANT state,
        IInstallationJob **retval);

    HRESULT (STDMETHODCALLTYPE *EndInstall)(
        IUpdateInstaller *This,
        IInstallationJob *value,
        IInstallationResult **retval);

    HRESULT (STDMETHODCALLTYPE *EndUninstall)(
        IUpdateInstaller *This,
        IInstallationJob *value,
        IInstallationResult **retval);

    HRESULT (STDMETHODCALLTYPE *Install)(
        IUpdateInstaller *This,
        IInstallationResult **retval);

    HRESULT (STDMETHODCALLTYPE *RunWizard)(
        IUpdateInstaller *This,
        BSTR dialogTitle,
        IInstallationResult **retval);

    HRESULT (STDMETHODCALLTYPE *get_IsBusy)(
        IUpdateInstaller *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *Uninstall)(
        IUpdateInstaller *This,
        IInstallationResult **retval);

    HRESULT (STDMETHODCALLTYPE *get_AllowSourcePrompts)(
        IUpdateInstaller *This,
        VARIANT_BOOL *retval);

    HRESULT (STDMETHODCALLTYPE *put_AllowSourcePrompts)(
        IUpdateInstaller *This,
        VARIANT_BOOL value);

    HRESULT (STDMETHODCALLTYPE *get_RebootRequiredBeforeInstallation)(
        IUpdateInstaller *This,
        VARIANT_BOOL *retval);

    END_INTERFACE
} IUpdateInstallerVtbl;

interface IUpdateInstaller {
    CONST_VTBL IUpdateInstallerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define IUpdateInstaller_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define IUpdateInstaller_AddRef(This) (This)->lpVtbl->AddRef(This)
#define IUpdateInstaller_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define IUpdateInstaller_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define IUpdateInstaller_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define IUpdateInstaller_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define IUpdateInstaller_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** IUpdateInstaller methods ***/
#define IUpdateInstaller_get_ClientApplicationID(This,retval) (This)->lpVtbl->get_ClientApplicationID(This,retval)
#define IUpdateInstaller_put_ClientApplicationID(This,value) (This)->lpVtbl->put_ClientApplicationID(This,value)
#define IUpdateInstaller_get_IsForced(This,retval) (This)->lpVtbl->get_IsForced(This,retval)
#define IUpdateInstaller_put_IsForced(This,value) (This)->lpVtbl->put_IsForced(This,value)
#define IUpdateInstaller_get_ParentHwnd(This,retval) (This)->lpVtbl->get_ParentHwnd(This,retval)
#define IUpdateInstaller_put_ParentHwnd(This,value) (This)->lpVtbl->put_ParentHwnd(This,value)
#define IUpdateInstaller_put_ParentWindow(This,value) (This)->lpVtbl->put_ParentWindow(This,value)
#define IUpdateInstaller_get_ParentWindow(This,retval) (This)->lpVtbl->get_ParentWindow(This,retval)
#define IUpdateInstaller_get_Updates(This,retval) (This)->lpVtbl->get_Updates(This,retval)
#define IUpdateInstaller_put_Updates(This,value) (This)->lpVtbl->put_Updates(This,value)
#define IUpdateInstaller_BeginInstall(This,onProgressChanged,onCompleted,state,retval) (This)->lpVtbl->BeginInstall(This,onProgressChanged,onCompleted,state,retval)
#define IUpdateInstaller_BeginUninstall(This,onProgressChanged,onCompleted,state,retval) (This)->lpVtbl->BeginUninstall(This,onProgressChanged,onCompleted,state,retval)
#define IUpdateInstaller_EndInstall(This,value,retval) (This)->lpVtbl->EndInstall(This,value,retval)
#define IUpdateInstaller_EndUninstall(This,value,retval) (This)->lpVtbl->EndUninstall(This,value,retval)
#define IUpdateInstaller_Install(This,retval) (This)->lpVtbl->Install(This,retval)
#define IUpdateInstaller_RunWizard(This,dialogTitle,retval) (This)->lpVtbl->RunWizard(This,dialogTitle,retval)
#define IUpdateInstaller_get_IsBusy(This,retval) (This)->lpVtbl->get_IsBusy(This,retval)
#define IUpdateInstaller_Uninstall(This,retval) (This)->lpVtbl->Uninstall(This,retval)
#define IUpdateInstaller_get_AllowSourcePrompts(This,retval) (This)->lpVtbl->get_AllowSourcePrompts(This,retval)
#define IUpdateInstaller_put_AllowSourcePrompts(This,value) (This)->lpVtbl->put_AllowSourcePrompts(This,value)
#define IUpdateInstaller_get_RebootRequiredBeforeInstallation(This,retval) (This)->lpVtbl->get_RebootRequiredBeforeInstallation(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT IUpdateInstaller_QueryInterface(IUpdateInstaller* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG IUpdateInstaller_AddRef(IUpdateInstaller* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG IUpdateInstaller_Release(IUpdateInstaller* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT IUpdateInstaller_GetTypeInfoCount(IUpdateInstaller* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT IUpdateInstaller_GetTypeInfo(IUpdateInstaller* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT IUpdateInstaller_GetIDsOfNames(IUpdateInstaller* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT IUpdateInstaller_Invoke(IUpdateInstaller* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** IUpdateInstaller methods ***/
static FORCEINLINE HRESULT IUpdateInstaller_get_ClientApplicationID(IUpdateInstaller* This,BSTR *retval) {
    return This->lpVtbl->get_ClientApplicationID(This,retval);
}
static FORCEINLINE HRESULT IUpdateInstaller_put_ClientApplicationID(IUpdateInstaller* This,BSTR value) {
    return This->lpVtbl->put_ClientApplicationID(This,value);
}
static FORCEINLINE HRESULT IUpdateInstaller_get_IsForced(IUpdateInstaller* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_IsForced(This,retval);
}
static FORCEINLINE HRESULT IUpdateInstaller_put_IsForced(IUpdateInstaller* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_IsForced(This,value);
}
static FORCEINLINE HRESULT IUpdateInstaller_get_ParentHwnd(IUpdateInstaller* This,HWND *retval) {
    return This->lpVtbl->get_ParentHwnd(This,retval);
}
static FORCEINLINE HRESULT IUpdateInstaller_put_ParentHwnd(IUpdateInstaller* This,HWND value) {
    return This->lpVtbl->put_ParentHwnd(This,value);
}
static FORCEINLINE HRESULT IUpdateInstaller_put_ParentWindow(IUpdateInstaller* This,IUnknown *value) {
    return This->lpVtbl->put_ParentWindow(This,value);
}
static FORCEINLINE HRESULT IUpdateInstaller_get_ParentWindow(IUpdateInstaller* This,IUnknown **retval) {
    return This->lpVtbl->get_ParentWindow(This,retval);
}
static FORCEINLINE HRESULT IUpdateInstaller_get_Updates(IUpdateInstaller* This,IUpdateCollection **retval) {
    return This->lpVtbl->get_Updates(This,retval);
}
static FORCEINLINE HRESULT IUpdateInstaller_put_Updates(IUpdateInstaller* This,IUpdateCollection *value) {
    return This->lpVtbl->put_Updates(This,value);
}
static FORCEINLINE HRESULT IUpdateInstaller_BeginInstall(IUpdateInstaller* This,IUnknown *onProgressChanged,IUnknown *onCompleted,VARIANT state,IInstallationJob **retval) {
    return This->lpVtbl->BeginInstall(This,onProgressChanged,onCompleted,state,retval);
}
static FORCEINLINE HRESULT IUpdateInstaller_BeginUninstall(IUpdateInstaller* This,IUnknown *onProgressChanged,IUnknown *onCompleted,VARIANT state,IInstallationJob **retval) {
    return This->lpVtbl->BeginUninstall(This,onProgressChanged,onCompleted,state,retval);
}
static FORCEINLINE HRESULT IUpdateInstaller_EndInstall(IUpdateInstaller* This,IInstallationJob *value,IInstallationResult **retval) {
    return This->lpVtbl->EndInstall(This,value,retval);
}
static FORCEINLINE HRESULT IUpdateInstaller_EndUninstall(IUpdateInstaller* This,IInstallationJob *value,IInstallationResult **retval) {
    return This->lpVtbl->EndUninstall(This,value,retval);
}
static FORCEINLINE HRESULT IUpdateInstaller_Install(IUpdateInstaller* This,IInstallationResult **retval) {
    return This->lpVtbl->Install(This,retval);
}
static FORCEINLINE HRESULT IUpdateInstaller_RunWizard(IUpdateInstaller* This,BSTR dialogTitle,IInstallationResult **retval) {
    return This->lpVtbl->RunWizard(This,dialogTitle,retval);
}
static FORCEINLINE HRESULT IUpdateInstaller_get_IsBusy(IUpdateInstaller* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_IsBusy(This,retval);
}
static FORCEINLINE HRESULT IUpdateInstaller_Uninstall(IUpdateInstaller* This,IInstallationResult **retval) {
    return This->lpVtbl->Uninstall(This,retval);
}
static FORCEINLINE HRESULT IUpdateInstaller_get_AllowSourcePrompts(IUpdateInstaller* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_AllowSourcePrompts(This,retval);
}
static FORCEINLINE HRESULT IUpdateInstaller_put_AllowSourcePrompts(IUpdateInstaller* This,VARIANT_BOOL value) {
    return This->lpVtbl->put_AllowSourcePrompts(This,value);
}
static FORCEINLINE HRESULT IUpdateInstaller_get_RebootRequiredBeforeInstallation(IUpdateInstaller* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_RebootRequiredBeforeInstallation(This,retval);
}
#endif
#endif

#endif


#endif  /* __IUpdateInstaller_INTERFACE_DEFINED__ */

/*****************************************************************************
 * ISystemInformation interface
 */
#ifndef __ISystemInformation_INTERFACE_DEFINED__
#define __ISystemInformation_INTERFACE_DEFINED__

DEFINE_GUID(IID_ISystemInformation, 0xade87bf7, 0x7b56, 0x4275, 0x8f,0xab, 0xb9,0xb0,0xe5,0x91,0x84,0x4b);
#if defined(__cplusplus) && !defined(CINTERFACE)
MIDL_INTERFACE("ade87bf7-7b56-4275-8fab-b9b0e591844b")
ISystemInformation : public IDispatch
{
    virtual HRESULT STDMETHODCALLTYPE get_OemHardwareSupportLink(
        BSTR *retval) = 0;

    virtual HRESULT STDMETHODCALLTYPE get_RebootRequired(
        VARIANT_BOOL *retval) = 0;

};
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(ISystemInformation, 0xade87bf7, 0x7b56, 0x4275, 0x8f,0xab, 0xb9,0xb0,0xe5,0x91,0x84,0x4b)
#endif
#else
typedef struct ISystemInformationVtbl {
    BEGIN_INTERFACE

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

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

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

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

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

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

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

    /*** ISystemInformation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_OemHardwareSupportLink)(
        ISystemInformation *This,
        BSTR *retval);

    HRESULT (STDMETHODCALLTYPE *get_RebootRequired)(
        ISystemInformation *This,
        VARIANT_BOOL *retval);

    END_INTERFACE
} ISystemInformationVtbl;

interface ISystemInformation {
    CONST_VTBL ISystemInformationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define ISystemInformation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define ISystemInformation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define ISystemInformation_Release(This) (This)->lpVtbl->Release(This)
/*** IDispatch methods ***/
#define ISystemInformation_GetTypeInfoCount(This,pctinfo) (This)->lpVtbl->GetTypeInfoCount(This,pctinfo)
#define ISystemInformation_GetTypeInfo(This,iTInfo,lcid,ppTInfo) (This)->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo)
#define ISystemInformation_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) (This)->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId)
#define ISystemInformation_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) (This)->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr)
/*** ISystemInformation methods ***/
#define ISystemInformation_get_OemHardwareSupportLink(This,retval) (This)->lpVtbl->get_OemHardwareSupportLink(This,retval)
#define ISystemInformation_get_RebootRequired(This,retval) (This)->lpVtbl->get_RebootRequired(This,retval)
#else
/*** IUnknown methods ***/
static FORCEINLINE HRESULT ISystemInformation_QueryInterface(ISystemInformation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static FORCEINLINE ULONG ISystemInformation_AddRef(ISystemInformation* This) {
    return This->lpVtbl->AddRef(This);
}
static FORCEINLINE ULONG ISystemInformation_Release(ISystemInformation* This) {
    return This->lpVtbl->Release(This);
}
/*** IDispatch methods ***/
static FORCEINLINE HRESULT ISystemInformation_GetTypeInfoCount(ISystemInformation* This,UINT *pctinfo) {
    return This->lpVtbl->GetTypeInfoCount(This,pctinfo);
}
static FORCEINLINE HRESULT ISystemInformation_GetTypeInfo(ISystemInformation* This,UINT iTInfo,LCID lcid,ITypeInfo **ppTInfo) {
    return This->lpVtbl->GetTypeInfo(This,iTInfo,lcid,ppTInfo);
}
static FORCEINLINE HRESULT ISystemInformation_GetIDsOfNames(ISystemInformation* This,REFIID riid,LPOLESTR *rgszNames,UINT cNames,LCID lcid,DISPID *rgDispId) {
    return This->lpVtbl->GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId);
}
static FORCEINLINE HRESULT ISystemInformation_Invoke(ISystemInformation* This,DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS *pDispParams,VARIANT *pVarResult,EXCEPINFO *pExcepInfo,UINT *puArgErr) {
    return This->lpVtbl->Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr);
}
/*** ISystemInformation methods ***/
static FORCEINLINE HRESULT ISystemInformation_get_OemHardwareSupportLink(ISystemInformation* This,BSTR *retval) {
    return This->lpVtbl->get_OemHardwareSupportLink(This,retval);
}
static FORCEINLINE HRESULT ISystemInformation_get_RebootRequired(ISystemInformation* This,VARIANT_BOOL *retval) {
    return This->lpVtbl->get_RebootRequired(This,retval);
}
#endif
#endif

#endif


#endif  /* __ISystemInformation_INTERFACE_DEFINED__ */

/*****************************************************************************
 * AutomaticUpdates coclass
 */

DEFINE_GUID(CLSID_AutomaticUpdates, 0xbfe18e9c, 0x6d87, 0x4450, 0xb3,0x7c, 0xe0,0x2f,0x0b,0x37,0x38,0x03);

#ifdef __cplusplus
class DECLSPEC_UUID("bfe18e9c-6d87-4450-b37c-e02f0b373803") AutomaticUpdates;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(AutomaticUpdates, 0xbfe18e9c, 0x6d87, 0x4450, 0xb3,0x7c, 0xe0,0x2f,0x0b,0x37,0x38,0x03)
#endif
#endif

/*****************************************************************************
 * UpdateInstaller coclass
 */

DEFINE_GUID(CLSID_UpdateInstaller, 0xd2e0fe7f, 0xd23e, 0x48e1, 0x93,0xc0, 0x6f,0xa8,0xcc,0x34,0x64,0x74);

#ifdef __cplusplus
class DECLSPEC_UUID("d2e0fe7f-d23e-48e1-93c0-6fa8cc346474") UpdateInstaller;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(UpdateInstaller, 0xd2e0fe7f, 0xd23e, 0x48e1, 0x93,0xc0, 0x6f,0xa8,0xcc,0x34,0x64,0x74)
#endif
#endif

/*****************************************************************************
 * UpdateSession coclass
 */

DEFINE_GUID(CLSID_UpdateSession, 0x4cb43d7f, 0x7eee, 0x4906, 0x86,0x98, 0x60,0xda,0x1c,0x38,0xf2,0xfe);

#ifdef __cplusplus
class DECLSPEC_UUID("4cb43d7f-7eee-4906-8698-60da1c38f2fe") UpdateSession;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(UpdateSession, 0x4cb43d7f, 0x7eee, 0x4906, 0x86,0x98, 0x60,0xda,0x1c,0x38,0xf2,0xfe)
#endif
#endif

/*****************************************************************************
 * SystemInformation coclass
 */

DEFINE_GUID(CLSID_SystemInformation, 0xc01b9ba0, 0xbea7, 0x41ba, 0xb6,0x04, 0xd0,0xa3,0x6f,0x46,0x91,0x33);

#ifdef __cplusplus
class DECLSPEC_UUID("c01b9ba0-bea7-41ba-b604-d0a36f469133") SystemInformation;
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(SystemInformation, 0xc01b9ba0, 0xbea7, 0x41ba, 0xb6,0x04, 0xd0,0xa3,0x6f,0x46,0x91,0x33)
#endif
#endif

#endif /* __WUApiLib_LIBRARY_DEFINED__ */
/* Begin additional prototypes for all interfaces */

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

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __wuapi_h__ */
