stdcall dates back to when there were multiple languages and compilers for native code... microsoft used it in the hope that it would give people less reasons to hate windows, and its been plaguing c/c++ users ever since.
I think windows has some special magic so that message handlers can use either convention without exploding, because if people can muck it up, then they will do so, and have done so. This doesn't mean that you should do so.
stdcall is nice because if you passed the wrong number of arguments, your whole program explodes...
using cdecl means you probably won't notice for years.
stdcall's symbol decorations that add @4 or whatever depending on the number of arguments help when you have dodgy function protypes all over the place. personally I use fastcall as a default calling convention in debug builds so stuff like this is blatent, its like stdcall but with the added illusion of extra speed!
win64 has only one calling convention. it'll ignore any stdcall/cdecl/fastcall markup (it might still warn though, for compat with 32bit code if its later compiled for that instead).
and 64bit linux/unix predates that with a different one (except for wine, anyway).