From: Kevin Puetz Subject: [PATCH v2 2/6] oleaut32: FUNC_DISPATCH from dispinterface should have oVft == 0. Message-Id: <20200921141722.2300-2-PuetzKevinA@JohnDeere.com> Date: Mon, 21 Sep 2020 09:17:18 -0500 In-Reply-To: <20200921141722.2300-1-PuetzKevinA@JohnDeere.com> References: <20200921141722.2300-1-PuetzKevinA@JohnDeere.com> a dispinterface has no vtbl beyond IDispatch itself Signed-off-by: Kevin Puetz --- dlls/oleaut32/typelib.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c index 06667850a3..ecc754145f 100644 --- a/dlls/oleaut32/typelib.c +++ b/dlls/oleaut32/typelib.c @@ -2465,7 +2465,11 @@ MSFT_DoFuncs(TLBContext* pcx, ptfd->funcdesc.callconv = (pFuncRec->FKCCIC) >> 8 & 0xF; ptfd->funcdesc.cParams = pFuncRec->nrargs ; ptfd->funcdesc.cParamsOpt = pFuncRec->nroargs ; - ptfd->funcdesc.oVft = (pFuncRec->VtableOffset & ~1) * sizeof(void *) / pTI->pTypeLib->ptr_size; + if(ptfd->funcdesc.funckind == FUNC_DISPATCH) { + ptfd->funcdesc.oVft = 0; + } else { + ptfd->funcdesc.oVft = (pFuncRec->VtableOffset & ~1) * sizeof(void *) / pTI->pTypeLib->ptr_size; + } ptfd->funcdesc.wFuncFlags = LOWORD(pFuncRec->Flags) ; /* nameoffset is sometimes -1 on the second half of a propget/propput @@ -4179,7 +4183,11 @@ static void SLTG_DoFuncs(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, pFuncDesc->funcdesc.callconv = pFunc->nacc & 0x7; pFuncDesc->funcdesc.cParams = pFunc->nacc >> 3; pFuncDesc->funcdesc.cParamsOpt = (pFunc->retnextopt & 0x7e) >> 1; - pFuncDesc->funcdesc.oVft = (pFunc->vtblpos & ~1) * sizeof(void *) / pTI->pTypeLib->ptr_size; + if (pFuncDesc->funcdesc.funckind == FUNC_DISPATCH) { + pFuncDesc->funcdesc.oVft = 0; + } else { + pFuncDesc->funcdesc.oVft = (pFunc->vtblpos & ~1) * sizeof(void *) / pTI->pTypeLib->ptr_size; + } if(pFunc->magic & SLTG_FUNCTION_FLAGS_PRESENT) pFuncDesc->funcdesc.wFuncFlags = pFunc->funcflags;