Don't do it! ATL is pretty useful for dealing with COM, especially if you're going to be doing anything related to a user interface or reusable control. It's just not worth the time and effort, and it would be a ton of effort (there's lots of ATL functionality that you'd need to duplicate). ATL really really is a very good way to do COM.
Note that ATL includes some basic Windowing/GDI support, and WTL expands on this. WTL is also pretty dang good.
Try and find these books:
- ATL Internals (huge ++++ on this one)
- Wrox Visual C++ ActiveX/COM control programming (surprising good for a wrox book)
- Active Template Library a Developers Guide (not as good as ATL Internals but still pretty useful)
Essential COM is ok if you're doing lots of low level COM stuff... but frankly I spent a lot more time in the above books.
These are all really old... but I found them very useful (I've got a few ActiveX controls that run only from IE).
On whole IE is a pretty good control container and I didn't have much trouble with it. Deployment is the only tricky part, and it's only tricky if you're trying to deploy the controls as part of a web application. If I was doing it over again I would start with a very simple ActiveX who's sole responsibility would be to report the currently installed version of the .DLL. And I'd never ever change this control (other than to update the version number). This control would allow for easy verification of what version of the .DLL is/is not installed from JavaScript (IE kind of handles this for you... but not in a particularly brilliant way).