Jacek Caban : vbscript: Added beginning GetDispID implementation.

Alexandre Julliard julliard at winehq.org
Thu Sep 15 12:34:55 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Sep 15 14:21:13 2011 +0200

vbscript: Added beginning GetDispID implementation.

---

 dlls/vbscript/tests/lang.vbs |    4 ++-
 dlls/vbscript/tests/run.c    |   62 ++++++++++++++++++++++++++++++++++++++++-
 dlls/vbscript/vbdisp.c       |   34 +++++++++++++++++++++-
 3 files changed, 95 insertions(+), 5 deletions(-)

diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs
index 2f78403..3f39a4e 100644
--- a/dlls/vbscript/tests/lang.vbs
+++ b/dlls/vbscript/tests/lang.vbs
@@ -394,8 +394,10 @@ Class TestClass
     Public Sub publicSub
     End Sub
 
-    Public Sub privateSub
+    Private Sub privateSub
     End Sub
 End Class
 
+Call testDisp(new testClass)
+
 reportSuccess()
diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c
index fa6eec1..fb6302a 100644
--- a/dlls/vbscript/tests/run.c
+++ b/dlls/vbscript/tests/run.c
@@ -73,6 +73,7 @@ DEFINE_EXPECT(testobj_propput_i);
 #define DISPID_GLOBAL_VBVAR         1005
 #define DISPID_GLOBAL_TESTOBJ       1006
 #define DISPID_GLOBAL_ISNULLDISP    1007
+#define DISPID_GLOBAL_TESTDISP      1008
 
 #define DISPID_TESTOBJ_PROPGET      2000
 #define DISPID_TESTOBJ_PROPPUT      2001
@@ -140,6 +141,46 @@ static BOOL is_english(void)
         && PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
 }
 
+static void test_disp(IDispatch *disp)
+{
+    DISPID id, public_func_id, public_sub_id;
+    IDispatchEx *dispex;
+    BSTR str;
+    HRESULT hres;
+
+    hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
+    ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
+
+    str = a2bstr("publicFunction");
+    hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_func_id);
+    SysFreeString(str);
+    ok(hres == S_OK, "GetDispID(publicFunction) failed: %08x\n", hres);
+    ok(public_func_id != -1, "public_func_id = -1\n");
+
+    str = a2bstr("publicSub");
+    hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_sub_id);
+    SysFreeString(str);
+    ok(hres == S_OK, "GetDispID(publicSub) failed: %08x\n", hres);
+    ok(public_sub_id != -1, "public_func_id = -1\n");
+
+    str = a2bstr("privateSub");
+    hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
+    SysFreeString(str);
+    ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateSub) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
+    ok(id == -1, "id = %d\n", id);
+
+    str = a2bstr("dynprop");
+    hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive|fdexNameEnsure, &id);
+    ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
+    ok(id == -1, "id = %d\n", id);
+    hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure, &id);
+    ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
+    ok(id == -1, "id = %d\n", id);
+    SysFreeString(str);
+
+    IDispatchEx_Release(dispex);
+}
+
 #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
 static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
 {
@@ -359,7 +400,11 @@ static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD
         *pid = DISPID_GLOBAL_ISNULLDISP;
         return S_OK;
     }
-
+    if(!strcmp_wa(bstrName, "testDisp")) {
+        test_grfdex(grfdex, fdexNameCaseInsensitive);
+        *pid = DISPID_GLOBAL_TESTDISP;
+        return S_OK;
+    }
 
     if(strict_dispid_check && strcmp_wa(bstrName, "x"))
         ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
@@ -473,7 +518,6 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
 
         ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
         ok(V_I2(pdp->rgvarg) == 3, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
-
         return S_OK;
 
     case DISPID_GLOBAL_TESTOBJ:
@@ -512,6 +556,20 @@ static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid,
         V_BOOL(pvarRes) = V_DISPATCH(v) ? VARIANT_FALSE : VARIANT_TRUE;
         return S_OK;
     }
+
+    case DISPID_GLOBAL_TESTDISP:
+        ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
+        ok(pdp != NULL, "pdp == NULL\n");
+        ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
+        ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
+        ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
+        ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
+        ok(!pvarRes, "pvarRes != NULL\n");
+        ok(pei != NULL, "pei == NULL\n");
+
+        ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
+        test_disp(V_DISPATCH(pdp->rgvarg));
+        return S_OK;
     }
 
     ok(0, "unexpected call %d\n", id);
diff --git a/dlls/vbscript/vbdisp.c b/dlls/vbscript/vbdisp.c
index f1a323d..77837c6 100644
--- a/dlls/vbscript/vbdisp.c
+++ b/dlls/vbscript/vbdisp.c
@@ -22,6 +22,25 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
 
+static BOOL get_func_id(vbdisp_t *This, const WCHAR *name, BOOL search_private, DISPID *id)
+{
+    unsigned i;
+
+    for(i = 0; i < This->desc->func_cnt; i++) {
+        if(!search_private && !This->desc->funcs[i].is_public)
+            continue;
+        if(!This->desc->funcs[i].name) /* default value may not exist */
+            continue;
+
+        if(!strcmpiW(This->desc->funcs[i].name, name)) {
+            *id = i;
+            return TRUE;
+        }
+    }
+
+    return FALSE;
+}
+
 static inline vbdisp_t *impl_from_IDispatchEx(IDispatchEx *iface)
 {
     return CONTAINING_RECORD(iface, vbdisp_t, IDispatchEx_iface);
@@ -112,8 +131,19 @@ static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
 static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
 {
     vbdisp_t *This = impl_from_IDispatchEx(iface);
-    FIXME("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(bstrName), grfdex, pid);
+
+    if(grfdex & ~(fdexNameEnsure|fdexNameCaseInsensitive)) {
+        FIXME("unsupported flags %x\n", grfdex);
+        return E_NOTIMPL;
+    }
+
+    if(get_func_id(This, bstrName, FALSE, pid))
+        return S_OK;
+
+    *pid = -1;
+    return DISP_E_UNKNOWNNAME;
 }
 
 static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,




More information about the wine-cvs mailing list