Yes, Windows is a bit lame in the way it handles command line arguments, but on the other hand, the way it works is only slightly inconvenient.
You call GetCommandLineA to get the command line as a zero terminated string, which you can then manipulate as you wish.
Alternatively, you can call GetCommandLineW, which returns the unicode variant, and then pass that to CommandLineToArgvW, to turn it into an argv style array of unicode strings.
If you really need the data in UTF-8, you can convert an individual element of the array using WideCharToMultiByte.
Personally, if I'd been working for Microsoft when they came up with this scheme (begin flagellation excercises for even voicing that thought) I'd have implemented ArgvA and ArgvW so you could choose which flavour of chocolate cake you prefer without having to bake the @~$< thing yourself.