Hmmmm. Not an Perl OLE expert, but, it seems GetPrecursorInfoFromScanNum returns a Variant array of C structs, not an variant array of integers according to the manual. Every example in the manual is C/C++, zero VB. Is your

I think you need to try to get perl OLE to return an array of string, the strings will be binary garbage but should be 8+8+4+4 bytes long, then do an "unpack('FFll',$arr[$i]);" on it to decode the C struct. Try looking for Visual Basic code for your control and see how its done there.

A safearray can only hold one type at a time which means that it can either be an array of integers or an array of reals.

To bypass that you can make an array of Variants. A Variant in essense is a discriminated union and wraps the actual type, thus in an array of Variants you can have mixed data types.
my $array_size = Win32::OLE::Variant->new(VT_I4|VT_BYREF, 20);