diff --git a/mingw-w64-headers/Makefile.in b/mingw-w64-headers/Makefile.in
index 7de8694..99d85e6 100644
--- a/mingw-w64-headers/Makefile.in
+++ b/mingw-w64-headers/Makefile.in
@@ -563,6 +563,7 @@
 @HAVE_WIDL_TRUE@  include/wmdrmsdk.idl \
 @HAVE_WIDL_TRUE@  include/wpcapi.idl \
 @HAVE_WIDL_TRUE@  include/wtypes.idl \
+@HAVE_WIDL_TRUE@  include/wuapi.idl \
 @HAVE_WIDL_TRUE@  include/xapo.idl \
 @HAVE_WIDL_TRUE@  include/xaudio2.idl \
 @HAVE_WIDL_TRUE@  include/xaudio2fx.idl \
diff --git a/mingw-w64-headers/include/windows.foundation.collections.h b/mingw-w64-headers/include/windows.foundation.collections.h
index a51dd0a..591bf1f 100644
--- a/mingw-w64-headers/include/windows.foundation.collections.h
+++ b/mingw-w64-headers/include/windows.foundation.collections.h
@@ -249,7 +249,7 @@
                     virtual HRESULT STDMETHODCALLTYPE get_Current(T_abi *value) = 0;
                     virtual HRESULT STDMETHODCALLTYPE get_HasCurrent(WINBOOL *value) = 0;
                     virtual HRESULT STDMETHODCALLTYPE MoveNext(WINBOOL *value) = 0;
-                    virtual HRESULT STDMETHODCALLTYPE GetMany(UINT32 count,T_abi *items,UINT32 *value) = 0;
+                    virtual HRESULT STDMETHODCALLTYPE GetMany(UINT32 count,UINT32 items_size,T_abi *items,UINT32 *value) = 0;
                 };
             }
         }
@@ -295,10 +295,10 @@
                     typedef typename Windows::Foundation::Internal::GetLogicalType<T>::type T_logical;
                 public:
                     typedef T T_complex;
-                    virtual HRESULT STDMETHODCALLTYPE GetAt(ULONG index,T_abi *value) = 0;
-                    virtual HRESULT STDMETHODCALLTYPE get_Size(ULONG *value) = 0;
-                    virtual HRESULT STDMETHODCALLTYPE IndexOf(T_abi element,ULONG *index,BOOLEAN *value) = 0;
-                    virtual HRESULT STDMETHODCALLTYPE GetMany(ULONG start_index,T_abi *items,ULONG *value) = 0;
+                    virtual HRESULT STDMETHODCALLTYPE GetAt(UINT32 index,T_abi *value) = 0;
+                    virtual HRESULT STDMETHODCALLTYPE get_Size(UINT32 *value) = 0;
+                    virtual HRESULT STDMETHODCALLTYPE IndexOf(T_abi element,UINT32 *index,BOOLEAN *value) = 0;
+                    virtual HRESULT STDMETHODCALLTYPE GetMany(UINT32 start_index,UINT32 items_size,T_abi *items,UINT32 *value) = 0;
                 };
             }
         }
diff --git a/mingw-w64-headers/include/windows.foundation.collections.idl b/mingw-w64-headers/include/windows.foundation.collections.idl
index 50a678e..b0b9430 100644
--- a/mingw-w64-headers/include/windows.foundation.collections.idl
+++ b/mingw-w64-headers/include/windows.foundation.collections.idl
@@ -83,7 +83,7 @@
                 [propget] HRESULT Current([out, retval] T *value);
                 [propget] HRESULT HasCurrent([out, retval] BOOL *value);
                 HRESULT MoveNext([out, retval] BOOL *value);
-                HRESULT GetMany([in] UINT32 count, [out] T *items, [out, retval] UINT32 *value);
+                HRESULT GetMany([in] UINT32 count, [in] UINT32 items_size, [out] T *items, [out, retval] UINT32 *value);
             }
 
             [
@@ -101,10 +101,10 @@
             ]
             interface IVectorView<T> : IInspectable
             {
-                HRESULT GetAt([in] ULONG index, [out, retval] T *value);
-                [propget] HRESULT Size([out, retval] ULONG *value);
-                HRESULT IndexOf([in, optional] T element, [out] ULONG *index, [out, retval] BOOLEAN *value);
-                HRESULT GetMany([in] ULONG start_index, [out] T *items, [out, retval] ULONG *value);
+                HRESULT GetAt([in] UINT32 index, [out, retval] T *value);
+                [propget] HRESULT Size([out, retval] UINT32 *value);
+                HRESULT IndexOf([in, optional] T element, [out] UINT32 *index, [out, retval] BOOLEAN *value);
+                HRESULT GetMany([in] UINT32 start_index, [in] UINT32 items_size, [out] T *items, [out, retval] UINT32 *value);
             }
         }
 #endif
diff --git a/mingw-w64-headers/include/windows.foundation.h b/mingw-w64-headers/include/windows.foundation.h
index 4a2c5b7..95486f9 100644
--- a/mingw-w64-headers/include/windows.foundation.h
+++ b/mingw-w64-headers/include/windows.foundation.h
@@ -49,6 +49,14 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIVectorView_1_HSTRING_FWD_DEFINED__
+#define ____FIVectorView_1_HSTRING_FWD_DEFINED__
+typedef interface __FIVectorView_1_HSTRING __FIVectorView_1_HSTRING;
+#ifdef __cplusplus
+#define __FIVectorView_1_HSTRING ABI::Windows::Foundation::Collections::IVectorView<HSTRING >
+#endif /* __cplusplus */
+#endif
+
 /* Headers for imported files */
 
 #include <inspectable.h>
@@ -422,6 +430,14 @@
 #endif /* __cplusplus */
 #endif
 
+#ifndef ____FIVectorView_1_HSTRING_FWD_DEFINED__
+#define ____FIVectorView_1_HSTRING_FWD_DEFINED__
+typedef interface __FIVectorView_1_HSTRING __FIVectorView_1_HSTRING;
+#ifdef __cplusplus
+#define __FIVectorView_1_HSTRING ABI::Windows::Foundation::Collections::IVectorView<HSTRING >
+#endif /* __cplusplus */
+#endif
+
 /*****************************************************************************
  * IAsyncOperationCompletedHandler<boolean > interface
  */
@@ -654,6 +670,163 @@
 
 #endif  /* ____FIAsyncOperation_1_boolean_INTERFACE_DEFINED__ */
 
