Jacek Caban : oleaut32: Properly handle TKIND_ALIAS when looking for iface GUID.
Alexandre Julliard
julliard at winehq.org
Wed Sep 19 13:39:45 CDT 2012
Module: wine
Branch: master
Commit: 2f7afbebd1e7944b0374ba2438baa52741936809
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2f7afbebd1e7944b0374ba2438baa52741936809
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Sep 19 13:22:38 2012 +0200
oleaut32: Properly handle TKIND_ALIAS when looking for iface GUID.
---
dlls/oleaut32/typelib.c | 60 ++++++++++++++++++++++++++++++++--------------
1 files changed, 42 insertions(+), 18 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index abde61b..602181c 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -6022,6 +6022,42 @@ static HRESULT typedescvt_to_variantvt(ITypeInfo *tinfo, const TYPEDESC *tdesc,
return hr;
}
+static HRESULT get_iface_guid(ITypeInfo *tinfo, const TYPEDESC *tdesc, GUID *guid)
+{
+ ITypeInfo *tinfo2;
+ TYPEATTR *tattr;
+ HRESULT hres;
+
+ hres = ITypeInfo_GetRefTypeInfo(tinfo, tdesc->u.hreftype, &tinfo2);
+ if(FAILED(hres))
+ return hres;
+
+ hres = ITypeInfo_GetTypeAttr(tinfo2, &tattr);
+ if(FAILED(hres)) {
+ ITypeInfo_Release(tinfo2);
+ return hres;
+ }
+
+ switch(tattr->typekind) {
+ case TKIND_ALIAS:
+ hres = get_iface_guid(tinfo2, &tattr->tdescAlias, guid);
+ break;
+
+ case TKIND_INTERFACE:
+ case TKIND_DISPATCH:
+ *guid = tattr->guid;
+ break;
+
+ default:
+ ERR("Unexpected typekind %d\n", tattr->typekind);
+ hres = E_UNEXPECTED;
+ }
+
+ ITypeInfo_ReleaseTypeAttr(tinfo2, tattr);
+ ITypeInfo_Release(tinfo2);
+ return hres;
+}
+
/***********************************************************************
* DispCallFunc (OLEAUT32.@)
*
@@ -6515,30 +6551,18 @@ static HRESULT WINAPI ITypeInfo_fnInvoke(
}
if((tdesc->vt == VT_USERDEFINED || (tdesc->vt == VT_PTR && tdesc->u.lptdesc->vt == VT_USERDEFINED))
- && (V_VT(prgpvarg[i]) == VT_DISPATCH || V_VT(prgpvarg[i]) == VT_UNKNOWN)) {
- const TYPEDESC *userdefined_tdesc = tdesc;
+ && (V_VT(prgpvarg[i]) == VT_DISPATCH || V_VT(prgpvarg[i]) == VT_UNKNOWN)
+ && V_UNKNOWN(prgpvarg[i])) {
IUnknown *userdefined_iface;
- ITypeInfo *tinfo2;
- TYPEATTR *tattr;
-
- if(tdesc->vt == VT_PTR)
- userdefined_tdesc = tdesc->u.lptdesc;
+ GUID guid;
- hres = ITypeInfo2_GetRefTypeInfo(iface, userdefined_tdesc->u.hreftype, &tinfo2);
+ hres = get_iface_guid((ITypeInfo*)iface, tdesc->vt == VT_PTR ? tdesc->u.lptdesc : tdesc, &guid);
if(FAILED(hres))
break;
- hres = ITypeInfo_GetTypeAttr(tinfo2, &tattr);
- if(FAILED(hres)) {
- ITypeInfo_Release(tinfo2);
- return hres;
- }
-
- hres = IUnknown_QueryInterface(V_UNKNOWN(prgpvarg[i]), &tattr->guid, (void**)&userdefined_iface);
- ITypeInfo_ReleaseTypeAttr(tinfo2, tattr);
- ITypeInfo_Release(tinfo2);
+ hres = IUnknown_QueryInterface(V_UNKNOWN(prgpvarg[i]), &guid, (void**)&userdefined_iface);
if(FAILED(hres)) {
- ERR("argument does not support %s interface\n", debugstr_guid(&tattr->guid));
+ ERR("argument does not support %s interface\n", debugstr_guid(&guid));
break;
}
More information about the wine-cvs
mailing list