As you saw in Chapter 2, COM is a beautiful, logical model for component-based development. The underlying concepts that define the COM model—such as encapsulation, abstraction, and polymorphism—are essentially simple principles. Despite the simplicity of the model itself, however, many developers find COM development under C++ tedious. Many developers (ourselves included) complain that a significant portion of day-to-day C++ COM development is spent implementing repetitive, low-level details. In this chapter, we'll focus on the client-side use of COM and take an in-depth look at the ATL classes that make client-side COM easier. Specifically, we'll look at the ATL smart pointer classes CComPtr and CComQIPtr, the data conversion classes CComBSTR and CComVariant, and the handy CComDispatchDriver class.