mshtml: COM cleanup for the IHTMLWindow2 iface.

Michael Stefaniuc mstefani at redhat.de
Mon Dec 27 05:50:32 CST 2010


---
Jacek, I don't like the usage of impl_from_IHTMLWindow2() in
HTMLWindow_invoke() as that isn't a method of the IHTMLWindow2 vtbl. Can
you please cross check that and clean it up if necessary?

thanks
bye
	michael



 dlls/mshtml/htmldoc.c        |   12 +-
 dlls/mshtml/htmlframe.c      |    2 +-
 dlls/mshtml/htmlframebase.c  |    4 +-
 dlls/mshtml/htmlwindow.c     |  228 +++++++++++++++++++++---------------------
 dlls/mshtml/mshtml_private.h |    3 +-
 dlls/mshtml/nsio.c           |   12 +-
 dlls/mshtml/nsservice.c      |    2 +-
 dlls/mshtml/oleobj.c         |    2 +-
 dlls/mshtml/persist.c        |    2 +-
 dlls/mshtml/script.c         |    2 +-
 10 files changed, 135 insertions(+), 134 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 7fab469..677a83a 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -105,7 +105,7 @@ static HRESULT WINAPI HTMLDocument_get_Script(IHTMLDocument2 *iface, IDispatch *
 
     TRACE("(%p)->(%p)\n", This, p);
 
-    *p = (IDispatch*)HTMLWINDOW2(This->window);
+    *p = (IDispatch*)&This->window->IHTMLWindow2_iface;
     IDispatch_AddRef(*p);
     return S_OK;
 }
@@ -579,7 +579,7 @@ static HRESULT WINAPI HTMLDocument_get_location(IHTMLDocument2 *iface, IHTMLLoca
         return E_UNEXPECTED;
     }
 
-    return IHTMLWindow2_get_location(HTMLWINDOW2(This->window), p);
+    return IHTMLWindow2_get_location(&This->window->IHTMLWindow2_iface, p);
 }
 
 static HRESULT WINAPI HTMLDocument_get_lastModified(IHTMLDocument2 *iface, BSTR *p)
@@ -872,8 +872,8 @@ static HRESULT WINAPI HTMLDocument_open(IHTMLDocument2 *iface, BSTR url, VARIANT
         return E_FAIL;
     }
 
-    *pomWindowResult = (IDispatch*)HTMLWINDOW2(This->window);
-    IHTMLWindow2_AddRef(HTMLWINDOW2(This->window));
+    *pomWindowResult = (IDispatch*)&This->window->IHTMLWindow2_iface;
+    IHTMLWindow2_AddRef(&This->window->IHTMLWindow2_iface);
     return S_OK;
 }
 
@@ -1302,7 +1302,7 @@ static HRESULT WINAPI HTMLDocument_get_parentWindow(IHTMLDocument2 *iface, IHTML
 
     TRACE("(%p)->(%p)\n", This, p);
 
-    *p = HTMLWINDOW2(This->window);
+    *p = &This->window->IHTMLWindow2_iface;
     IHTMLWindow2_AddRef(*p);
     return S_OK;
 }
@@ -2097,7 +2097,7 @@ static ULONG WINAPI CustomDoc_Release(ICustomDoc *iface)
         }
         if(This->basedoc.window) {
             This->basedoc.window->doc_obj = NULL;
-            IHTMLWindow2_Release(HTMLWINDOW2(This->basedoc.window));
+            IHTMLWindow2_Release(&This->basedoc.window->IHTMLWindow2_iface);
         }
         if(This->basedoc.advise_holder)
             IOleAdviseHolder_Release(This->basedoc.advise_holder);
diff --git a/dlls/mshtml/htmlframe.c b/dlls/mshtml/htmlframe.c
index 4ab3a48..12dff34 100644
--- a/dlls/mshtml/htmlframe.c
+++ b/dlls/mshtml/htmlframe.c
@@ -105,7 +105,7 @@ static HRESULT WINAPI HTMLFrameElement3_get_contentDocument(IHTMLFrameElement3 *
         return E_FAIL;
     }
 
-    hres = IHTMLWindow2_get_document(HTMLWINDOW2(This->framebase.content_window), &doc);
+    hres = IHTMLWindow2_get_document(&This->framebase.content_window->IHTMLWindow2_iface, &doc);
     if(FAILED(hres))
         return hres;
 
diff --git a/dlls/mshtml/htmlframebase.c b/dlls/mshtml/htmlframebase.c
index d7e5b90..4edec99 100644
--- a/dlls/mshtml/htmlframebase.c
+++ b/dlls/mshtml/htmlframebase.c
@@ -430,8 +430,8 @@ static HRESULT WINAPI HTMLFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface, I
     TRACE("(%p)->(%p)\n", This, p);
 
     if(This->content_window) {
-        IHTMLWindow2_AddRef(HTMLWINDOW2(This->content_window));
-        *p = HTMLWINDOW2(This->content_window);
+        IHTMLWindow2_AddRef(&This->content_window->IHTMLWindow2_iface);
+        *p = &This->content_window->IHTMLWindow2_iface;
     }else {
         WARN("NULL content window\n");
         *p = NULL;
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index fa3318c..1731024 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -119,7 +119,7 @@ static void release_children(HTMLWindow *This)
 
         list_remove(&child->sibling_entry);
         child->parent = NULL;
-        IHTMLWindow2_Release(HTMLWINDOW2(child));
+        IHTMLWindow2_Release(&child->IHTMLWindow2_iface);
     }
 }
 
