[PATCH 4/5] wbemdisp: Implement InParameters() property for a method object.

Nikolay Sivov nsivov at codeweavers.com
Fri Feb 26 01:22:15 CST 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/wbemdisp/locator.c | 60 +++++++++++++++++++++++++++++++++--------
 1 file changed, 49 insertions(+), 11 deletions(-)

diff --git a/dlls/wbemdisp/locator.c b/dlls/wbemdisp/locator.c
index a73bd6e55da..d7b04e343fd 100644
--- a/dlls/wbemdisp/locator.c
+++ b/dlls/wbemdisp/locator.c
@@ -35,8 +35,17 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(wbemdisp);
 
+static WCHAR *heap_strdupW( const WCHAR *src )
+{
+    WCHAR *dst;
+    if (!src) return NULL;
+    if ((dst = heap_alloc( (lstrlenW( src ) + 1) * sizeof(WCHAR) ))) lstrcpyW( dst, src );
+    return dst;
+}
+
 static HRESULT EnumVARIANT_create( IEnumWbemClassObject *, IEnumVARIANT ** );
 static HRESULT ISWbemSecurity_create( ISWbemSecurity ** );
+static HRESULT SWbemObject_create( IWbemClassObject *, ISWbemObject ** );
 
 enum type_id
 {
@@ -522,10 +531,19 @@ struct object
     DISPID last_dispid_method;
 };
 
+struct methodset
+{
+    ISWbemMethodSet ISWbemMethodSet_iface;
+    LONG refs;
+    struct object *object;
+};
+
 struct method
 {
     ISWbemMethod ISWbemMethod_iface;
     LONG refs;
+    struct methodset *set;
+    WCHAR *name;
 };
 
 static struct method *impl_from_ISWbemMethod( ISWbemMethod *iface )
@@ -567,6 +585,8 @@ static ULONG WINAPI method_Release( ISWbemMethod *iface )
     if (!refs)
     {
         TRACE( "destroying %p\n", method );
+        ISWbemMethodSet_Release( &method->set->ISWbemMethodSet_iface );
+        heap_free( method->name );
         heap_free( method );
     }
     return refs;
@@ -671,9 +691,27 @@ static HRESULT WINAPI method_get_InParameters(
     ISWbemMethod *iface,
     ISWbemObject **params )
 {
-    FIXME("\n");
+    struct method *method = impl_from_ISWbemMethod( iface );
+    IWbemClassObject *in_sign = NULL, *instance;
+    HRESULT hr;
 
-    return E_NOTIMPL;
+    TRACE("%p, %p\n", method, params);
+
+    *params = NULL;
+
+    if (SUCCEEDED(hr = IWbemClassObject_GetMethod( method->set->object->object,
+            method->name, 0, &in_sign, NULL )) && in_sign != NULL)
+    {
+        hr = IWbemClassObject_SpawnInstance( in_sign, 0, &instance );
+        IWbemClassObject_Release( in_sign );
+        if (SUCCEEDED(hr))
+        {
+            hr = SWbemObject_create( instance, params );
+            IWbemClassObject_Release( instance );
+        }
+    }
+
+    return hr;
 }
 
 static HRESULT WINAPI method_get_OutParameters(
@@ -710,7 +748,7 @@ static const ISWbemMethodVtbl methodvtbl =
     method_get_Qualifiers_,
 };
 
-static HRESULT SWbemMethod_create( ISWbemMethod **obj )
+static HRESULT SWbemMethod_create( struct methodset *set, const WCHAR *name, ISWbemMethod **obj )
 {
     struct method *method;
 
@@ -719,19 +757,19 @@ static HRESULT SWbemMethod_create( ISWbemMethod **obj )
 
     method->ISWbemMethod_iface.lpVtbl = &methodvtbl;
     method->refs = 1;
+    method->set = set;
+    ISWbemMethodSet_AddRef( &method->set->ISWbemMethodSet_iface );
+    if (!(method->name = heap_strdupW( name )))
+    {
+        ISWbemMethod_Release( &method->ISWbemMethod_iface );
+        return E_OUTOFMEMORY;
+    }
 
     *obj = &method->ISWbemMethod_iface;
 
     return S_OK;
 }
 
-struct methodset
-{
-    ISWbemMethodSet ISWbemMethodSet_iface;
-    LONG refs;
-    struct object *object;
-};
-
 static struct methodset *impl_from_ISWbemMethodSet( ISWbemMethodSet *iface )
 {
     return CONTAINING_RECORD( iface, struct methodset, ISWbemMethodSet_iface );
@@ -884,7 +922,7 @@ static HRESULT WINAPI methodset_Item(
         if (out_sign)
             IWbemClassObject_Release( out_sign );
 
-        return SWbemMethod_create( method );
+        return SWbemMethod_create( set, name, method );
     }
 
     return hr;
-- 
2.30.0




More information about the wine-devel mailing list