[PATCH resend 10/13] msscript.ocx: Implement ScriptModuleCollection_get_Item.

Gabriel Ivăncescu gabrielopcode at gmail.com
Tue May 26 07:42:04 CDT 2020


Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
 dlls/msscript.ocx/msscript.c | 41 ++++++++++++++++++++++++++++++++++--
 1 file changed, 39 insertions(+), 2 deletions(-)

diff --git a/dlls/msscript.ocx/msscript.c b/dlls/msscript.ocx/msscript.c
index 0745e09..e3b7b86 100644
--- a/dlls/msscript.ocx/msscript.c
+++ b/dlls/msscript.ocx/msscript.c
@@ -704,6 +704,23 @@ static void release_modules(ScriptControl *control)
     heap_free(control->modules);
 }
 
+static UINT find_module(ScriptControl *control, BSTR name)
+{
+    UINT i, len = SysStringLen(name);
+
+    if (len == sizeof("Global") - 1 && !wcsicmp(name, L"Global"))
+        return 0;
+
+    for (i = 1; i < control->num_modules; i++)
+    {
+        BSTR modname = control->modules[i]->name;
+        if (SysStringLen(modname) == len && !wcsicmp(name, modname))
+            return i;
+    }
+
+    return ~0;
+}
+
 static HRESULT WINAPI ScriptModule_QueryInterface(IScriptModule *iface, REFIID riid, void **ppv)
 {
     ScriptModule *This = impl_from_IScriptModule(iface);
@@ -1037,10 +1054,30 @@ static HRESULT WINAPI ScriptModuleCollection_get_Item(IScriptModuleCollection *i
         IScriptModule **ppmod)
 {
     ScriptControl *This = impl_from_IScriptModuleCollection(iface);
+    HRESULT hr;
+    UINT i;
 
-    FIXME("(%p)->(%s %p)\n", This, wine_dbgstr_variant(&index), ppmod);
+    TRACE("(%p)->(%s %p)\n", This, wine_dbgstr_variant(&index), ppmod);
 
-    return E_NOTIMPL;
+    if (!ppmod) return E_POINTER;
+
+    if (V_VT(&index) == VT_BSTR)
+    {
+        i = find_module(This, V_BSTR(&index));
+        if (i == ~0) return CTL_E_ILLEGALFUNCTIONCALL;
+    }
+    else
+    {
+        hr = VariantChangeType(&index, &index, 0, VT_INT);
+        if (FAILED(hr)) return hr;
+
+        i = V_INT(&index) - 1;
+        if (i >= This->num_modules) return 0x800a0009;
+    }
+
+    *ppmod = &This->modules[i]->IScriptModule_iface;
+    IScriptModule_AddRef(*ppmod);
+    return S_OK;
 }
 
 static HRESULT WINAPI ScriptModuleCollection_get_Count(IScriptModuleCollection *iface, LONG *plCount)
-- 
2.21.0




More information about the wine-devel mailing list