Is Win32 bad - yes it is.|
You must remember, however, that Win32 is directly derived from Win16, that simple "OS API" provided by Win3.1, Win386 and the likes. While MS has enhanced the API significantly (in many ways that have little to do with the move from 16-bit to 32-bit) the crappy core remains - it must in order to retain backward compatibility.
Another thing you should be aware of is that the Win32 API is dead, Don Box said so. MS is actively pushing Windows developers away from the Win32 API towards .NET . Actually this process started long before .NET with such marvels of design as MFC.
Finally, Win32 originally defined almost all handle types as void* . Subsequently they introduced the STRICT preprocessor definition, which resulted in the different handles getting a different type. Because this definition could break old code, it wasn't used by default. Starting with VC6 (as I recall) this definition is placed by default in new projects. I don't recall HANDLE's definition, but you should make sure that your project defines STRICT.