oleaut32: Handle bstr length of -1 in typelibs.

This commit is contained in:
Juan Lang 2006-06-27 23:09:33 -07:00 committed by Alexandre Julliard
parent bf680011d7
commit 24dd931a56
1 changed files with 30 additions and 13 deletions

View File

@ -1367,12 +1367,13 @@ static void *TLB_CopyTypeDesc( TYPEDESC *dest, const TYPEDESC *src, void *buffer
*
* Functions for reading MSFT typelibs (those created by CreateTypeLib2)
*/
/* read function */
static DWORD MSFT_Read(void *buffer, DWORD count, TLBContext *pcx, long where )
static inline unsigned int MSFT_Tell(TLBContext *pcx)
{
TRACE_(typelib)("pos=0x%08x len=0x%08lx 0x%08x 0x%08x 0x%08lx\n",
pcx->pos, count, pcx->oStart, pcx->length, where);
return pcx->pos;
}
static inline void MSFT_Seek(TLBContext *pcx, long where)
{
if (where != DO_NOT_SEEK)
{
where += pcx->oStart;
@ -1384,6 +1385,15 @@ static DWORD MSFT_Read(void *buffer, DWORD count, TLBContext *pcx, long where )
}
pcx->pos = where;
}
}
/* read function */
static DWORD MSFT_Read(void *buffer, DWORD count, TLBContext *pcx, long where )
{
TRACE_(typelib)("pos=0x%08x len=0x%08lx 0x%08x 0x%08x 0x%08lx\n",
pcx->pos, count, pcx->oStart, pcx->length, where);
MSFT_Seek(pcx, where);
if (pcx->pos + count > pcx->length) count = pcx->length - pcx->pos;
memcpy( buffer, (char *)pcx->mapping + pcx->pos, count );
pcx->pos += count;
@ -1561,8 +1571,16 @@ static void MSFT_ReadValue( VARIANT * pVar, int offset, TLBContext *pcx )
char * ptr;
MSFT_ReadLEDWords(&size, sizeof(INT), pcx, DO_NOT_SEEK );
if(size < 0) {
FIXME("BSTR length = %d?\n", size);
} else {
char next;
DWORD origPos = MSFT_Tell(pcx), nullPos;
do {
MSFT_Read(&next, 1, pcx, DO_NOT_SEEK);
} while (next);
nullPos = MSFT_Tell(pcx);
size = nullPos - origPos;
MSFT_Seek(pcx, origPos);
}
ptr=TLB_Alloc(size);/* allocate temp buffer */
MSFT_Read(ptr, size, pcx, DO_NOT_SEEK);/* read string (ANSI) */
V_BSTR(pVar)=SysAllocStringLen(NULL,size);
@ -1571,7 +1589,6 @@ static void MSFT_ReadValue( VARIANT * pVar, int offset, TLBContext *pcx )
while(size--) V_UNION(pVar, bstrVal[size])=ptr[size];
TLB_Free(ptr);
}
}
size=-4; break;
/* FIXME: this will not work AT ALL when the variant contains a pointer */
case VT_DISPATCH :