@@ -159,29 +159,32 @@ static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIAN
     return get_event_handler(&window->doc->body_event_target, eid, var);
 }
 
-#define HTMLWINDOW2_THIS(iface) DEFINE_THIS(HTMLWindow, HTMLWindow2, iface)
+static inline HTMLWindow *impl_from_IHTMLWindow2(IHTMLWindow2 *iface)
+{
+    return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow2_iface);
+}
 
 static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     *ppv = NULL;
 
     if(IsEqualGUID(&IID_IUnknown, riid)) {
         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
-        *ppv = HTMLWINDOW2(This);
+        *ppv = &This->IHTMLWindow2_iface;
     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
-        *ppv = HTMLWINDOW2(This);
+        *ppv = &This->IHTMLWindow2_iface;
     }else if(IsEqualGUID(&IID_IDispatchEx, riid)) {
         TRACE("(%p)->(IID_IDispatchEx %p)\n", This, ppv);
         *ppv = DISPATCHEX(This);
     }else if(IsEqualGUID(&IID_IHTMLFramesCollection2, riid)) {
         TRACE("(%p)->(IID_IHTMLFramesCollection2 %p)\n", This, ppv);
-        *ppv = HTMLWINDOW2(This);
+        *ppv = &This->IHTMLWindow2_iface;
     }else if(IsEqualGUID(&IID_IHTMLWindow2, riid)) {
         TRACE("(%p)->(IID_IHTMLWindow2 %p)\n", This, ppv);
-        *ppv = HTMLWINDOW2(This);
+        *ppv = &This->IHTMLWindow2_iface;
     }else if(IsEqualGUID(&IID_IHTMLWindow3, riid)) {
         TRACE("(%p)->(IID_IHTMLWindow3 %p)\n", This, ppv);
         *ppv = HTMLWINDOW3(This);
@@ -209,7 +212,7 @@ static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID rii
 
 static ULONG WINAPI HTMLWindow2_AddRef(IHTMLWindow2 *iface)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     LONG ref = InterlockedIncrement(&This->ref);
 
     TRACE("(%p) ref=%d\n", This, ref);
@@ -219,7 +222,7 @@ static ULONG WINAPI HTMLWindow2_AddRef(IHTMLWindow2 *iface)
 
 static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     LONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("(%p) ref=%d\n", This, ref);
@@ -276,7 +279,7 @@ static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface)
 
 static HRESULT WINAPI HTMLWindow2_GetTypeInfoCount(IHTMLWindow2 *iface, UINT *pctinfo)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(This), pctinfo);
 }
@@ -284,7 +287,7 @@ static HRESULT WINAPI HTMLWindow2_GetTypeInfoCount(IHTMLWindow2 *iface, UINT *pc
 static HRESULT WINAPI HTMLWindow2_GetTypeInfo(IHTMLWindow2 *iface, UINT iTInfo,
                                               LCID lcid, ITypeInfo **ppTInfo)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     return IDispatchEx_GetTypeInfo(DISPATCHEX(This), iTInfo, lcid, ppTInfo);
 }
@@ -293,7 +296,7 @@ static HRESULT WINAPI HTMLWindow2_GetIDsOfNames(IHTMLWindow2 *iface, REFIID riid
                                                 LPOLESTR *rgszNames, UINT cNames,
                                                 LCID lcid, DISPID *rgDispId)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     return IDispatchEx_GetIDsOfNames(DISPATCHEX(This), riid, rgszNames, cNames, lcid, rgDispId);
 }
@@ -302,7 +305,7 @@ static HRESULT WINAPI HTMLWindow2_Invoke(IHTMLWindow2 *iface, DISPID dispIdMembe
                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     return IDispatchEx_Invoke(DISPATCHEX(This), dispIdMember, riid, lcid, wFlags, pDispParams,
             pVarResult, pExcepInfo, puArgErr);
@@ -338,7 +341,7 @@ static HRESULT get_frame_by_index(nsIDOMWindowCollection *nsFrames, PRUint32 ind
 
 static HRESULT WINAPI HTMLWindow2_item(IHTMLWindow2 *iface, VARIANT *pvarIndex, VARIANT *pvarResult)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     nsIDOMWindowCollection *nsFrames;
     HTMLWindow *window;
     HRESULT hres;
@@ -414,7 +417,7 @@ static HRESULT WINAPI HTMLWindow2_item(IHTMLWindow2 *iface, VARIANT *pvarIndex,
         goto cleanup;
     }
 
-    IHTMLWindow2_AddRef(HTMLWINDOW2(window));
+    IHTMLWindow2_AddRef(&window->IHTMLWindow2_iface);
     V_VT(pvarResult) = VT_DISPATCH;
     V_DISPATCH(pvarResult) = (IDispatch*)window;
 
@@ -428,7 +431,7 @@ cleanup:
 
 static HRESULT WINAPI HTMLWindow2_get_length(IHTMLWindow2 *iface, LONG *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     nsIDOMWindowCollection *nscollection;
     PRUint32 length;
     nsresult nsres;
@@ -454,39 +457,39 @@ static HRESULT WINAPI HTMLWindow2_get_length(IHTMLWindow2 *iface, LONG *p)
 
 static HRESULT WINAPI HTMLWindow2_get_frames(IHTMLWindow2 *iface, IHTMLFramesCollection2 **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p): semi-stub\n", This, p);
 
     /* FIXME: Should return a separate Window object */
-    *p = (IHTMLFramesCollection2*)HTMLWINDOW2(This);
+    *p = (IHTMLFramesCollection2*)&This->IHTMLWindow2_iface;
     HTMLWindow2_AddRef(iface);
     return S_OK;
 }
 
 static HRESULT WINAPI HTMLWindow2_put_defaultStatus(IHTMLWindow2 *iface, BSTR v)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_defaultStatus(IHTMLWindow2 *iface, BSTR *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p)\n", This, p);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_put_status(IHTMLWindow2 *iface, BSTR v)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_status(IHTMLWindow2 *iface, BSTR *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p)\n", This, p);
     return E_NOTIMPL;
 }
