Jacek Caban : mshtml: Added IDispatchEx::InvokeEx implementation.

Alexandre Julliard julliard at winehq.org
Mon Apr 21 07:45:43 CDT 2008


Module: wine
Branch: master
Commit: de74e1aeb95285aea351ae8005f80c1b5350b9f2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=de74e1aeb95285aea351ae8005f80c1b5350b9f2

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Apr 18 21:59:46 2008 +0200

mshtml: Added IDispatchEx::InvokeEx implementation.

---

 dlls/mshtml/dispex.c |   56 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 54 insertions(+), 2 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 647b4d8..47a0443 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -374,8 +374,60 @@ static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lc
         VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
 {
     DispatchEx *This = DISPATCHEX_THIS(iface);
-    FIXME("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
-    return E_NOTIMPL;
+    IUnknown *unk;
+    ITypeInfo *ti;
+    dispex_data_t *data;
+    UINT argerr=0;
+    int min, max, n;
+    HRESULT hres;
+
+    TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller);
+
+    if(wFlags == DISPATCH_CONSTRUCT) {
+        FIXME("DISPATCH_CONSTRUCT not implemented\n");
+        return E_NOTIMPL;
+    }
+
+    data = get_dispex_data(This);
+    if(!data)
+        return E_FAIL;
+
+    min = 0;
+    max = data->func_cnt-1;
+
+    while(min <= max) {
+        n = (min+max)/2;
+
+        if(data->funcs[n].id == id)
+            break;
+
+        if(data->funcs[n].id < id)
+            min = n+1;
+        else
+            max = n-1;
+    }
+
+    if(min > max) {
+        WARN("invalid id %x\n", id);
+        return DISP_E_UNKNOWNNAME;
+    }
+
+    hres = get_typeinfo(data->funcs[n].tid, &ti);
+    if(FAILED(hres)) {
+        ERR("Could not get type info: %08x\n", hres);
+        return hres;
+    }
+
+    hres = IUnknown_QueryInterface(This->outer, tid_ids[data->funcs[n].tid], (void**)&unk);
+    if(FAILED(hres)) {
+        ERR("Could not get iface: %08x\n", hres);
+        return E_FAIL;
+    }
+
+    hres = ITypeInfo_Invoke(ti, unk, id, wFlags, pdp, pvarRes, pei, &argerr);
+
+    IUnknown_Release(unk);
+    return hres;
 }
 
 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)




More information about the wine-cvs mailing list