"Standard" data types? COM doesn't define any data types. The types are defined in IDL *independent* of the implementation language. VB's data types are not "bass ackwards." The typelib emitted from a VB COM component are mapped to the appropriate type of the consuming language (C++ _bstr_t for VB String, C++ int for VB Long, etc.).
The atomic datatypes (int, long, float, etc) are universal to pretty much every language rather than VB specific.
But if you want to send/receive more complex datatypes such as arrays and even strings, then the types are molded to VB. (Yes, for an in-process DLL the types can be whatever you want, but if you want COM to know how to marshall your params outside the process....)
Getting other languages to use the VB string format (BSTR) is the source of
lots of programming bugs. Some genious decided it would be a good idea to pass this datatype as a pointer to the spot in memory 2 bytes
after the start of the block allocated for it, rather than as a pointer to the start of the block like everything else. Because of this if you try to create a BSTR in memory and allocate it with normal memory allocation routines like AllocMem or malloc, you get unpredictable results (so they had to make separate memory management routines just for BSTRs).
The VARIANT format is also a major kludge, particularly when it comes to VARIANTs containing arrays. First of all, the order of array indices for multi-dimenstional arrays in VB (and consequently in variant SAFEARRAYs) is exactly opposite what it is with standard arrays in pretty much every other language. Second of all, when receiving variants containing arrays or objects, you can't depend on things to use them
sanely and have the actual variant passed (for an array of ints for example) have type VT_ARRAY | VT_I4, or maybe VT_ARRAY | VT_VARIANT (if passed as an array of variants containing ints). Instead when receiving such a param built in the simplest way possible in VB or VBScript, it is more likely to be of type VT_VARIANT | VT_BYREF (variant containing reference pointer to a variant), and when you look at that inner variant it is likely to also be of type VT_VARIANT | VT_BYREF, so you have to set up a loop to find the actual innermost variant you wanted to get to the array. (With some versions of VBScript/ASP calling COM+ I've seen the receiving application have to loop up to 4 times, i.e. the variant param received is actually a variant containing a pointer to a variant containing a pointer containing a variant containing a pointer to a variant containing a pointer to a safearray).