+/*****************************************************************************
+ * IVectorView<HSTRING > interface
+ */
+#ifndef ____FIVectorView_1_HSTRING_INTERFACE_DEFINED__
+#define ____FIVectorView_1_HSTRING_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID___FIVectorView_1_HSTRING, 0xfca5679c, 0xbfd4, 0x5187, 0x8b,0x2d, 0xde,0x22,0x50,0x49,0xb3,0x46);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+} /* extern "C" */
+namespace ABI {
+    namespace Windows {
+        namespace Foundation {
+            namespace Collections {
+                template<>
+                MIDL_INTERFACE("fca5679c-bfd4-5187-8b2d-de225049b346")
+                IVectorView<HSTRING > : IVectorView_impl<HSTRING >
+                {
+                };
+            }
+        }
+    }
+}
+extern "C" {
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(__FIVectorView_1_HSTRING, 0xfca5679c, 0xbfd4, 0x5187, 0x8b,0x2d, 0xde,0x22,0x50,0x49,0xb3,0x46)
+#endif
+#else
+typedef struct __FIVectorView_1_HSTRINGVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        __FIVectorView_1_HSTRING *This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        __FIVectorView_1_HSTRING *This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        __FIVectorView_1_HSTRING *This);
+
+    /*** IInspectable methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetIids)(
+        __FIVectorView_1_HSTRING *This,
+        ULONG *iidCount,
+        IID **iids);
+
+    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
+        __FIVectorView_1_HSTRING *This,
+        HSTRING *className);
+
+    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
+        __FIVectorView_1_HSTRING *This,
+        TrustLevel *trustLevel);
+
+    /*** IVectorView<HSTRING > methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetAt)(
+        __FIVectorView_1_HSTRING *This,
+        UINT32 index,
+        HSTRING *value);
+
+    HRESULT (STDMETHODCALLTYPE *get_Size)(
+        __FIVectorView_1_HSTRING *This,
+        UINT32 *value);
+
+    HRESULT (STDMETHODCALLTYPE *IndexOf)(
+        __FIVectorView_1_HSTRING *This,
+        HSTRING element,
+        UINT32 *index,
+        BOOLEAN *value);
+
+    HRESULT (STDMETHODCALLTYPE *GetMany)(
+        __FIVectorView_1_HSTRING *This,
+        UINT32 start_index,
+        UINT32 items_size,
+        HSTRING *items,
+        UINT32 *value);
+
+    END_INTERFACE
+} __FIVectorView_1_HSTRINGVtbl;
+
+interface __FIVectorView_1_HSTRING {
+    CONST_VTBL __FIVectorView_1_HSTRINGVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define __FIVectorView_1_HSTRING_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define __FIVectorView_1_HSTRING_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define __FIVectorView_1_HSTRING_Release(This) (This)->lpVtbl->Release(This)
+/*** IInspectable methods ***/
+#define __FIVectorView_1_HSTRING_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
+#define __FIVectorView_1_HSTRING_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
+#define __FIVectorView_1_HSTRING_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
+/*** IVectorView<HSTRING > methods ***/
+#define __FIVectorView_1_HSTRING_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
+#define __FIVectorView_1_HSTRING_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
+#define __FIVectorView_1_HSTRING_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
+#define __FIVectorView_1_HSTRING_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT __FIVectorView_1_HSTRING_QueryInterface(__FIVectorView_1_HSTRING* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG __FIVectorView_1_HSTRING_AddRef(__FIVectorView_1_HSTRING* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG __FIVectorView_1_HSTRING_Release(__FIVectorView_1_HSTRING* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IInspectable methods ***/
+static FORCEINLINE HRESULT __FIVectorView_1_HSTRING_GetIids(__FIVectorView_1_HSTRING* This,ULONG *iidCount,IID **iids) {
+    return This->lpVtbl->GetIids(This,iidCount,iids);
+}
+static FORCEINLINE HRESULT __FIVectorView_1_HSTRING_GetRuntimeClassName(__FIVectorView_1_HSTRING* This,HSTRING *className) {
+    return This->lpVtbl->GetRuntimeClassName(This,className);
+}
+static FORCEINLINE HRESULT __FIVectorView_1_HSTRING_GetTrustLevel(__FIVectorView_1_HSTRING* This,TrustLevel *trustLevel) {
+    return This->lpVtbl->GetTrustLevel(This,trustLevel);
+}
+/*** IVectorView<HSTRING > methods ***/
+static FORCEINLINE HRESULT __FIVectorView_1_HSTRING_GetAt(__FIVectorView_1_HSTRING* This,UINT32 index,HSTRING *value) {
+    return This->lpVtbl->GetAt(This,index,value);
+}
+static FORCEINLINE HRESULT __FIVectorView_1_HSTRING_get_Size(__FIVectorView_1_HSTRING* This,UINT32 *value) {
+    return This->lpVtbl->get_Size(This,value);
+}
+static FORCEINLINE HRESULT __FIVectorView_1_HSTRING_IndexOf(__FIVectorView_1_HSTRING* This,HSTRING element,UINT32 *index,BOOLEAN *value) {
+    return This->lpVtbl->IndexOf(This,element,index,value);
+}
+static FORCEINLINE HRESULT __FIVectorView_1_HSTRING_GetMany(__FIVectorView_1_HSTRING* This,UINT32 start_index,UINT32 items_size,HSTRING *items,UINT32 *value) {
+    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
+}
+#endif
+#ifdef WIDL_using_Windows_Foundation_Collections
+#define IID_IVectorView_HSTRING IID___FIVectorView_1_HSTRING
+#define IVectorView_HSTRINGVtbl __FIVectorView_1_HSTRINGVtbl
+#define IVectorView_HSTRING __FIVectorView_1_HSTRING
+#define IVectorView_HSTRING_QueryInterface __FIVectorView_1_HSTRING_QueryInterface
+#define IVectorView_HSTRING_AddRef __FIVectorView_1_HSTRING_AddRef
+#define IVectorView_HSTRING_Release __FIVectorView_1_HSTRING_Release
+#define IVectorView_HSTRING_GetIids __FIVectorView_1_HSTRING_GetIids
+#define IVectorView_HSTRING_GetRuntimeClassName __FIVectorView_1_HSTRING_GetRuntimeClassName
+#define IVectorView_HSTRING_GetTrustLevel __FIVectorView_1_HSTRING_GetTrustLevel
+#define IVectorView_HSTRING_GetAt __FIVectorView_1_HSTRING_GetAt
+#define IVectorView_HSTRING_get_Size __FIVectorView_1_HSTRING_get_Size
+#define IVectorView_HSTRING_IndexOf __FIVectorView_1_HSTRING_IndexOf
+#define IVectorView_HSTRING_GetMany __FIVectorView_1_HSTRING_GetMany
+#endif /* WIDL_using_Windows_Foundation_Collections */
+#endif
+
+#endif
+
+#endif  /* ____FIVectorView_1_HSTRING_INTERFACE_DEFINED__ */
+
 /* Begin additional prototypes for all interfaces */
 
 ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