@@ -494,7 +497,7 @@ static HRESULT WINAPI HTMLWindow2_get_status(IHTMLWindow2 *iface, BSTR *p)
 static HRESULT WINAPI HTMLWindow2_setTimeout(IHTMLWindow2 *iface, BSTR expression,
         LONG msec, VARIANT *language, LONG *timerID)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     VARIANT expr_var;
 
     TRACE("(%p)->(%s %d %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
@@ -507,7 +510,7 @@ static HRESULT WINAPI HTMLWindow2_setTimeout(IHTMLWindow2 *iface, BSTR expressio
 
 static HRESULT WINAPI HTMLWindow2_clearTimeout(IHTMLWindow2 *iface, LONG timerID)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%d)\n", This, timerID);
 
@@ -518,7 +521,7 @@ static HRESULT WINAPI HTMLWindow2_clearTimeout(IHTMLWindow2 *iface, LONG timerID
 
 static HRESULT WINAPI HTMLWindow2_alert(IHTMLWindow2 *iface, BSTR message)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     WCHAR title[100], *msg = message;
     DWORD len;
 
@@ -548,7 +551,7 @@ static HRESULT WINAPI HTMLWindow2_alert(IHTMLWindow2 *iface, BSTR message)
 static HRESULT WINAPI HTMLWindow2_confirm(IHTMLWindow2 *iface, BSTR message,
         VARIANT_BOOL *confirmed)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     WCHAR wszTitle[100];
 
     TRACE("(%p)->(%s %p)\n", This, debugstr_w(message), confirmed);
@@ -643,7 +646,7 @@ static INT_PTR CALLBACK prompt_dlgproc(HWND hwnd, UINT msg,
 static HRESULT WINAPI HTMLWindow2_prompt(IHTMLWindow2 *iface, BSTR message,
         BSTR dststr, VARIANT *textdata)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     prompt_arg arg;
 
     TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(message), debugstr_w(dststr), textdata);
@@ -661,7 +664,7 @@ static HRESULT WINAPI HTMLWindow2_prompt(IHTMLWindow2 *iface, BSTR message,
 
 static HRESULT WINAPI HTMLWindow2_get_Image(IHTMLWindow2 *iface, IHTMLImageElementFactory **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%p)\n", This, p);
 
@@ -676,7 +679,7 @@ static HRESULT WINAPI HTMLWindow2_get_Image(IHTMLWindow2 *iface, IHTMLImageEleme
 
 static HRESULT WINAPI HTMLWindow2_get_location(IHTMLWindow2 *iface, IHTMLLocation **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     HTMLLocation *location;
     HRESULT hres;
 
@@ -692,35 +695,35 @@ static HRESULT WINAPI HTMLWindow2_get_location(IHTMLWindow2 *iface, IHTMLLocatio
 
 static HRESULT WINAPI HTMLWindow2_get_history(IHTMLWindow2 *iface, IOmHistory **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p)\n", This, p);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_close(IHTMLWindow2 *iface)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->()\n", This);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_put_opener(IHTMLWindow2 *iface, VARIANT v)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_opener(IHTMLWindow2 *iface, VARIANT *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p)\n", This, p);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_navigator(IHTMLWindow2 *iface, IOmNavigator **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%p)\n", This, p);
 
@@ -730,7 +733,7 @@ static HRESULT WINAPI HTMLWindow2_get_navigator(IHTMLWindow2 *iface, IOmNavigato
 
 static HRESULT WINAPI HTMLWindow2_put_name(IHTMLWindow2 *iface, BSTR v)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     nsAString name_str;
     nsresult nsres;
 
@@ -747,7 +750,7 @@ static HRESULT WINAPI HTMLWindow2_put_name(IHTMLWindow2 *iface, BSTR v)
 
 static HRESULT WINAPI HTMLWindow2_get_name(IHTMLWindow2 *iface, BSTR *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     nsAString name_str;
     nsresult nsres;
     HRESULT hres;
@@ -778,11 +781,11 @@ static HRESULT WINAPI HTMLWindow2_get_name(IHTMLWindow2 *iface, BSTR *p)
 
 static HRESULT WINAPI HTMLWindow2_get_parent(IHTMLWindow2 *iface, IHTMLWindow2 **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     TRACE("(%p)->(%p)\n", This, p);
 
     if(This->parent) {
-        *p = HTMLWINDOW2(This->parent);
+        *p = &This->parent->IHTMLWindow2_iface;
         IHTMLWindow2_AddRef(*p);
     }else
         *p = NULL;
@@ -793,7 +796,7 @@ static HRESULT WINAPI HTMLWindow2_get_parent(IHTMLWindow2 *iface, IHTMLWindow2 *
 static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name,
          BSTR features, VARIANT_BOOL replace, IHTMLWindow2 **pomWindowResult)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%s %s %s %x %p)\n", This, debugstr_w(url), debugstr_w(name),
           debugstr_w(features), replace, pomWindowResult);
     return E_NOTIMPL;
@@ -801,25 +804,26 @@ static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name,
 
 static HRESULT WINAPI HTMLWindow2_get_self(IHTMLWindow2 *iface, IHTMLWindow2 **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%p)\n", This, p);
 
     /* FIXME: We should return kind of proxy window here. */
-    IHTMLWindow2_AddRef(HTMLWINDOW2(This));
-    *p = HTMLWINDOW2(This);
+    IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
+    *p = &This->IHTMLWindow2_iface;
     return S_OK;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_top(IHTMLWindow2 *iface, IHTMLWindow2 **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface), *curr;
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
+    HTMLWindow *curr;
     TRACE("(%p)->(%p)\n", This, p);
 
     curr = This;
     while(curr->parent)
         curr = curr->parent;
-    *p = HTMLWINDOW2(curr);
+    *p = &curr->IHTMLWindow2_iface;
     IHTMLWindow2_AddRef(*p);
 
     return S_OK;
@@ -827,54 +831,54 @@ static HRESULT WINAPI HTMLWindow2_get_top(IHTMLWindow2 *iface, IHTMLWindow2 **p)
 
 static HRESULT WINAPI HTMLWindow2_get_window(IHTMLWindow2 *iface, IHTMLWindow2 **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%p)\n", This, p);
 
     /* FIXME: We should return kind of proxy window here. */
-    IHTMLWindow2_AddRef(HTMLWINDOW2(This));
-    *p = HTMLWINDOW2(This);
+    IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
+    *p = &This->IHTMLWindow2_iface;
     return S_OK;
 }
 
 static HRESULT WINAPI HTMLWindow2_navigate(IHTMLWindow2 *iface, BSTR url)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%s)\n", This, debugstr_w(url));
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_put_onfocus(IHTMLWindow2 *iface, VARIANT v)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_onfocus(IHTMLWindow2 *iface, VARIANT *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p)\n", This, p);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_put_onblur(IHTMLWindow2 *iface, VARIANT v)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_onblur(IHTMLWindow2 *iface, VARIANT *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p)\n", This, p);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_put_onload(IHTMLWindow2 *iface, VARIANT v)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
 
@@ -883,7 +887,7 @@ static HRESULT WINAPI HTMLWindow2_put_onload(IHTMLWindow2 *iface, VARIANT v)
 
 static HRESULT WINAPI HTMLWindow2_get_onload(IHTMLWindow2 *iface, VARIANT *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%p)\n", This, p);
 
@@ -892,7 +896,7 @@ static HRESULT WINAPI HTMLWindow2_get_onload(IHTMLWindow2 *iface, VARIANT *p)
 
 static HRESULT WINAPI HTMLWindow2_put_onbeforeunload(IHTMLWindow2 *iface, VARIANT v)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(v(%d))\n", This, V_VT(&v));
 
@@ -901,7 +905,7 @@ static HRESULT WINAPI HTMLWindow2_put_onbeforeunload(IHTMLWindow2 *iface, VARIAN
 
 static HRESULT WINAPI HTMLWindow2_get_onbeforeunload(IHTMLWindow2 *iface, VARIANT *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%p)\n", This, p);
 
@@ -910,49 +914,49 @@ static HRESULT WINAPI HTMLWindow2_get_onbeforeunload(IHTMLWindow2 *iface, VARIAN
 
 static HRESULT WINAPI HTMLWindow2_put_onunload(IHTMLWindow2 *iface, VARIANT v)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_onunload(IHTMLWindow2 *iface, VARIANT *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p)\n", This, p);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_put_onhelp(IHTMLWindow2 *iface, VARIANT v)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_onhelp(IHTMLWindow2 *iface, VARIANT *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p)\n", This, p);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_put_onerror(IHTMLWindow2 *iface, VARIANT v)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_onerror(IHTMLWindow2 *iface, VARIANT *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p)\n", This, p);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_put_onresize(IHTMLWindow2 *iface, VARIANT v)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
 
@@ -961,7 +965,7 @@ static HRESULT WINAPI HTMLWindow2_put_onresize(IHTMLWindow2 *iface, VARIANT v)
 
 static HRESULT WINAPI HTMLWindow2_get_onresize(IHTMLWindow2 *iface, VARIANT *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%p)\n", This, p);
 
@@ -970,21 +974,21 @@ static HRESULT WINAPI HTMLWindow2_get_onresize(IHTMLWindow2 *iface, VARIANT *p)
 
 static HRESULT WINAPI HTMLWindow2_put_onscroll(IHTMLWindow2 *iface, VARIANT v)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_onscroll(IHTMLWindow2 *iface, VARIANT *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p)\n", This, p);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_document(IHTMLWindow2 *iface, IHTMLDocument2 **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%p)\n", This, p);
 
@@ -1001,7 +1005,7 @@ static HRESULT WINAPI HTMLWindow2_get_document(IHTMLWindow2 *iface, IHTMLDocumen
 
 static HRESULT WINAPI HTMLWindow2_get_event(IHTMLWindow2 *iface, IHTMLEventObj **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%p)\n", This, p);
 
@@ -1013,7 +1017,7 @@ static HRESULT WINAPI HTMLWindow2_get_event(IHTMLWindow2 *iface, IHTMLEventObj *
 
 static HRESULT WINAPI HTMLWindow2_get__newEnum(IHTMLWindow2 *iface, IUnknown **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p)\n", This, p);
     return E_NOTIMPL;
 }
@@ -1021,7 +1025,7 @@ static HRESULT WINAPI HTMLWindow2_get__newEnum(IHTMLWindow2 *iface, IUnknown **p
 static HRESULT WINAPI HTMLWindow2_showModalDialog(IHTMLWindow2 *iface, BSTR dialog,
         VARIANT *varArgIn, VARIANT *varOptions, VARIANT *varArgOut)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%s %p %p %p)\n", This, debugstr_w(dialog), varArgIn, varOptions, varArgOut);
     return E_NOTIMPL;
 }
@@ -1029,14 +1033,14 @@ static HRESULT WINAPI HTMLWindow2_showModalDialog(IHTMLWindow2 *iface, BSTR dial
 static HRESULT WINAPI HTMLWindow2_showHelp(IHTMLWindow2 *iface, BSTR helpURL, VARIANT helpArg,
         BSTR features)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%s v(%d) %s)\n", This, debugstr_w(helpURL), V_VT(&helpArg), debugstr_w(features));
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_screen(IHTMLWindow2 *iface, IHTMLScreen **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%p)\n", This, p);
 
@@ -1055,7 +1059,7 @@ static HRESULT WINAPI HTMLWindow2_get_screen(IHTMLWindow2 *iface, IHTMLScreen **
 
 static HRESULT WINAPI HTMLWindow2_get_Option(IHTMLWindow2 *iface, IHTMLOptionElementFactory **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%p)\n", This, p);
 
@@ -1070,35 +1074,35 @@ static HRESULT WINAPI HTMLWindow2_get_Option(IHTMLWindow2 *iface, IHTMLOptionEle
 
 static HRESULT WINAPI HTMLWindow2_focus(IHTMLWindow2 *iface)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->()\n", This);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_closed(IHTMLWindow2 *iface, VARIANT_BOOL *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p)\n", This, p);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_blur(IHTMLWindow2 *iface)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->()\n", This);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_scroll(IHTMLWindow2 *iface, LONG x, LONG y)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%d %d)\n", This, x, y);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_clientInformation(IHTMLWindow2 *iface, IOmNavigator **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p)\n", This, p);
     return E_NOTIMPL;
 }
@@ -1106,7 +1110,7 @@ static HRESULT WINAPI HTMLWindow2_get_clientInformation(IHTMLWindow2 *iface, IOm
 static HRESULT WINAPI HTMLWindow2_setInterval(IHTMLWindow2 *iface, BSTR expression,
         LONG msec, VARIANT *language, LONG *timerID)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     VARIANT expr;
 
     TRACE("(%p)->(%s %d %p %p)\n", This, debugstr_w(expression), msec, language, timerID);
@@ -1118,7 +1122,7 @@ static HRESULT WINAPI HTMLWindow2_setInterval(IHTMLWindow2 *iface, BSTR expressi
 
 static HRESULT WINAPI HTMLWindow2_clearInterval(IHTMLWindow2 *iface, LONG timerID)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%d)\n", This, timerID);
 
@@ -1127,14 +1131,14 @@ static HRESULT WINAPI HTMLWindow2_clearInterval(IHTMLWindow2 *iface, LONG timerI
 
 static HRESULT WINAPI HTMLWindow2_put_offscreenBuffering(IHTMLWindow2 *iface, VARIANT v)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(v(%d))\n", This, V_VT(&v));
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_offscreenBuffering(IHTMLWindow2 *iface, VARIANT *p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%p)\n", This, p);
     return E_NOTIMPL;
 }
@@ -1142,7 +1146,7 @@ static HRESULT WINAPI HTMLWindow2_get_offscreenBuffering(IHTMLWindow2 *iface, VA
 static HRESULT WINAPI HTMLWindow2_execScript(IHTMLWindow2 *iface, BSTR scode, BSTR language,
         VARIANT *pvarRet)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%s %s %p)\n", This, debugstr_w(scode), debugstr_w(language), pvarRet);
 
@@ -1151,7 +1155,7 @@ static HRESULT WINAPI HTMLWindow2_execScript(IHTMLWindow2 *iface, BSTR scode, BS
 
 static HRESULT WINAPI HTMLWindow2_toString(IHTMLWindow2 *iface, BSTR *String)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     static const WCHAR objectW[] = {'[','o','b','j','e','c','t',']',0};
 
@@ -1166,7 +1170,7 @@ static HRESULT WINAPI HTMLWindow2_toString(IHTMLWindow2 *iface, BSTR *String)
 
 static HRESULT WINAPI HTMLWindow2_scrollBy(IHTMLWindow2 *iface, LONG x, LONG y)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     nsresult nsres;
 
     TRACE("(%p)->(%d %d)\n", This, x, y);
@@ -1180,7 +1184,7 @@ static HRESULT WINAPI HTMLWindow2_scrollBy(IHTMLWindow2 *iface, LONG x, LONG y)
 
 static HRESULT WINAPI HTMLWindow2_scrollTo(IHTMLWindow2 *iface, LONG x, LONG y)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     nsresult nsres;
 
     TRACE("(%p)->(%d %d)\n", This, x, y);
@@ -1194,35 +1198,35 @@ static HRESULT WINAPI HTMLWindow2_scrollTo(IHTMLWindow2 *iface, LONG x, LONG y)
 
 static HRESULT WINAPI HTMLWindow2_moveTo(IHTMLWindow2 *iface, LONG x, LONG y)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%d %d)\n", This, x, y);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_moveBy(IHTMLWindow2 *iface, LONG x, LONG y)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%d %d)\n", This, x, y);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_resizeTo(IHTMLWindow2 *iface, LONG x, LONG y)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%d %d)\n", This, x, y);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_resizeBy(IHTMLWindow2 *iface, LONG x, LONG y)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
     FIXME("(%p)->(%d %d)\n", This, x, y);
     return E_NOTIMPL;
 }
 
 static HRESULT WINAPI HTMLWindow2_get_external(IHTMLWindow2 *iface, IDispatch **p)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2(iface);
 
     TRACE("(%p)->(%p)\n", This, p);
 
