Alex Villacís Lasso wrote:
diff -ur wine-0.9.6-cvs/dlls/oleaut32/typelib.c wine-0.9.6-cvs-patch/dlls/oleaut32/typelib.c --- wine-0.9.6-cvs/dlls/oleaut32/typelib.c 2006-01-16 16:08:20.000000000 -0500 +++ wine-0.9.6-cvs-patch/dlls/oleaut32/typelib.c 2006-01-24 21:53:48.000000000 -0500 @@ -5567,10 +5567,31 @@ ITypeInfo_AddRef(*ppTInfo); result = S_OK; } - else if (hRefType == -1 && - (((ITypeInfoImpl*) This)->TypeAttr.typekind == TKIND_DISPATCH) && - (((ITypeInfoImpl*) This)->TypeAttr.wTypeFlags & TYPEFLAG_FDUAL)) + else if ( + ( + hRefType == -1 && + (This->TypeAttr.typekind == TKIND_DISPATCH) && + (This->TypeAttr.wTypeFlags & TYPEFLAG_FDUAL) + ) + || + ( + (This->TypeAttr.typekind == TKIND_DISPATCH) && + (This->TypeAttr.wTypeFlags & TYPEFLAG_FDISPATCHABLE) + ) + ) { + /* Report whether we are here because of the DBGRID32.OCX fix */ + if (!( + hRefType == -1 && + (This->TypeAttr.typekind == TKIND_DISPATCH) && + (This->TypeAttr.wTypeFlags & TYPEFLAG_FDUAL) + )) + { + FIXME("ignoring hRefType = %d, TYPEFLAG_FDISPATCHABLE is %s\n", + hRefType, + (This->TypeAttr.wTypeFlags & TYPEFLAG_FDISPATCHABLE) ? "set" : "not set"); + } + /* when we meet a DUAL dispinterface, we must create the interface * version of it. */
This doesn't look right to me. We need tests for this situation that will tell us whether we are adding a dirty hack or whether this behaviour is correct. I can send you a test suite I have already built for typelibs if you want to add to it.
@@ -5598,8 +5619,47 @@ if(pRefType->reference == hRefType) break; } - if(!pRefType) - FIXME("Can't find pRefType for ref %lx\n", hRefType); + if(!pRefType) { + static const char * descTKIND[TKIND_MAX] = { + "TKIND_ENUM", + "TKIND_RECORD", + "TKIND_MODULE", + "TKIND_INTERFACE", + "TKIND_DISPATCH", + "TKIND_COCLASS", + "TKIND_ALIAS", + "TKIND_UNION", + }; + static const char * descTypeFlags[15] = { + "TYPEFLAG_FAPPOBJECT", + "TYPEFLAG_FCANCREATE", + "TYPEFLAG_FLICENSED", + "TYPEFLAG_FPREDECLID", + "TYPEFLAG_FHIDDEN", + "TYPEFLAG_FCONTROL", + "TYPEFLAG_FDUAL", + "TYPEFLAG_FNONEXTENSIBLE", + "TYPEFLAG_FOLEAUTOMATION", + "TYPEFLAG_FRESTRICTED", + "TYPEFLAG_FAGGREGATABLE", + "TYPEFLAG_FREPLACEABLE", + "TYPEFLAG_FDISPATCHABLE", + "TYPEFLAG_FREVERSEBIND", + "TYPEFLAG_FPROXY", + }; + int i; + + FIXME("Can't find pRefType for ref %lx\n", hRefType); + FIXME("\ttypekind is %s\n", descTKIND[This->TypeAttr.typekind]); + FIXME("\twTypeFlags are:"); + for (i = 0; i < 15; i++) { + if (This->TypeAttr.wTypeFlags & (1 << i)) + FIXME(" %s", descTypeFlags[i]); + } + if (This->TypeAttr.wTypeFlags & 0xFFFF8000) + FIXME(" %08x", This->TypeAttr.wTypeFlags & 0xFFFF8000); + FIXME("\n"); + } if(pRefType && hRefType != -1) { ITypeLib *pTLib = NULL;
This clutters the code too much. There are already functions for dumping the typelib that would work here instead, although I think they don't use the FIXME channel. -- Rob Shearman