diff --git a/mingw-w64-headers/include/windows.foundation.idl b/mingw-w64-headers/include/windows.foundation.idl
index c4dc454..fe09dc6 100644
--- a/mingw-w64-headers/include/windows.foundation.idl
+++ b/mingw-w64-headers/include/windows.foundation.idl
@@ -127,6 +127,7 @@
         declare {
             interface Windows.Foundation.AsyncOperationCompletedHandler<boolean>;
             interface Windows.Foundation.IAsyncOperation<boolean>;
+            interface Windows.Foundation.Collections.IVectorView<HSTRING>;
         }
     }
 }
diff --git a/mingw-w64-headers/include/windows.media.speechsynthesis.h b/mingw-w64-headers/include/windows.media.speechsynthesis.h
index 242c979..51b8b8f 100644
--- a/mingw-w64-headers/include/windows.media.speechsynthesis.h
+++ b/mingw-w64-headers/include/windows.media.speechsynthesis.h
@@ -690,6 +690,7 @@
     HRESULT (STDMETHODCALLTYPE *GetMany)(
         __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
         UINT32 count,
+        UINT32 items_size,
         __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **items,
         UINT32 *value);
 
@@ -714,7 +715,7 @@
 #define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
 #define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
 #define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
-#define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetMany(This,count,items,value) (This)->lpVtbl->GetMany(This,count,items,value)
+#define __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetMany(This,count,items_size,items,value) (This)->lpVtbl->GetMany(This,count,items_size,items,value)
 #else
 /*** IUnknown methods ***/
 static FORCEINLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_QueryInterface(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,REFIID riid,void **ppvObject) {
@@ -746,8 +747,8 @@
 static FORCEINLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_MoveNext(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,WINBOOL *value) {
     return This->lpVtbl->MoveNext(This,value);
 }
-static FORCEINLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetMany(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,UINT32 count,__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **items,UINT32 *value) {
-    return This->lpVtbl->GetMany(This,count,items,value);
+static FORCEINLINE HRESULT __FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetMany(__FIIterator_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,UINT32 count,UINT32 items_size,__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **items,UINT32 *value) {
+    return This->lpVtbl->GetMany(This,count,items_size,items,value);
 }
 #endif
 #ifdef WIDL_using_Windows_Foundation_Collections
@@ -954,24 +955,25 @@
     /*** IVectorView<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > methods ***/
     HRESULT (STDMETHODCALLTYPE *GetAt)(
         __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
-        ULONG index,
+        UINT32 index,
         __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **value);
 
     HRESULT (STDMETHODCALLTYPE *get_Size)(
         __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
-        ULONG *value);
+        UINT32 *value);
 
     HRESULT (STDMETHODCALLTYPE *IndexOf)(
         __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
         __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *element,
-        ULONG *index,
+        UINT32 *index,
         BOOLEAN *value);
 
     HRESULT (STDMETHODCALLTYPE *GetMany)(
         __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation *This,
-        ULONG start_index,
+        UINT32 start_index,
+        UINT32 items_size,
         __x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **items,
-        ULONG *value);
+        UINT32 *value);
 
     END_INTERFACE
 } __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformationVtbl;
@@ -994,7 +996,7 @@
 #define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
 #define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
 #define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
-#define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetMany(This,start_index,items,value) (This)->lpVtbl->GetMany(This,start_index,items,value)
+#define __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
 #else
 /*** IUnknown methods ***/
 static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_QueryInterface(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,REFIID riid,void **ppvObject) {
@@ -1017,17 +1019,17 @@
     return This->lpVtbl->GetTrustLevel(This,trustLevel);
 }
 /*** IVectorView<ABI::Windows::Media::SpeechSynthesis::VoiceInformation* > methods ***/
