Rob Shearman : oleaut32: Implement the 0x08 flag in SLTG_DoVars.
Alexandre Julliard
julliard at winehq.org
Tue Jul 1 08:27:33 CDT 2008
Module: wine
Branch: master
Commit: 45989a1ff1268480e9cf4697881a12bd664e15e1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=45989a1ff1268480e9cf4697881a12bd664e15e1
Author: Rob Shearman <robertshearman at gmail.com>
Date: Mon Jun 30 23:04:33 2008 +0100
oleaut32: Implement the 0x08 flag in SLTG_DoVars.
It means that the data is stored directly in pItem->byte_offs instead
of the byte offset pointed to by it.
---
dlls/oleaut32/typelib.c | 19 +++++++++++++------
dlls/oleaut32/typelib.h | 2 +-
2 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/dlls/oleaut32/typelib.c b/dlls/oleaut32/typelib.c
index 43aedc5..aa4c178 100644
--- a/dlls/oleaut32/typelib.c
+++ b/dlls/oleaut32/typelib.c
@@ -3099,7 +3099,6 @@ static void SLTG_DoVars(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, unsign
SLTG_Variable *pItem;
unsigned short i;
WORD *pType;
- char buf[300];
for(pItem = (SLTG_Variable *)pFirstItem, i = 0; i < cVars;
pItem = (SLTG_Variable *)(pBlk + pItem->next), i++) {
@@ -3119,6 +3118,7 @@ static void SLTG_DoVars(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, unsign
else
(*ppVarDesc)->Name = TLB_MultiByteToBSTR(pItem->name + pNameTable);
+ TRACE_(typelib)("name: %s\n", debugstr_w((*ppVarDesc)->Name));
TRACE_(typelib)("byte_offs = 0x%x\n", pItem->byte_offs);
TRACE_(typelib)("memid = 0x%x\n", pItem->memid);
@@ -3132,8 +3132,11 @@ static void SLTG_DoVars(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, unsign
(*ppVarDesc)->vardesc.u.lpvarValue = HeapAlloc(GetProcessHeap(), 0,
sizeof(VARIANT));
V_VT((*ppVarDesc)->vardesc.u.lpvarValue) = VT_INT;
- V_UNION((*ppVarDesc)->vardesc.u.lpvarValue, intVal) =
- *(INT*)(pBlk + pItem->byte_offs);
+ if (pItem->flags & 0x08)
+ V_UNION((*ppVarDesc)->vardesc.u.lpvarValue, intVal) = pItem->byte_offs;
+ else
+ V_UNION((*ppVarDesc)->vardesc.u.lpvarValue, intVal) =
+ *(INT*)(pBlk + pItem->byte_offs);
}
else {
TRACE_(typelib)("VAR_PERINSTANCE\n");
@@ -3152,13 +3155,17 @@ static void SLTG_DoVars(char *pBlk, char *pFirstItem, ITypeInfoImpl *pTI, unsign
else
pType = (WORD*)(pBlk + pItem->type);
- if (pItem->flags & ~0xd2)
- FIXME_(typelib)("unhandled flags = %02x\n", pItem->flags & ~0xd2);
+ if (pItem->flags & ~0xda)
+ FIXME_(typelib)("unhandled flags = %02x\n", pItem->flags & ~0xda);
SLTG_DoElem(pType, pBlk,
&(*ppVarDesc)->vardesc.elemdescVar, ref_lookup);
- dump_TypeDesc(&(*ppVarDesc)->vardesc.elemdescVar.tdesc, buf);
+ if (TRACE_ON(typelib)) {
+ char buf[300];
+ dump_TypeDesc(&(*ppVarDesc)->vardesc.elemdescVar.tdesc, buf);
+ TRACE_(typelib)("elemdescVar: %s\n", buf);
+ }
bstrPrevName = (*ppVarDesc)->Name;
ppVarDesc = &((*ppVarDesc)->next);
diff --git a/dlls/oleaut32/typelib.h b/dlls/oleaut32/typelib.h
index b25f031..821981f 100644
--- a/dlls/oleaut32/typelib.h
+++ b/dlls/oleaut32/typelib.h
@@ -576,7 +576,7 @@ typedef struct {
BYTE flags;
WORD next;
WORD name;
- WORD byte_offs; /* pos in struct, or offset to const type */
+ WORD byte_offs; /* pos in struct, or offset to const type or const data (if flags & 0x08) */
WORD type; /* if flags & 0x02 this is the type, else offset to type */
DWORD memid;
WORD helpcontext; /* ?? */
More information about the wine-cvs
mailing list