[v2 PATCH 4/4] oleaut32: Implement ITypeComp::Bind() proxy/stub
Nikolay Sivov
nsivov at codeweavers.com
Fri Aug 26 04:30:47 CDT 2016
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
v2: also handle DESCKIND_IMPLICITAPPOBJ. Thanks, Huw.
Marking 4/4 as it was, but it applies without the rest of patches.
dlls/oleaut32/usrmarshal.c | 117 +++++++++++++++++++++++++++++++++++++--------
1 file changed, 98 insertions(+), 19 deletions(-)
diff --git a/dlls/oleaut32/usrmarshal.c b/dlls/oleaut32/usrmarshal.c
index 955b709..61c8cc2 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,106 @@ 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:
+ case DESCKIND_IMPLICITAPPOBJ:
+ 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:
+ case DESCKIND_IMPLICITAPPOBJ:
+ *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