See the question and my original answer on StackOverflow

COM Automation defines a set of types that it knows how to marshal through thread or process boundaries.

It means there is no need for custom proxy/stubs if you restrict your interfaces to use only those types, and you describe your interface with a type library (most development tools, such as Visual Studio, do that automatically).

Those types are described here: VARENUM Enumeration.

The VARIANT type is itself an automation type, it's a struct that can contain any one of the other automation types.

COM Automation appeared with the Visual Basic development environment (up to version 6, before VB.NET). VB/VBA defines the same types (including Variant).