Module: wine Branch: master Commit: c978bbee87dd6e09e4ad836df5ad7d63506face2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=c978bbee87dd6e09e4ad836df5...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Mon Mar 3 14:27:03 2008 -0800
oleaut32: Handle TKIND_ALIAS properly when passed as pointer.
---
dlls/oleaut32/tmarshal.c | 34 ++++++++++++++++++++++++++++++---- 1 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/dlls/oleaut32/tmarshal.c b/dlls/oleaut32/tmarshal.c index 2e5ae14..8a6e267 100644 --- a/dlls/oleaut32/tmarshal.c +++ b/dlls/oleaut32/tmarshal.c @@ -698,11 +698,24 @@ serialize_param( } ITypeInfo_GetTypeAttr(tinfo2,&tattr); switch (tattr->typekind) { + case TKIND_ALIAS: + if (tattr->tdescAlias.vt == VT_USERDEFINED) + { + DWORD href = tattr->tdescAlias.u.hreftype; + ITypeInfo_ReleaseTypeAttr(tinfo, tattr); + ITypeInfo_Release(tinfo2); + hres = ITypeInfo_GetRefTypeInfo(tinfo,href,&tinfo2); + if (hres) { + ERR("Could not get typeinfo of hreftype %x for VT_USERDEFINED.\n",tdesc->u.lptdesc->u.hreftype); + return hres; + } + ITypeInfo_GetTypeAttr(tinfo2,&tattr); + derefhere = (tattr->typekind != TKIND_DISPATCH && tattr->typekind != TKIND_INTERFACE); + } + break; 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; @@ -1030,11 +1043,24 @@ deserialize_param( } ITypeInfo_GetTypeAttr(tinfo2,&tattr); switch (tattr->typekind) { + case TKIND_ALIAS: + if (tattr->tdescAlias.vt == VT_USERDEFINED) + { + DWORD href = tattr->tdescAlias.u.hreftype; + ITypeInfo_ReleaseTypeAttr(tinfo, tattr); + ITypeInfo_Release(tinfo2); + hres = ITypeInfo_GetRefTypeInfo(tinfo,href,&tinfo2); + if (hres) { + ERR("Could not get typeinfo of hreftype %x for VT_USERDEFINED.\n",tdesc->u.lptdesc->u.hreftype); + return hres; + } + ITypeInfo_GetTypeAttr(tinfo2,&tattr); + derefhere = (tattr->typekind != TKIND_DISPATCH && tattr->typekind != TKIND_INTERFACE); + } + break; 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;