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.
Robert Shearman wrote:
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.
Please do so. I do not think this is right either (even if DBGRID32.OCX runs with it), and I would especially like to see cases where this patch causes regressions. Maybe your test suite shows some of them already.
@@ -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.
So, which are they? I would like especially to dump the typelib of DBGRID32.OCX and compare it with other (working) ActiveX controls, to look for differences.
Alex Villacís Lasso