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:
Marcus Meissner 2005-09-07 09:23:04 +00:00 committed by Alexandre Julliard
parent 937441b3ac
commit 6f823db58b
1 changed files with 56 additions and 4 deletions

View File

@ -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.
*/ */