-static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetAt(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,ULONG index,__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **value) {
+static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetAt(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,UINT32 index,__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **value) {
     return This->lpVtbl->GetAt(This,index,value);
 }
-static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_get_Size(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,ULONG *value) {
+static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_get_Size(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,UINT32 *value) {
     return This->lpVtbl->get_Size(This,value);
 }
-static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_IndexOf(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *element,ULONG *index,BOOLEAN *value) {
+static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_IndexOf(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation *element,UINT32 *index,BOOLEAN *value) {
     return This->lpVtbl->IndexOf(This,element,index,value);
 }
-static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetMany(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,ULONG start_index,__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **items,ULONG *value) {
-    return This->lpVtbl->GetMany(This,start_index,items,value);
+static FORCEINLINE HRESULT __FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation_GetMany(__FIVectorView_1_Windows__CMedia__CSpeechSynthesis__CVoiceInformation* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CMedia_CSpeechSynthesis_CIVoiceInformation **items,UINT32 *value) {
+    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
 }
 #endif
 #ifdef WIDL_using_Windows_Foundation_Collections
diff --git a/mingw-w64-headers/include/wuapi.h b/mingw-w64-headers/include/wuapi.h
new file mode 100644
index 0000000..99dd414
--- /dev/null
+++ b/mingw-w64-headers/include/wuapi.h
@@ -0,0 +1,6980 @@
+/*** 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__ */
diff --git a/mingw-w64-headers/include/wuapi.idl b/mingw-w64-headers/include/wuapi.idl
new file mode 100644
index 0000000..a0a8e43
--- /dev/null
+++ b/mingw-w64-headers/include/wuapi.idl
@@ -0,0 +1,1359 @@
+/*
+ * Copyright 2008 Hans Leidekker for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+import "oaidl.idl";
+
+#ifndef __WIDL__
+#define threading(model)
+#define progid(str)
+#define vi_progid(str)
+#endif
+
+[
+    helpstring("WUAPI 2.0 Type Library"),
+    uuid(b596cc9f-56e5-419e-a622-e01bb457431e),
+    version(2.0)
+]
+library WUApiLib {
+
+importlib("stdole2.tlb");
+
+interface ICategoryCollection;
+interface IStringCollection;
+interface IUpdateCollection;
+interface IUpdateDownloader;
+interface IUpdateInstaller;
+interface IUpdateSearcher;
+
+typedef [public] enum tagDownloadPriority
+{
+    dpLow    = 1,
+    dpNormal = 2,
+    dpHigh   = 3,
+} DownloadPriority;
+
+typedef [public] enum tagServerSelection
+{
+    ssDefault       = 0,
+    ssManagedServer = 1,
+    ssWindowsUpdate = 2,
+    ssOthers        = 3,
+} ServerSelection;
+
+typedef [public] enum tagAutomaticUpdatesNotificationLevel
+{
+    aunlNotConfigured,
+    aunlDisabled,
+    aunlNotifyBeforeDownload,
+    aunlNotifyBeforeInstallation,
+    aunlScheduledInstallation,
+} AutomaticUpdatesNotificationLevel;
+
+typedef [public] enum tagAutomaticUpdatesScheduledInstallationDay
+{
+    ausidEveryDay,
+    ausidEverySunday,
+    ausidEveryMonday,
+    ausidEveryTuesday,
+    ausidEveryWednesday,
+    ausidEveryThursday,
+    ausidEveryFriday,
+    ausidEverySaturday,
+} AutomaticUpdatesScheduledInstallationDay;
+
+typedef [public] enum tagDownloadPhase
+{
+    dphInitializing,
+    dphDownloading,
+    dphVerifying,
+} DownloadPhase;
+
+typedef [public] enum tagOperationResultCode
+{
+    orcNotStarted,
+    orcInProgress,
+    orcSucceeded,
+    orcSucceededWithErrors,
+    orcFailed,
+    orcAborted,
+} OperationResultCode;
+
+typedef [public] enum tagUpdateExceptionContext
+{
+    uecGeneral = 1,
+    uecWindowsDriver,
+    uecWindowsInstaller
+} UpdateExceptionContext;
+
+typedef [public] enum tagInstallationImpact
+{
+    iiNormal,
+    iiMinor,
+    iiRequiresExclusiveHandling
+} InstallationImpact;
+
+typedef [public] enum tagInstallationRebootBehavior
+{
+    irbNeverReboots,
+    irbAlwaysRequiresReboot,
+    irbCanRequestReboot
+} InstallationRebootBehavior;
+
+typedef [public] enum tagUpdateType
+{
+    utSoftware = 1,
+    utDriver
+} UpdateType;
+
+typedef [public] enum tagUpdateOperation
+{
+    uoInstallation = 1,
+    uoUninstallation
+} UpdateOperation;
+
+typedef [public] enum tagDeploymentAction
+{
+    daNone,
+    daInstallation,
+    daUninstallation,
+    daDetection
+} DeploymentAction;
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(2ee48f22-af3c-405f-8970-f71be12ee9a2),
+    pointer_default(unique)
+]
+interface IAutomaticUpdatesSettings : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT NotificationLevel( [out, retval] AutomaticUpdatesNotificationLevel *retval );
+
+    [propput, id(0x60020001)]
+    HRESULT NotificationLevel( [in] AutomaticUpdatesNotificationLevel value );
+
+    [propget, id(0x60020002)]
+    HRESULT ReadOnly( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT Required( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020004)]
+    HRESULT ScheduledInstallationDay( [out, retval] AutomaticUpdatesScheduledInstallationDay *retval );
+
+    [propput, id(0x60020004)]
+    HRESULT ScheduledInstallationDay( [in] AutomaticUpdatesScheduledInstallationDay value );
+
+    [propget, id(0x60020005)]
+    HRESULT ScheduledInstallationTime( [out, retval] LONG *retval );
+
+    [propput, id(0x60020005)]
+    HRESULT ScheduledInstallationTime( [in] LONG value );
+
+    [id(0x60020006)]
+    HRESULT Refresh();
+
+    [id(0x60020007)]
+    HRESULT Save();
+}
+
+[
+    object,
+    uuid(673425bf-c082-4c7c-bdfd-569464b8e0ce),
+    oleautomation,
+    dual,
+    nonextensible,
+    pointer_default(unique),
+    hidden
+]
+interface IAutomaticUpdates : IDispatch
+{
+    HRESULT DetectNow();
+    HRESULT Pause();
+    HRESULT Resume();
+    HRESULT ShowSettingsDialog();
+
+    [propget]
+    HRESULT Settings(
+        [out, retval] IAutomaticUpdatesSettings **retval);
+
+    [propget]
+    HRESULT ServiceEnabled(
+        [out, retval] VARIANT_BOOL *retval);
+
+    HRESULT EnableService();
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(174c81fe-aecd-4dae-b8a0-2c6318dd86a8),
+    pointer_default(unique),
+]
+interface IWebProxy : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT Address( [out, retval] BSTR *retval );
+
+    [propput, id(0x60020001)]
+    HRESULT Address( [in] BSTR value );
+
+    [propget, id(0x60020002)]
+    HRESULT BypassList( [out, retval] IStringCollection **retval );
+
+    [propput, id(0x60020002)]
+    HRESULT BypassList( [in] IStringCollection *value );
+
+    [propget, id(0x60020003)]
+    HRESULT BypassProxyOnLocal( [out, retval] VARIANT_BOOL *retval );
+
+    [propput, id(0x60020003)]
+    HRESULT BypassProxyOnLocal( [in] VARIANT_BOOL value );
+
+    [propget, id(0x60020004)]
+    HRESULT ReadOnly( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020005)]
+    HRESULT UserName( [out, retval] BSTR *retval );
+
+    [propput, id(0x60020005)]
+    HRESULT UserName( [in] BSTR value );
+
+    [id(0x60020006)]
+    HRESULT SetPassword( [in] BSTR value );
+
+    [id(0x60020007)]
+    HRESULT PromptForCredentials( [in, unique] IUnknown *parentWindow,
+                                  [in] BSTR title );
+
+    [restricted, id(0x60020008)]
+    HRESULT PromptForCredentialsFromHwnd( [in, unique] HWND parentWindow,
+                                          [in] BSTR title );
+
+    [propget, id(0x60020009)]
+    HRESULT AutoDetect( [out, retval] VARIANT_BOOL *retval );
+
+    [propput, id(0x60020009)]
+    HRESULT AutoDetect( [in] VARIANT_BOOL value );
+}
+
+[
+    object,
+    uuid(816858a4-260d-4260-933a-2585f1abc76b),
+    oleautomation,
+    dual,
+    nonextensible,
+    pointer_default(unique),
+]
+interface IUpdateSession : IDispatch
+{
+    [propget]
+    HRESULT ClientApplicationID(
+        [out, retval] BSTR *retval);
+
+    [propput]
+    HRESULT ClientApplicationID(
+        [in] BSTR value);
+
+    [propget]
+    HRESULT ReadOnly(
+        [out, retval] VARIANT_BOOL *retval);
+
+    [propget]
+    HRESULT WebProxy(
+        [out, retval] IWebProxy **retval);
+
+    [propput]
+    HRESULT WebProxy(
+        [in, unique] IWebProxy *value);
+
+    HRESULT CreateUpdateSearcher(
+        [out, retval] IUpdateSearcher **retval);
+
+    HRESULT CreateUpdateDownloader(
+        [out, retval] IUpdateDownloader **retval);
+
+    HRESULT CreateUpdateInstaller(
+        [out, retval] IUpdateInstaller **retval);
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(7c907864-346c-4aeb-8f3f-57da289f969f),
+    pointer_default(unique),
+]
+interface IImageInformation : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT AltText( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT Height( [out, retval] LONG *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT Source( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020004)]
+    HRESULT Width( [out, retval] LONG *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(81ddc1b8-9d35-47a6-b471-5b80f519223b),
+    pointer_default(unique),
+]
+interface ICategory : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Name( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020001)]
+    HRESULT CategoryID( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT Children( [out, retval] ICategoryCollection **retval );
+
+    [propget, id(0x60020003)]
+    HRESULT Description( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020004)]
+    HRESULT Image( [out, retval] IImageInformation **retval );
+
+    [propget, id(0x60020005)]
+    HRESULT Order( [out, retval] LONG *retval );
+
+    [propget, id(0x60020006)]
+    HRESULT Parent( [out, retval] ICategory **retval );
+
+    [propget, id(0x60020007)]
+    HRESULT Type( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020008)]
+    HRESULT Updates( [out, retval] IUpdateCollection **retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(3a56bfb8-576c-43f7-9335-fe4838fd7e37),
+    pointer_default(unique),
+]
+interface ICategoryCollection : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                [out, retval] ICategory **retval );
+
+    [propget, id(DISPID_NEWENUM)]
+    HRESULT _NewEnum( [out, retval] IUnknown **retval );
+
+    [propget, id(0x60020001)]
+    HRESULT Count( [out, retval] LONG *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(eff90582-2ddc-480f-a06d-60f3fbc362c3),
+    pointer_default(unique),
+    hidden
+]
+interface IStringCollection : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                  [out, retval] BSTR *retval );
+
+    [propput, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                [in] BSTR value );
+
+    [propget, id(DISPID_NEWENUM)]
+    HRESULT _NewEnum( [out, retval] IUnknown **retval );
+
+    [propget, id(0x60020001)]
+    HRESULT Count( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT ReadOnly( [out, retval] VARIANT_BOOL *retval );
+
+    [id(0x60020003)]
+    HRESULT Add( [in] BSTR value,
+                 [out, retval] LONG *retval );
+
+    [id(0x60020004)]
+    HRESULT Clear();
+
+    [id(0x60020005)]
+    HRESULT Copy( [out, retval] IStringCollection **retval );
+
+    [id(0x60020006)]
+    HRESULT Insert( [in] LONG index,
+                    [in] BSTR value );
+
+    [id(0x60020007)]
+    HRESULT RemoveAt( [in] LONG index );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(a376dd5e-09d4-427f-af7c-fed5b6e1c1d6),
+    pointer_default(unique),
+]
+interface IUpdateException : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Message( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020001)]
+    HRESULT HResult( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT Context( [out, retval] UpdateExceptionContext *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(503626a3-8e14-4729-9355-0fe664bd2321),
+    pointer_default(unique),
+]
+interface IUpdateExceptionCollection : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                  [out, retval] IUpdateException **retval );
+
+    [propget, id(DISPID_NEWENUM)]
+    HRESULT _NewEnum( [out, retval] IUnknown **retval );
+
+    [propget, id(0x60020001)]
+    HRESULT Count( [out, retval] LONG *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(46297823-9940-4c09-aed9-cd3ea6d05968),
+    pointer_default(unique)
+]
+interface IUpdateIdentity : IDispatch
+{
+    [propget, id(0x60020002)]
+    HRESULT RevisionNumber( [out, retval] LONG *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT UpdateID( [out, retval] BSTR *retval );
+}
+
+[
+    ,
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(d9a59339-e245-4dbd-9686-4d5763e39624),
+    pointer_default(unique),
+]
+interface IInstallationBehavior : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT CanRequestUserInput( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT Impact( [out, retval] InstallationImpact *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT RebootBehavior( [out, retval] InstallationRebootBehavior *retval );
+
+    [propget, id(0x60020004)]
+    HRESULT RequiresNetworkConnectivity( [out, retval] VARIANT_BOOL *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(54a2cb2d-9a0c-48b6-8a50-9abb69ee2d02),
+    pointer_default(unique),
+]
+interface IUpdateDownloadContent : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT DownloadUrl( [out, retval] BSTR *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(bc5513c8-b3b8-4bf7-a4d4-361c0d8c88ba),
+    pointer_default(unique),
+]
+interface IUpdateDownloadContentCollection : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                  [out, retval] IUpdateDownloadContent **retval );
+
+    [propget, id(DISPID_NEWENUM)]
+    HRESULT _NewEnum( [out, retval] IUnknown **retval );
+
+    [propget, id(0x60020001)]
+    HRESULT Count( [out, retval] LONG *retval );
+}
+
+[
+
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(6a92b07a-d821-4682-b423-5c805022cc4d),
+    pointer_default(unique),
+]
+interface IUpdate : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Title( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020001)]
+    HRESULT AutoSelectOnWebSites( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT BundledUpdates( [out, retval] IUpdateCollection **retval );
+
+    [propget, id(0x60020003)]
+    HRESULT CanRequireSource( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020004)]
+    HRESULT Categories( [out, retval] ICategoryCollection **retval );
+
+    [propget, id(0x60020005)]
+    HRESULT Deadline( [out, retval] VARIANT *retval );
+
+    [propget, id(0x60020006)]
+    HRESULT DeltaCompressedContentAvailable( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020007)]
+    HRESULT DeltaCompressedContentPreferred( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020008)]
+    HRESULT Description( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020009)]
+    HRESULT EulaAccepted( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x6002000a)]
+    HRESULT EulaText( [out, retval] BSTR *retval );
+
+    [propget, id(0x6002000b)]
+    HRESULT HandlerID( [out, retval] BSTR *retval );
+
+    [propget, id(0x6002000c)]
+    HRESULT Identity( [out, retval] IUpdateIdentity **retval );
+
+    [propget, id(0x6002000d)]
+    HRESULT Image( [out, retval] IImageInformation **retval );
+
+    [propget, id(0x6002000e)]
+    HRESULT InstallationBehavior( [out, retval] IInstallationBehavior **retval );
+
+    [propget, id(0x6002000f)]
+    HRESULT IsBeta( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020010)]
+    HRESULT IsDownloaded( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020011)]
+    HRESULT IsHidden( [out, retval] VARIANT_BOOL *retval );
+
+    [propput, id(0x60020011)]
+    HRESULT IsHidden( [in] VARIANT_BOOL value );
+
+    [propget, id(0x60020012)]
+    HRESULT IsInstalled( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020013)]
+    HRESULT IsMandatory( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020014)]
+    HRESULT IsUninstallable( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020015)]
+    HRESULT Languages( [out, retval] IStringCollection **retval );
+
+    [propget, id(0x60020016)]
+    HRESULT LastDeploymentChangeTime( [out, retval] DATE *retval );
+
+    [propget, id(0x60020017)]
+    HRESULT MaxDownloadSize( [out, retval] DECIMAL *retval );
+
+    [propget, id(0x60020018)]
+    HRESULT MinDownloadSize( [out, retval] DECIMAL *retval );
+
+    [propget, id(0x60020019)]
+    HRESULT MoreInfoUrls( [out, retval] IStringCollection **retval );
+
+    [propget, id(0x6002001a)]
+    HRESULT MsrcSeverity( [out, retval] BSTR *retval );
+
+    [propget, id(0x6002001b)]
+    HRESULT RecommendedCpuSpeed( [out, retval] LONG *retval );
+
+    [propget, id(0x6002001c)]
+    HRESULT RecommendedHardDiskSpace( [out, retval] LONG *retval );
+
+    [propget, id(0x6002001d)]
+    HRESULT RecommendedMemory( [out, retval] LONG *retval );
+
+    [propget, id(0x6002001e)]
+    HRESULT ReleaseNotes( [out, retval] BSTR *retval );
+
+    [propget, id(0x6002001f)]
+    HRESULT SecurityBulletinIDs( [out, retval] IStringCollection **retval );
+
+    [propget, id(0x60020021)]
+    HRESULT SupersededUpdateIDs( [out, retval] IStringCollection **retval );
+
+    [propget, id(0x60020022)]
+    HRESULT SupportUrl( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020023)]
+    HRESULT Type( [out, retval] UpdateType *retval );
+
+    [propget, id(0x60020024)]
+    HRESULT UninstallationNotes( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020025)]
+    HRESULT UninstallationBehavior( [out, retval] IInstallationBehavior **retval );
+
+    [propget, id(0x60020026)]
+    HRESULT UninstallationSteps( [out, retval] IStringCollection **retval );
+
+    [propget, id(0x60020028)]
+    HRESULT KBArticleIDs( [out, retval] IStringCollection **retval );
+
+    [id(0x60020027)]
+    HRESULT AcceptEula();
+
+    [propget, id(0x60020029)]
+    HRESULT DeploymentAction( [out, retval] DeploymentAction *retval );
+
+    [id(0x6002002a)]
+    HRESULT CopyFromCache( [in, ref] BSTR path,
+                           [in] VARIANT_BOOL toExtractCabFiles );
+
+    [propget, id(0x6002002b)]
+    HRESULT DownloadPriority( [out, retval] DownloadPriority *retval );
+
+    [propget, id(0x6002002c)]
+    HRESULT DownloadContents( [out, retval] IUpdateDownloadContentCollection **retval );
+}
+
+[
+
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(07f7438c-7709-4ca5-b518-91279288134e),
+    pointer_default(unique),
+    hidden
+]
+interface IUpdateCollection : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                  [out, retval] IUpdate **retval );
+
+    [propput, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                  [in] IUpdate *value );
+
+    [propget, id(DISPID_NEWENUM)]
+    HRESULT _NewEnum( [out, retval] IUnknown **retval );
+
+    [propget, id(0x60020001)]
+    HRESULT Count( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT ReadOnly( [out, retval] VARIANT_BOOL *retval );
+
+    [id(0x60020003)]
+    HRESULT Add( [in] IUpdate *value,
+                 [out, retval] LONG *retval );
+
+    [id(0x60020004)]
+    HRESULT Clear();
+
+    [id(0x60020005)]
+    HRESULT Copy( [out, retval] IUpdateCollection **retval );
+
+    [id(0x60020006)]
+    HRESULT Insert( [in] LONG index,
+                [in] IUpdate *value );
+
+    [id(0x60020007)]
+    HRESULT RemoveAt( [in] LONG index );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(7366ea16-7a1a-4ea2-b042-973d3e9cd99b),
+    pointer_default(unique),
+]
+interface ISearchJob : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT AsyncState( [out, retval] VARIANT *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT IsCompleted( [out, retval] VARIANT_BOOL *retval );
+
+    [id(0x60020003)]
+    HRESULT CleanUp();
+
+    [id(0x60020004)]
+    HRESULT RequestAbort();
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(d40cff62-e08c-4498-941a-01e25f0fd33c),
+    pointer_default(unique),
+]
+interface ISearchResult : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT ResultCode( [out, retval] OperationResultCode *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT RootCategories( [out, retval] ICategoryCollection **retval );
+
+    [propget, id(0x60020003)]
+    HRESULT Updates( [out, retval] IUpdateCollection **retval );
+
+    [propget, id(0x60020004)]
+    HRESULT Warnings( [out, retval] IUpdateExceptionCollection **retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(be56a644-af0e-4e0e-a311-c1d8e695cbff),
+    pointer_default(unique),
+]
+interface IUpdateHistoryEntry : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT Operation( [out, retval] UpdateOperation *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT ResultCode( [out, retval] OperationResultCode *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT HResult( [out, retval] LONG *retval );
+
+    [propget, id(0x60020004)]
+    HRESULT Date( [out, retval] DATE *retval );
+
+    [propget, id(0x60020005)]
+    HRESULT UpdateIdentity( [out, retval] IUpdateIdentity **retval );
+
+    [propget, id(0x60020006)]
+    HRESULT Title( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020007)]
+    HRESULT Description( [out, retval] BSTR *retval );
+
+    [propget, id(0x60020008)]
+    HRESULT UnmappedResultCode( [out, retval] LONG *retval );
+
+    [propget, id(0x60020009)]
+    HRESULT ClientApplicationID( [out, retval] BSTR *retval );
+
+    [propget, id(0x6002000a)]
+    HRESULT ServerSelection( [out, retval] ServerSelection *retval );
+
+    [propget, id(0x6002000b)]
+    HRESULT ServiceID( [out, retval] BSTR *retval );
+
+    [propget, id(0x6002000c)]
+    HRESULT UninstallationSteps( [out, retval] IStringCollection **retval );
+
+    [propget, id(0x6002000d)]
+    HRESULT UninstallationNotes( [out, retval] BSTR *retval );
+
+    [propget, id(0x6002000e)]
+    HRESULT SupportUrl( [out, retval] BSTR *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(a7f04f3c-a290-435b-aadf-a116c3357a5c),
+    pointer_default(unique),
+]
+interface IUpdateHistoryEntryCollection : IDispatch
+{
+    [propget, id(DISPID_VALUE)]
+    HRESULT Item( [in] LONG index,
+                  [out, retval] IUpdateHistoryEntry **retval );
+
+    [propget, id(DISPID_NEWENUM)]
+    HRESULT _NewEnum( [out, retval] IUnknown **retval );
+
+    [propget, id(0x60020001)]
+    HRESULT Count( [out, retval] LONG *retval );
+}
+
+[
+    object,
+    uuid(8f45abf1-f9ae-4b95-a933-f0f66e5056ea),
+    oleautomation,
+    dual,
+    nonextensible,
+    pointer_default(unique),
+]
+interface IUpdateSearcher : IDispatch
+{
+    [propget]
+    HRESULT CanAutomaticallyUpgradeService(
+        [out, retval] VARIANT_BOOL *retval);
+
+    [propput]
+    HRESULT CanAutomaticallyUpgradeService(
+        [in] VARIANT_BOOL value);
+
+    [propget]
+    HRESULT ClientApplicationID(
+        [out, retval] BSTR *retval);
+
+    [propput]
+    HRESULT ClientApplicationID(
+        [in] BSTR value);
+
+    [propget]
+    HRESULT IncludePotentiallySupersededUpdates(
+        [out, retval] VARIANT_BOOL *retval);
+
+    [propput]
+    HRESULT IncludePotentiallySupersededUpdates(
+        [in] VARIANT_BOOL value);
+
+    [propget]
+    HRESULT ServerSelection(
+        [out, retval] ServerSelection *retval);
+
+    [propput]
+    HRESULT ServerSelection(
+        [in] ServerSelection value);
+
+    HRESULT BeginSearch(
+        [in] BSTR criteria,
+        [in] IUnknown *onCompleted,
+        [in] VARIANT state,
+        [out, retval] ISearchJob **retval);
+
+    HRESULT EndSearch(
+        [in] ISearchJob *searchJob,
+        [out, retval] ISearchResult **retval);
+
+    HRESULT EscapeString(
+        [in] BSTR unescaped,
+        [out, retval] BSTR *retval);
+
+    HRESULT QueryHistory(
+        [in] LONG startIndex,
+        [in] LONG count,
+        [out, retval] IUpdateHistoryEntryCollection **retval);
+
+    HRESULT Search(
+        [in] BSTR criteria,
+        [out, retval] ISearchResult **retval);
+
+    [propget]
+    HRESULT Online(
+        [out, retval] VARIANT_BOOL *retval);
+
+    [propput]
+    HRESULT Online(
+        [in] VARIANT_BOOL value);
+
+    HRESULT GetTotalHistoryCount(
+        [out, retval] LONG *retval);
+
+    [propget]
+    HRESULT ServiceID(
+        [out, retval] BSTR *retval);
+
+    [propput]
+    HRESULT ServiceID(
+        [in] BSTR value);
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(bf99af76-b575-42ad-8aa4-33cbb5477af1),
+    pointer_default(unique),
+]
+interface IUpdateDownloadResult : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT HResult( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT ResultCode( [out, retval] OperationResultCode *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(d31a5bac-f719-4178-9dbb-5e2cb47fd18a),
+    pointer_default(unique),
+]
+interface IDownloadProgress : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT CurrentUpdateBytesDownloaded( [out, retval] DECIMAL *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT CurrentUpdateBytesToDownload( [out, retval] DECIMAL *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT CurrentUpdateIndex( [out, retval] LONG *retval );
+
+    [propget, id(0x60020004)]
+    HRESULT PercentComplete( [out, retval] LONG *retval );
+
+    [propget, id(0x60020005)]
+    HRESULT TotalBytesDownloaded( [out, retval] DECIMAL *retval );
+
+    [propget, id(0x60020006)]
+    HRESULT TotalBytesToDownload( [out, retval] DECIMAL *retval );
+
+    [id(0x60020007)]
+    HRESULT GetUpdateResult( [in] LONG updateIndex,
+                             [out, retval] IUpdateDownloadResult **retval );
+
+
+    [propget, id(0x60020008)]
+    HRESULT CurrentUpdateDownloadPhase( [out, retval] DownloadPhase *retval );
+
+    [propget, id(0x60020009)]
+    HRESULT CurrentUpdatePercentComplete( [out, retval] LONG *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(c574de85-7358-43f6-aae8-8697e62d8ba7),
+    pointer_default(unique),
+]
+interface IDownloadJob : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT AsyncState( [out, retval] VARIANT *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT IsCompleted( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT Updates( [out, retval] IUpdateCollection **retval );
+
+    [id(0x60020004)]
+    HRESULT CleanUp();
+
+    [id(0x60020005)]
+    HRESULT GetProgress( [out, retval] IDownloadProgress **retval );
+
+    [id(0x60020006)]
+    HRESULT RequestAbort();
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(daa4fdd0-4727-4dbe-a1e7-745dca317144),
+    pointer_default(unique),
+]
+interface IDownloadResult : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT HResult( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT ResultCode( [out, retval] OperationResultCode *retval );
+
+    [id(0x60020003)]
+    HRESULT GetUpdateResult( [in] LONG updateIndex,
+                             [out, retval] IUpdateDownloadResult **retval );
+}
+
+[
+    object,
+    uuid(68f1c6f9-7ecc-4666-a464-247fe12496c3),
+    oleautomation,
+    dual,
+    nonextensible,
+    pointer_default(unique),
+    hidden
+]
+interface IUpdateDownloader : IDispatch
+{
+    [propget]
+    HRESULT ClientApplicationID(
+        [out, retval] BSTR *retval);
+
+    [propput]
+    HRESULT ClientApplicationID(
+        [in] BSTR value);
+
+    [propget]
+    HRESULT IsForced(
+        [out, retval] VARIANT_BOOL *retval);
+
+    [propput]
+    HRESULT IsForced(
+        [in] VARIANT_BOOL value);
+
+    [propget]
+    HRESULT Priority(
+        [out, retval] DownloadPriority *retval);
+
+    [propput]
+    HRESULT Priority(
+        [in] DownloadPriority value);
+
+    [propget]
+    HRESULT Updates(
+        [out, retval] IUpdateCollection **retval);
+
+    [propput]
+    HRESULT Updates(
+        [in] IUpdateCollection *value);
+
+    HRESULT BeginDownload(
+        [in] IUnknown *onProgressChanged,
+        [in] IUnknown *onCompleted,
+        [in] VARIANT state,
+        [out, retval] IDownloadJob **retval);
+
+    HRESULT Download(
+        [out, retval] IDownloadResult **retval);
+
+    HRESULT EndDownload(
+        [in] IDownloadJob *value,
+        [out, retval] IDownloadResult **retval);
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(d940f0f8-3cbb-4fd0-993f-471e7f2328ad),
+    pointer_default(unique),
+]
+interface IUpdateInstallationResult : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT HResult( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT RebootRequired( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT ResultCode( [out, retval] OperationResultCode *retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(345c8244-43a3-4e32-a368-65f073b76f36),
+    pointer_default(unique),
+]
+interface IInstallationProgress : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT CurrentUpdateIndex( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT CurrentUpdatePercentComplete( [out, retval] LONG *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT PercentComplete( [out, retval] LONG *retval );
+
+    [id(0x60020004)]
+    HRESULT GetUpdateResult( [in] LONG updateIndex,
+                             [out, retval] IUpdateInstallationResult **retval );
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(5c209f0b-bad5-432a-9556-4699bed2638a),
+    pointer_default(unique),
+]
+interface IInstallationJob : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT AsyncState( [out, retval] VARIANT *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT IsCompleted( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT Updates( [out, retval] IUpdateCollection **retval );
+
+    [id(0x60020004)]
+    HRESULT CleanUp();
+
+    [id(0x60020005)]
+    HRESULT GetProgress( [out, retval] IInstallationProgress **retval );
+
+    [id(0x60020006)]
+    HRESULT RequestAbort();
+}
+
+[
+    object,
+    oleautomation,
+    dual,
+    nonextensible,
+    uuid(a43c56d6-7451-48d4-af96-b6cd2d0d9b7a),
+    pointer_default(unique),
+]
+interface IInstallationResult : IDispatch
+{
+    [propget, id(0x60020001)]
+    HRESULT HResult( [out, retval] LONG *retval );
+
+    [propget, id(0x60020002)]
+    HRESULT RebootRequired( [out, retval] VARIANT_BOOL *retval );
+
+    [propget, id(0x60020003)]
+    HRESULT ResultCode( [out, retval] OperationResultCode *retval );
+
+    [id(0x60020004)]
+    HRESULT GetUpdateResult( [in] LONG updateIndex,
+                             [out, retval] IUpdateInstallationResult **retval );
+}
+
+[
+    object,
+    uuid(7b929c68-ccdc-4226-96b1-8724600b54c2),
+    oleautomation,
+    dual,
+    nonextensible,
+    pointer_default(unique),
+]
+interface IUpdateInstaller : IDispatch
+{
+    [propget]
+    HRESULT ClientApplicationID(
+        [out, retval] BSTR *retval);
+
+    [propput]
+    HRESULT ClientApplicationID(
+        [in] BSTR value);
+
+    [propget]
+    HRESULT IsForced(
+        [out, retval] VARIANT_BOOL *retval);
+
+    [propput]
+    HRESULT IsForced(
+        [in] VARIANT_BOOL value);
+
+    [propget, restricted]
+    HRESULT ParentHwnd(
+        [out, retval] HWND *retval);
+
+    [propput, restricted]
+    HRESULT ParentHwnd(
+        [in, unique] HWND value);
+
+    [propput]
+    HRESULT ParentWindow(
+        [in, unique] IUnknown *value);
+
+    [propget]
+    HRESULT ParentWindow(
+        [out, retval] IUnknown **retval);
+
+    [propget]
+    HRESULT Updates(
+        [out, retval] IUpdateCollection **retval);
+
+    [propput]
+    HRESULT Updates(
+        [in] IUpdateCollection *value);
+
+    HRESULT BeginInstall(
+        [in] IUnknown *onProgressChanged,
+        [in] IUnknown *onCompleted,
+        [in] VARIANT state,
+        [out, retval] IInstallationJob **retval);
+
+    HRESULT BeginUninstall(
+        [in] IUnknown *onProgressChanged,
+        [in] IUnknown *onCompleted,
+        [in] VARIANT state,
+        [out, retval] IInstallationJob **retval);
+
+    HRESULT EndInstall(
+        [in] IInstallationJob *value,
+        [out, retval] IInstallationResult **retval);
+
+    HRESULT EndUninstall(
+        [in] IInstallationJob *value,
+        [out, retval] IInstallationResult **retval);
+
+    HRESULT Install(
+        [out, retval] IInstallationResult **retval);
+
+    HRESULT RunWizard(
+        [in, defaultvalue("")] BSTR dialogTitle,
+        [out, retval] IInstallationResult **retval);
+
+    [propget]
+    HRESULT IsBusy(
+        [out, retval] VARIANT_BOOL *retval);
+
+    HRESULT Uninstall(
+        [out, retval] IInstallationResult **retval);
+
+    [propget]
+    HRESULT AllowSourcePrompts(
+        [out, retval] VARIANT_BOOL *retval);
+
+    [propput]
+    HRESULT AllowSourcePrompts(
+        [in] VARIANT_BOOL value);
+
+    [propget]
+    HRESULT RebootRequiredBeforeInstallation(
+        [out, retval] VARIANT_BOOL *retval);
+}
+
+[
+    object,
+    uuid(ADE87BF7-7B56-4275-8FAB-B9B0E591844B),
+    oleautomation,
+    hidden,
+    dual,
+    nonextensible,
+    pointer_default(unique),
+]
+interface ISystemInformation : IDispatch
+{
+    [propget]
+    HRESULT OemHardwareSupportLink(
+        [out, retval] BSTR *retval);
+
+    [propget]
+    HRESULT RebootRequired(
+        [out, retval] VARIANT_BOOL *retval);
+}
+
+[
+    helpstring("AutomaticUpdates Class"),
+    threading(both),
+    progid("Microsoft.Update.AutoUpdate.1"),
+    vi_progid("Microsoft.Update.AutoUpdate"),
+    uuid(bfe18e9c-6d87-4450-b37c-e02f0b373803)
+]
+coclass AutomaticUpdates { interface IAutomaticUpdates; }
+
+[
+    helpstring("UpdateInstaller Class"),
+    threading(both),
+    progid("Microsoft.Update.Installer.1"),
+    vi_progid("Microsoft.Update.Installer"),
+    uuid(d2e0fe7f-d23e-48e1-93c0-6fa8cc346474)
+]
+coclass UpdateInstaller { interface IUpdateInstaller; }
+
+[
+    helpstring("UpdateSession Class"),
+    threading(both),
+    progid("Microsoft.Update.Session.1"),
+    vi_progid("Microsoft.Update.Session"),
+    uuid(4cb43d7f-7eee-4906-8698-60da1c38f2fe)
+]
+coclass UpdateSession { interface IUpdateSession; }
+
+[
+    helpstring("SystemInformation Class"),
+    threading(both),
+    progid("Microsoft.Update.SystemInfo.1"),
+    vi_progid("Microsoft.Update.SystemInfo"),
+    uuid(C01B9BA0-BEA7-41BA-B604-D0A36F469133)
+]
+coclass SystemInformation { interface ISystemInformation; }
+
+} /* WUApiLib */