@@ -1237,7 +1241,7 @@ static HRESULT WINAPI HTMLWindow2_get_external(IHTMLWindow2 *iface, IDispatch **
 static HRESULT HTMLWindow_invoke(IUnknown *iface, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
         VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
 {
-    HTMLWindow *This = HTMLWINDOW2_THIS(iface);
+    HTMLWindow *This = impl_from_IHTMLWindow2((IHTMLWindow2*)iface);
     global_prop_t *prop;
     DWORD idx;
     HRESULT hres;
@@ -1295,8 +1299,6 @@ static HRESULT HTMLWindow_invoke(IUnknown *iface, DISPID id, LCID lcid, WORD fla
     return hres;
 }
 
-#undef HTMLWINDOW2_THIS
-
 static const IHTMLWindow2Vtbl HTMLWindow2Vtbl = {
     HTMLWindow2_QueryInterface,
     HTMLWindow2_AddRef,
@@ -1383,21 +1385,21 @@ static HRESULT WINAPI HTMLWindow3_QueryInterface(IHTMLWindow3 *iface, REFIID rii
 {
     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
 
-    return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv);
+    return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
 }
 
 static ULONG WINAPI HTMLWindow3_AddRef(IHTMLWindow3 *iface)
 {
     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
 
-    return IHTMLWindow2_AddRef(HTMLWINDOW2(This));
+    return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
 }
 
 static ULONG WINAPI HTMLWindow3_Release(IHTMLWindow3 *iface)
 {
     HTMLWindow *This = HTMLWINDOW3_THIS(iface);
 
-    return IHTMLWindow2_Release(HTMLWINDOW2(This));
+    return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
 }
 
 static HRESULT WINAPI HTMLWindow3_GetTypeInfoCount(IHTMLWindow3 *iface, UINT *pctinfo)
@@ -1599,21 +1601,21 @@ static HRESULT WINAPI HTMLWindow4_QueryInterface(IHTMLWindow4 *iface, REFIID rii
 {
     HTMLWindow *This = HTMLWINDOW4_THIS(iface);
 
-    return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv);
+    return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
 }
 
 static ULONG WINAPI HTMLWindow4_AddRef(IHTMLWindow4 *iface)
 {
     HTMLWindow *This = HTMLWINDOW4_THIS(iface);
 
-    return IHTMLWindow2_AddRef(HTMLWINDOW2(This));
+    return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
 }
 
 static ULONG WINAPI HTMLWindow4_Release(IHTMLWindow4 *iface)
 {
     HTMLWindow *This = HTMLWINDOW4_THIS(iface);
 
-    return IHTMLWindow2_Release(HTMLWINDOW2(This));
+    return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
 }
 
 static HRESULT WINAPI HTMLWindow4_GetTypeInfoCount(IHTMLWindow4 *iface, UINT *pctinfo)
@@ -1692,21 +1694,21 @@ static HRESULT WINAPI HTMLPrivateWindow_QueryInterface(IHTMLPrivateWindow *iface
 {
     HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface);
 
-    return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv);
+    return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
 }
 
 static ULONG WINAPI HTMLPrivateWindow_AddRef(IHTMLPrivateWindow *iface)
 {
     HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface);
 
-    return IHTMLWindow2_AddRef(HTMLWINDOW2(This));
+    return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
 }
 
 static ULONG WINAPI HTMLPrivateWindow_Release(IHTMLPrivateWindow *iface)
 {
     HTMLWindow *This = HTMLPRIVWINDOW_THIS(iface);
 
-    return IHTMLWindow2_Release(HTMLWINDOW2(This));
+    return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
 }
 
 static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface, BSTR url, BSTR arg2, BSTR arg3,
@@ -1848,21 +1850,21 @@ static HRESULT WINAPI WindowDispEx_QueryInterface(IDispatchEx *iface, REFIID rii
 {
     HTMLWindow *This = DISPEX_THIS(iface);
 
-    return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv);
+    return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
 }
 
 static ULONG WINAPI WindowDispEx_AddRef(IDispatchEx *iface)
 {
     HTMLWindow *This = DISPEX_THIS(iface);
 
-    return IHTMLWindow2_AddRef(HTMLWINDOW2(This));
+    return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
 }
 
 static ULONG WINAPI WindowDispEx_Release(IDispatchEx *iface)
 {
     HTMLWindow *This = DISPEX_THIS(iface);
 
-    return IHTMLWindow2_Release(HTMLWINDOW2(This));
+    return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
 }
 
 static HRESULT WINAPI WindowDispEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
@@ -2127,19 +2129,19 @@ static inline HTMLWindow *impl_from_IServiceProvider(IServiceProvider *iface)
 static HRESULT WINAPI HTMLWindowSP_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
 {
     HTMLWindow *This = impl_from_IServiceProvider(iface);
-    return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv);
+    return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
 }
 
 static ULONG WINAPI HTMLWindowSP_AddRef(IServiceProvider *iface)
 {
     HTMLWindow *This = impl_from_IServiceProvider(iface);
-    return IHTMLWindow2_AddRef(HTMLWINDOW2(This));
+    return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
 }
 
 static ULONG WINAPI HTMLWindowSP_Release(IServiceProvider *iface)
 {
     HTMLWindow *This = impl_from_IServiceProvider(iface);
-    return IHTMLWindow2_Release(HTMLWINDOW2(This));
+    return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
 }
 
 static HRESULT WINAPI HTMLWindowSP_QueryService(IServiceProvider *iface, REFGUID guidService, REFIID riid, void **ppv)
@@ -2148,7 +2150,7 @@ static HRESULT WINAPI HTMLWindowSP_QueryService(IServiceProvider *iface, REFGUID
 
     if(IsEqualGUID(guidService, &IID_IHTMLWindow2)) {
         TRACE("IID_IHTMLWindow2\n");
-        return IHTMLWindow2_QueryInterface(HTMLWINDOW2(This), riid, ppv);
+        return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv);
     }
 
     TRACE("(%p)->(%s %s %p)\n", This, debugstr_guid(guidService), debugstr_guid(riid), ppv);
@@ -2201,7 +2203,7 @@ HRESULT HTMLWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow, HTML
         return E_OUTOFMEMORY;
     }
 
