Variants suck (who spends 20 bytes on a single variable? It it were 16 then at least alignement would be ok, but this way it actually uses 32 bytes!).

If you do want to use them, you're better off using the _variant_t wrapper class defined in comutil.h. This is only available in MSVC++.