[PATCH 4/4] oleaut32: Implement ITypeComp::Bind() proxy/stub

Nikolay Sivov nsivov at codeweavers.com
Thu Aug 25 12:57:18 CDT 2016


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/oleaut32/usrmarshal.c | 115 +++++++++++++++++++++++++++++++++++++--------
 1 file changed, 96 insertions(+), 19 deletions(-)

diff --git a/dlls/oleaut32/usrmarshal.c b/dlls/oleaut32/usrmarshal.c
index 955b709..22f62f5 100644
--- a/dlls/oleaut32/usrmarshal.c
+++ b/dlls/oleaut32/usrmarshal.c
@@ -82,6 +82,10 @@ unsigned char * WINAPI CLEANLOCALSTORAGE_UserMarshal(ULONG *pFlags, unsigned cha
 {
     ALIGN_POINTER(Buffer, 3);
     *(DWORD*)Buffer = pstg->flags;
+
+    if (!pstg->pInterface)
+        return Buffer + sizeof(DWORD);
+
     switch(pstg->flags)
     {
     case CLS_LIBATTR:
@@ -1407,31 +1411,104 @@ static void free_embedded_elemdesc(ELEMDESC *edesc)
 
 HRESULT CALLBACK ITypeComp_Bind_Proxy(
     ITypeComp* This,
-    LPOLESTR szName,
+    LPOLESTR name,
     ULONG lHashVal,
-    WORD wFlags,
-    ITypeInfo** ppTInfo,
-    DESCKIND* pDescKind,
-    BINDPTR* pBindPtr)
-{
-  FIXME("not implemented\n");
-  return E_FAIL;
+    WORD flags,
+    ITypeInfo **ti,
+    DESCKIND *desckind,
+    BINDPTR *bindptr)
+{
+    CLEANLOCALSTORAGE stg = { 0 };
+    ITypeComp *typecomp;
+    FUNCDESC *funcdesc;
+    VARDESC *vardesc;
+    HRESULT hr;
+
+    TRACE("(%p, %s, %#x, %#x, %p, %p, %p)\n", This, debugstr_w(name), lHashVal, flags, ti,
+        desckind, bindptr);
+
+    *desckind = DESCKIND_NONE;
+    memset(bindptr, 0, sizeof(*bindptr));
+
+    hr = ITypeComp_RemoteBind_Proxy(This, name, lHashVal, flags, ti, desckind,
+        &funcdesc, &vardesc, &typecomp, &stg);
+
+    if (hr == S_OK)
+    {
+        switch (*desckind)
+        {
+        case DESCKIND_FUNCDESC:
+            bindptr->lpfuncdesc = funcdesc;
+            break;
+        case DESCKIND_VARDESC:
+            bindptr->lpvardesc = vardesc;
+            break;
+        case DESCKIND_TYPECOMP:
+            bindptr->lptcomp = typecomp;
+            break;
+        default:
+            ;
+        }
+    }
+
+    return hr;
 }
 
 HRESULT __RPC_STUB ITypeComp_Bind_Stub(
     ITypeComp* This,
-    LPOLESTR szName,
+    LPOLESTR name,
     ULONG lHashVal,
-    WORD wFlags,
-    ITypeInfo** ppTInfo,
-    DESCKIND* pDescKind,
-    LPFUNCDESC* ppFuncDesc,
-    LPVARDESC* ppVarDesc,
-    ITypeComp** ppTypeComp,
-    CLEANLOCALSTORAGE* pDummy)
-{
-  FIXME("not implemented\n");
-  return E_FAIL;
+    WORD flags,
+    ITypeInfo **ti,
+    DESCKIND *desckind,
+    FUNCDESC **funcdesc,
+    VARDESC **vardesc,
+    ITypeComp **typecomp,
+    CLEANLOCALSTORAGE *stg)
+{
+    BINDPTR bindptr;
+    HRESULT hr;
+
+    TRACE("(%p, %s, %#x, %#x, %p, %p, %p, %p, %p, %p)\n", This, debugstr_w(name),
+        lHashVal, flags, ti, desckind, funcdesc, vardesc, typecomp, stg);
+
+    memset(stg, 0, sizeof(*stg));
+    memset(&bindptr, 0, sizeof(bindptr));
+
+    *funcdesc = NULL;
+    *vardesc = NULL;
+    *typecomp = NULL;
+    *ti = NULL;
+
+    hr = ITypeComp_Bind(This, name, lHashVal, flags, ti, desckind, &bindptr);
+    if(hr != S_OK)
+        return hr;
+
+    switch (*desckind)
+    {
+    case DESCKIND_FUNCDESC:
+        *funcdesc = bindptr.lpfuncdesc;
+        stg->pInterface = (IUnknown*)*ti;
+        stg->pStorage = funcdesc;
+        stg->flags = CLS_FUNCDESC;
+        break;
+    case DESCKIND_VARDESC:
+        *vardesc = bindptr.lpvardesc;
+        stg->pInterface = (IUnknown*)*ti;
+        stg->pStorage = vardesc;
+        stg->flags = CLS_VARDESC;
+        break;
+    case DESCKIND_TYPECOMP:
+        *typecomp = bindptr.lptcomp;
+        break;
+    default:
+        ;
+    }
+
+    if (stg->pInterface)
+        IUnknown_AddRef(stg->pInterface);
+
+    return hr;
 }
 
 HRESULT CALLBACK ITypeComp_BindType_Proxy(
-- 
2.9.3




More information about the wine-patches mailing list