diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 526fdea952b..a3a9595cdad 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -106,6 +106,7 @@ static REFIID tid_ids[] = {
&IID_IHTMLGenericElement,
&IID_IHTMLImgElement,
&IID_IHTMLInputElement,
+ &IID_IHTMLLocation,
&IID_IHTMLOptionElement,
&IID_IHTMLSelectElement,
&IID_IHTMLStyle,
diff --git a/dlls/mshtml/htmllocation.c b/dlls/mshtml/htmllocation.c
index 0881023c87e..5f0d7fbe51e 100644
--- a/dlls/mshtml/htmllocation.c
+++ b/dlls/mshtml/htmllocation.c
@@ -43,12 +43,11 @@ static HRESULT WINAPI HTMLLocation_QueryInterface(IHTMLLocation *iface, REFIID r
if(IsEqualGUID(&IID_IUnknown, riid)) {
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
*ppv = HTMLLOCATION(This);
- }else if(IsEqualGUID(&IID_IDispatch, riid)) {
- TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
- *ppv = HTMLLOCATION(This);
}else if(IsEqualGUID(&IID_IHTMLLocation, riid)) {
TRACE("(%p)->(IID_IHTMLLocation %p)\n", This, ppv);
*ppv = HTMLLOCATION(This);
+ }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
+ return *ppv ? S_OK : E_NOINTERFACE;
}
if(*ppv) {
@@ -293,6 +292,18 @@ static const IHTMLLocationVtbl HTMLLocationVtbl = {
HTMLLocation_toString
};
+static const tid_t HTMLLocation_iface_tids[] = {
+ IHTMLLocation_tid,
+ 0
+};
+static dispex_static_data_t HTMLLocation_dispex = {
+ NULL,
+ IHTMLLocation_tid,
+ NULL,
+ HTMLLocation_iface_tids
+};
+
+
HTMLLocation *HTMLLocation_Create(HTMLDocument *doc)
{
HTMLLocation *ret = heap_alloc(sizeof(*ret));
@@ -301,5 +312,7 @@ HTMLLocation *HTMLLocation_Create(HTMLDocument *doc)
ret->ref = 1;
ret->doc = doc;
+ init_dispex(&ret->dispex, (IUnknown*)HTMLLOCATION(ret), &HTMLLocation_dispex);
+
return ret;
}
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 58f662a75c8..a7e364e27a2 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -102,6 +102,7 @@ typedef enum {
IHTMLGenericElement_tid,
IHTMLImgElement_tid,
IHTMLInputElement_tid,
+ IHTMLLocation_tid,
IHTMLOptionElement_tid,
IHTMLSelectElement_tid,
IHTMLStyle_tid,
@@ -199,6 +200,7 @@ struct ConnectionPoint {
};
typedef struct {
+ DispatchEx dispex;
const IHTMLLocationVtbl *lpHTMLLocationVtbl;
LONG ref;
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index ee2a5cafdc3..be54998a6da 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -2207,6 +2207,7 @@ static void test_location(IHTMLDocument2 *doc)
IHTMLLocation_Release(location2);
test_ifaces((IUnknown*)location, location_iids);
+ test_disp((IUnknown*)location, &IID_IHTMLLocation);
ref = IHTMLLocation_Release(location);
ok(!ref, "location chould be destroyed here\n");