-    window->lpHTMLWindow2Vtbl = &HTMLWindow2Vtbl;
+    window->IHTMLWindow2_iface.lpVtbl = &HTMLWindow2Vtbl;
     window->lpHTMLWindow3Vtbl = &HTMLWindow3Vtbl;
     window->lpHTMLWindow4Vtbl = &HTMLWindow4Vtbl;
     window->lpIHTMLPrivateWindowVtbl = &HTMLPrivateWindowVtbl;
@@ -2213,7 +2215,7 @@ HRESULT HTMLWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow, HTML
     window->window_ref->window = window;
     window->window_ref->ref = 1;
 
-    init_dispex(&window->dispex, (IUnknown*)HTMLWINDOW2(window), &HTMLWindow_dispex);
+    init_dispex(&window->dispex, (IUnknown*)&window->IHTMLWindow2_iface, &HTMLWindow_dispex);
 
     if(nswindow) {
         nsIDOMWindow_AddRef(nswindow);
@@ -2231,7 +2233,7 @@ HRESULT HTMLWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow, HTML
     list_add_head(&window_list, &window->entry);
 
     if(parent) {
-        IHTMLWindow2_AddRef(HTMLWINDOW2(window));
+        IHTMLWindow2_AddRef(&window->IHTMLWindow2_iface);
 
         window->parent = parent;
         list_add_tail(&parent->children, &window->sibling_entry);
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index fa762ec..f56586d 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -260,7 +260,7 @@ typedef struct nsChannelBSC nsChannelBSC;
 
 struct HTMLWindow {
     DispatchEx dispex;
-    const IHTMLWindow2Vtbl *lpHTMLWindow2Vtbl;
+    IHTMLWindow2       IHTMLWindow2_iface;
     const IHTMLWindow3Vtbl *lpHTMLWindow3Vtbl;
     const IHTMLWindow4Vtbl *lpHTMLWindow4Vtbl;
     const IHTMLPrivateWindowVtbl *lpIHTMLPrivateWindowVtbl;
@@ -622,7 +622,6 @@ struct HTMLDocumentNode {
     struct list plugin_hosts;
 };
 
-#define HTMLWINDOW2(x)   ((IHTMLWindow2*)                 &(x)->lpHTMLWindow2Vtbl)
 #define HTMLWINDOW3(x)   ((IHTMLWindow3*)                 &(x)->lpHTMLWindow3Vtbl)
 #define HTMLWINDOW4(x)   ((IHTMLWindow4*)                 &(x)->lpHTMLWindow4Vtbl)
 #define CONPTCONT(x)     ((IConnectionPointContainer*)    &(x)->lpConnectionPointContainerVtbl)
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index aef54ee..be4560f 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -808,7 +808,7 @@ static HTMLWindow *get_window_from_load_group(nsChannel *This)
 
     window = wine_uri->window_ref ? wine_uri->window_ref->window : NULL;
     if(window)
-        IHTMLWindow2_AddRef(HTMLWINDOW2(window));
+        IHTMLWindow2_AddRef(&window->IHTMLWindow2_iface);
     nsIURI_Release(NSURI(wine_uri));
 
     return window;
@@ -858,7 +858,7 @@ static HTMLWindow *get_channel_window(nsChannel *This)
     nsIDOMWindow_Release(nswindow);
 
     if(window)
-        IHTMLWindow2_AddRef(HTMLWINDOW2(window));
+        IHTMLWindow2_AddRef(&window->IHTMLWindow2_iface);
     else
         FIXME("NULL window for %p\n", nswindow);
     return window;
@@ -948,7 +948,7 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen
     if(!window) {
         if(This->uri->window_ref && This->uri->window_ref->window) {
             window = This->uri->window_ref->window;
-            IHTMLWindow2_AddRef(HTMLWINDOW2(window));
+            IHTMLWindow2_AddRef(&window->IHTMLWindow2_iface);
         }else {
             /* FIXME: Analyze removing get_window_from_load_group call */
             if(This->load_group)
@@ -993,7 +993,7 @@ static nsresult NSAPI nsChannel_AsyncOpen(nsIHttpChannel *iface, nsIStreamListen
             ERR("AddRequest failed: %08x\n", nsres);
     }
 
-    IHTMLWindow2_Release(HTMLWINDOW2(window));
+    IHTMLWindow2_Release(&window->IHTMLWindow2_iface);
     return nsres;
 }
 
@@ -2722,7 +2722,7 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString *
             base_wine_url = base_wine_uri->wine_url;
             if(base_wine_uri->window_ref && base_wine_uri->window_ref->window) {
                 window = base_wine_uri->window_ref->window;
-                IHTMLWindow2_AddRef(HTMLWINDOW2(window));
+                IHTMLWindow2_AddRef(&window->IHTMLWindow2_iface);
             }
             TRACE("base url: %s window: %p\n", debugstr_w(base_wine_url), window);
         }else if(FAILED(ParseURLA(spec, &parsed_url))) {
@@ -2743,7 +2743,7 @@ static nsresult NSAPI nsIOService_NewURI(nsIIOService *iface, const nsACString *
     *_retval = (nsIURI*)wine_uri;
 
     if(window)
-        IHTMLWindow2_Release(HTMLWINDOW2(window));
+        IHTMLWindow2_Release(&window->IHTMLWindow2_iface);
 
     if(base_wine_url) {
         WCHAR url[INTERNET_MAX_URL_LENGTH], rel_url[INTERNET_MAX_URL_LENGTH];
diff --git a/dlls/mshtml/nsservice.c b/dlls/mshtml/nsservice.c
index ed58e66..792feb5 100644
--- a/dlls/mshtml/nsservice.c
+++ b/dlls/mshtml/nsservice.c
@@ -158,7 +158,7 @@ static nsresult NSAPI nsPromptService_Alert(nsIPromptService *iface, nsIDOMWindo
     }
 
     text = SysAllocString(aText);
-    IHTMLWindow2_alert(HTMLWINDOW2(window), text);
+    IHTMLWindow2_alert(&window->IHTMLWindow2_iface, text);
     SysFreeString(text);
 
     return NS_OK;
diff --git a/dlls/mshtml/oleobj.c b/dlls/mshtml/oleobj.c
index 91bf9ef..98fbdef 100644
--- a/dlls/mshtml/oleobj.c
+++ b/dlls/mshtml/oleobj.c
@@ -199,7 +199,7 @@ static HRESULT WINAPI OleObject_SetClientSite(IOleObject *iface, IOleClientSite
 
         if(!hostui_setup) {
             V_VT(&var) = VT_UNKNOWN;
-            V_UNKNOWN(&var) = (IUnknown*)HTMLWINDOW2(This->window);
+            V_UNKNOWN(&var) = (IUnknown*)&This->window->IHTMLWindow2_iface;
             IOleCommandTarget_Exec(cmdtrg, &CGID_DocHostCmdPriv, DOCHOST_DOCCANNAVIGATE, 0, &var, NULL);
         }
 
diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c
index 25f5879..cb2eeee 100644
--- a/dlls/mshtml/persist.c
+++ b/dlls/mshtml/persist.c
@@ -233,7 +233,7 @@ HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, nsChannel
                 IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 37, 0, &var, NULL);
             }else {
                 V_VT(&var) = VT_UNKNOWN;
-                V_UNKNOWN(&var) = (IUnknown*)HTMLWINDOW2(This->window);
+                V_UNKNOWN(&var) = (IUnknown*)&This->window->IHTMLWindow2_iface;
                 V_VT(&out) = VT_EMPTY;
                 hres = IOleCommandTarget_Exec(cmdtrg, &CGID_ShellDocView, 63, 0, &var, &out);
                 if(SUCCEEDED(hres))
diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c
index e6a9da7..d785878 100644
--- a/dlls/mshtml/script.c
+++ b/dlls/mshtml/script.c
@@ -321,7 +321,7 @@ static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPC
         return E_FAIL;
 
     /* FIXME: Return proxy object */
-    *ppiunkItem = (IUnknown*)HTMLWINDOW2(This->window);
+    *ppiunkItem = (IUnknown*)&This->window->IHTMLWindow2_iface;
     IUnknown_AddRef(*ppiunkItem);
 
     return S_OK;
-- 
1.7.3.4



More information about the wine-patches mailing list