oleaut32: Alignment fixes for safearrays.

This commit is contained in:
Huw Davies 2006-05-03 17:30:35 +01:00 committed by Alexandre Julliard
parent 74b63d5e0d
commit 17ec77f19e
2 changed files with 35 additions and 3 deletions

View File

@ -164,6 +164,8 @@ static void test_marshal_LPSAFEARRAY(void)
*(DWORD *)lpsa->pvData = 0xcafebabe; *(DWORD *)lpsa->pvData = 0xcafebabe;
lpsa->cLocks = 7; lpsa->cLocks = 7;
size = LPSAFEARRAY_UserSize(&umcb.Flags, 1, &lpsa);
ok(size == 68, "size should be 68 bytes, not %ld\n", size);
size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa); size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa);
ok(size == 64, "size should be 64 bytes, not %ld\n", size); ok(size == 64, "size should be 64 bytes, not %ld\n", size);
buffer = (unsigned char *)HeapAlloc(GetProcessHeap(), 0, size); buffer = (unsigned char *)HeapAlloc(GetProcessHeap(), 0, size);
@ -196,6 +198,25 @@ static void test_marshal_LPSAFEARRAY(void)
LPSAFEARRAY_UserFree(&umcb.Flags, &lpsa2); LPSAFEARRAY_UserFree(&umcb.Flags, &lpsa2);
} }
HeapFree(GetProcessHeap(), 0, buffer); HeapFree(GetProcessHeap(), 0, buffer);
sab.lLbound = 5;
sab.cElements = 10;
lpsa = SafeArrayCreate(VT_R8, 1, &sab);
*(double *)lpsa->pvData = 3.1415;
lpsa->cLocks = 7;
size = LPSAFEARRAY_UserSize(&umcb.Flags, 1, &lpsa);
ok(size == 128, "size should be 128 bytes, not %ld\n", size);
size = LPSAFEARRAY_UserSize(&umcb.Flags, 0, &lpsa);
ok(size == 128, "size should be 128 bytes, not %ld\n", size);
buffer = (unsigned char *)HeapAlloc(GetProcessHeap(), 0, size);
LPSAFEARRAY_UserMarshal(&umcb.Flags, buffer, &lpsa);
check_safearray(buffer, lpsa);
HeapFree(GetProcessHeap(), 0, buffer);
SafeArrayDestroy(lpsa);
} }
static void check_bstr(void *buffer, BSTR b) static void check_bstr(void *buffer, BSTR b)

View File

@ -662,6 +662,7 @@ unsigned long WINAPI LPSAFEARRAY_UserSize(unsigned long *pFlags, unsigned long S
TRACE("("); dump_user_flags(pFlags); TRACE(", %ld, %p\n", StartingSize, *ppsa); TRACE("("); dump_user_flags(pFlags); TRACE(", %ld, %p\n", StartingSize, *ppsa);
ALIGN_LENGTH(size, 3);
size += sizeof(ULONG_PTR); size += sizeof(ULONG_PTR);
if (*ppsa) if (*ppsa)
{ {
@ -726,10 +727,12 @@ unsigned long WINAPI LPSAFEARRAY_UserSize(unsigned long *pFlags, unsigned long S
} }
break; break;
} }
case SF_I8:
ALIGN_LENGTH(size, 7);
/* fallthrough */
case SF_I1: case SF_I1:
case SF_I2: case SF_I2:
case SF_I4: case SF_I4:
case SF_I8:
size += ulCellCount * psa->cbElements; size += ulCellCount * psa->cbElements;
break; break;
default: default:
@ -747,6 +750,7 @@ unsigned char * WINAPI LPSAFEARRAY_UserMarshal(unsigned long *pFlags, unsigned c
TRACE("("); dump_user_flags(pFlags); TRACE(", %p, &%p\n", Buffer, *ppsa); TRACE("("); dump_user_flags(pFlags); TRACE(", %p, &%p\n", Buffer, *ppsa);
ALIGN_POINTER(Buffer, 3);
*(ULONG_PTR *)Buffer = *ppsa ? TRUE : FALSE; *(ULONG_PTR *)Buffer = *ppsa ? TRUE : FALSE;
Buffer += sizeof(ULONG_PTR); Buffer += sizeof(ULONG_PTR);
if (*ppsa) if (*ppsa)
@ -836,10 +840,13 @@ unsigned char * WINAPI LPSAFEARRAY_UserMarshal(unsigned long *pFlags, unsigned c
} }
break; break;
} }
case SF_I8:
ALIGN_POINTER(Buffer, 7);
/* fallthrough */
case SF_I1: case SF_I1:
case SF_I2: case SF_I2:
case SF_I4: case SF_I4:
case SF_I8:
/* Just copy the data over */ /* Just copy the data over */
memcpy(Buffer, psa->pvData, ulCellCount * psa->cbElements); memcpy(Buffer, psa->pvData, ulCellCount * psa->cbElements);
Buffer += ulCellCount * psa->cbElements; Buffer += ulCellCount * psa->cbElements;
@ -871,6 +878,7 @@ unsigned char * WINAPI LPSAFEARRAY_UserUnmarshal(unsigned long *pFlags, unsigned
TRACE("("); dump_user_flags(pFlags); TRACE(", %p, %p\n", Buffer, ppsa); TRACE("("); dump_user_flags(pFlags); TRACE(", %p, %p\n", Buffer, ppsa);
ALIGN_POINTER(Buffer, 3);
ptr = *(ULONG_PTR *)Buffer; ptr = *(ULONG_PTR *)Buffer;
Buffer += sizeof(ULONG_PTR); Buffer += sizeof(ULONG_PTR);
@ -964,10 +972,13 @@ unsigned char * WINAPI LPSAFEARRAY_UserUnmarshal(unsigned long *pFlags, unsigned
break; break;
} }
case SF_I8:
ALIGN_POINTER(Buffer, 7);
/* fallthrough */
case SF_I1: case SF_I1:
case SF_I2: case SF_I2:
case SF_I4: case SF_I4:
case SF_I8:
/* Just copy the data over */ /* Just copy the data over */
memcpy((*ppsa)->pvData, Buffer, cell_count * (*ppsa)->cbElements); memcpy((*ppsa)->pvData, Buffer, cell_count * (*ppsa)->cbElements);
Buffer += cell_count * (*ppsa)->cbElements; Buffer += cell_count * (*ppsa)->cbElements;