ATL has always been the most powerful way to build COM objects in C++. Unfortunately, with that power comes complexity. ATL requires an advanced understanding of C++ to use it effectively. That advanced understanding took more effort than many people were willing to invest. Instead, many of those users used Visual Basic to do COM instead of C++. Unfortunately, there are some COM things VB 6 just doesn't do (including marshal-by-value, ActiveX controls with sophisticated drawing, and multithreading); when people hit those limits, they were forced back into the C++ world.
Even for those who are experienced C++ developers, building ATL projects can be a headache. Some of the most important information about your project isn't even in C++; it's in IDL and RGS files and resources. It can be a real effort to keep all these different parts in sync.
When Visual Studio .NET was released in 2002, the ATL team took an unusual approach in attempting to address these issues: They extended the C++ language. That extension is called attributed ATL.