No, no new datatypes.
First, non-UDT arrays just have a type value of 0 to 8 (ignore the bracketed letters at this point):
0 (L) = Integer
1 (F) = Float
2 (S) = String
3 (B) = Boolean
4 (Y) = Byte
5 (W) = Word
6 (D) = Dword
7 (O) = Double float
8 (R) = Double integer
If you do have a UDT array, then you have some work to do.
Accessing fields within a UDT requires you to work out offsets to add to the pointer you get and to access the data at that point appropriately.
You can get the UDT format using the GetTypePattern function from the Core plug-in (which is also defined for you in my interface library). Just pass a null pointer as the first argument, and the type of the array ( DBPro::Array::Type(ArrayPtr) ) as the second argument, and you will receive a string pointer in return - this contains the type pattern of the UDT.
LPCSTR FormatString = DBPro::GetTypePattern(0, DBPro::Array::Type(Array));
DBPro::StringDeleter D(FormatString);
// Calculate the offset required here
// The 'StringDeleter' will remove the temporary string 'FormatString' when it goes out of scope
The string contains the letters that represent the types (now go back an look at those bracketed letters I told you to ignore). All types increase the offset by 4 except for double integer (R) and double float (O). Booleans should be accessed as an unsigned char, as should Byte.
The offset of field 1 is zero, the offset of field 2 is the size of field 1, the offset of field 3 is the size of fields 1 & 2 etc.