I have similar problems everytime I use a "array of " with any record type, and pass to COM objects.

so, create a variable...

BufferCaps: TDIDevCaps;

and use:

SetLength(FJoyCaps, Length(FJoyCaps) + 1);
BufferCaps.dwSize := SizeOf(TDIDevCaps);
FJoyDevice[iCount].GetCapabilities(BufferCaps);
FJoyCaps[iCount] := BufferCaps;

always use a local record to pass to any COM interface, if you pass a record of a dynamic array you always get Access Violation (i think that is bug in the compiler)