In the last chapter, you learned how to package a COM object from a number of interfaces. You also learned how to build a class factory that can dynamically create your COM objects in a distributed environment. You wrote the code, but you couldn’t test the COM object just yet, because you haven’t put the code for the COM object and its class factory inside a binary module, such as a DLL or an EXE, that can be executed.
In this chapter, you will learn how to build these binary modules, which can both use and expose COM objects. We call these binary modules COM components. As shown in Figure 4-1, a client component can be any COM application that uses a COM object’s interfaces. Server components, on the other hand, are the ones that host COM objects and their associated class factories.
The C++ code that you see in this chapter can be automated by Visual C++ and the ATL wizards with a few mouse clicks. However, knowing what’s needed to create a component from scratch will empower you. There’s no magic in the wizard-generated code, shown in Chapter 6 and onwards.
By the time you finish this chapter, you will know how to package COM objects into a COM application suitable for a distributed environment. You will also know how to write client applications that make use of remote COM objects. Furthermore, you’ll know how to dynamically reuse COM objects that are already developed and deployed.
Here’s a list of what’s covered in this chapter.
Servers—Class factories and objects cannot execute alone. They need either a house (EXE) or a shed (DLL) to host them. Like an EXE, a house stands alone, whereas, a shed—like a DLL—is useful only next to a structure. Recall that components are DLLs, OCXs, and EXEs. You’ll learn the necessary code for developing a component in this section. Specifically, we’ll examine the required code for component initialization, termination, dynamic activation, lifetime, and registration.
Clients—Clients are components that use a different component’s objects. You’ll learn the necessary code for developing a COM compatible client in this section. These clients must abide by the initialization, termination, object creation, interface usage, and lifetime management rules of COM.
Object Orientation—Having learned the basics of COM, we can judiciously discuss the object orientation aspects of COM. In this section, you’ll also learn COM’s component reuse mechanisms: containment and aggregation.
This chapter is a sequel to the previous one. The previous chapter and this chapter capture all the basic elements for building distributed components. Like the last chapter, you should read this chapter from beginning to end for understanding. Then, review the relevant sections in this chapter, as well as the last chapter, when you build your own distributed components.