VT_PTR->VT_USERDEFINED chains depend on the TKIND of the userdefined
type due to our handling of COM interfaces in there.
This commit is contained in:
parent
937441b3ac
commit
6f823db58b
|
@ -608,9 +608,35 @@ serialize_param(
|
||||||
}
|
}
|
||||||
case VT_PTR: {
|
case VT_PTR: {
|
||||||
DWORD cookie;
|
DWORD cookie;
|
||||||
BOOL derefhere;
|
BOOL derefhere = TRUE;
|
||||||
|
|
||||||
derefhere = (tdesc->u.lptdesc->vt != VT_USERDEFINED);
|
if (tdesc->u.lptdesc->vt == VT_USERDEFINED) {
|
||||||
|
ITypeInfo *tinfo2;
|
||||||
|
TYPEATTR *tattr;
|
||||||
|
|
||||||
|
hres = ITypeInfo_GetRefTypeInfo(tinfo,tdesc->u.lptdesc->u.hreftype,&tinfo2);
|
||||||
|
if (hres) {
|
||||||
|
ERR("Could not get typeinfo of hreftype %lx for VT_USERDEFINED.\n",tdesc->u.lptdesc->u.hreftype);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
ITypeInfo_GetTypeAttr(tinfo2,&tattr);
|
||||||
|
switch (tattr->typekind) {
|
||||||
|
case TKIND_ENUM: /* confirmed */
|
||||||
|
case TKIND_RECORD: /* FIXME: mostly untested */
|
||||||
|
derefhere=TRUE;
|
||||||
|
break;
|
||||||
|
case TKIND_ALIAS: /* FIXME: untested */
|
||||||
|
case TKIND_DISPATCH: /* will be done in VT_USERDEFINED case */
|
||||||
|
case TKIND_INTERFACE: /* will be done in VT_USERDEFINED case */
|
||||||
|
derefhere=FALSE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FIXME("unhandled switch cases tattr->typekind %d\n", tattr->typekind);
|
||||||
|
derefhere=FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ITypeInfo_Release(tinfo2);
|
||||||
|
}
|
||||||
|
|
||||||
if (debugout) TRACE_(olerelay)("*");
|
if (debugout) TRACE_(olerelay)("*");
|
||||||
/* Write always, so the other side knows when it gets a NULL pointer.
|
/* Write always, so the other side knows when it gets a NULL pointer.
|
||||||
|
@ -1184,9 +1210,35 @@ deserialize_param(
|
||||||
}
|
}
|
||||||
case VT_PTR: {
|
case VT_PTR: {
|
||||||
DWORD cookie;
|
DWORD cookie;
|
||||||
BOOL derefhere = 0;
|
BOOL derefhere = TRUE;
|
||||||
|
|
||||||
derefhere = (tdesc->u.lptdesc->vt != VT_USERDEFINED);
|
if (tdesc->u.lptdesc->vt == VT_USERDEFINED) {
|
||||||
|
ITypeInfo *tinfo2;
|
||||||
|
TYPEATTR *tattr;
|
||||||
|
|
||||||
|
hres = ITypeInfo_GetRefTypeInfo(tinfo,tdesc->u.lptdesc->u.hreftype,&tinfo2);
|
||||||
|
if (hres) {
|
||||||
|
ERR("Could not get typeinfo of hreftype %lx for VT_USERDEFINED.\n",tdesc->u.lptdesc->u.hreftype);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
ITypeInfo_GetTypeAttr(tinfo2,&tattr);
|
||||||
|
switch (tattr->typekind) {
|
||||||
|
case TKIND_ENUM: /* confirmed */
|
||||||
|
case TKIND_RECORD: /* FIXME: mostly untested */
|
||||||
|
derefhere=TRUE;
|
||||||
|
break;
|
||||||
|
case TKIND_ALIAS: /* FIXME: untested */
|
||||||
|
case TKIND_DISPATCH: /* will be done in VT_USERDEFINED case */
|
||||||
|
case TKIND_INTERFACE: /* will be done in VT_USERDEFINED case */
|
||||||
|
derefhere=FALSE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
FIXME("unhandled switch cases tattr->typekind %d\n", tattr->typekind);
|
||||||
|
derefhere=FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
ITypeInfo_Release(tinfo2);
|
||||||
|
}
|
||||||
/* read it in all cases, we need to know if we have
|
/* read it in all cases, we need to know if we have
|
||||||
* NULL pointer or not.
|
* NULL pointer or not.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue