Server Management
As mentioned in previous sections, a client has the ability to manage servers on the server level to keep them running even when they are not serving any objects. The client's primary mechanism for this is the IClassFactory::LockServer function described above. By calling this function with the TRUE parameter, the client places a lock on the server. As long as the server either has objects created or has one or more locks on it, the server will continue to execute. When the server detects a zero object and zero lock condition, it can unload itself (which differs between .DLL and .EXE servers, as described in Chapter 7).
A client can place more than one lock on a server by calling IClassFactory::LockServer(TRUE) more than once. Each call to LockServer(TRUE) must be matched with a call to LockServer(FALSE)—the server maintains a lock count for the server as it maintains a reference count for its served objects. But while AddRef and Release affect objects, LockServer affects the server itself.
LockServer affects all servers—in-process, local, and remote—identically. The client does have some additional control over in-process objects as it normally would for other .DLLs through the functions CoLoadLibrary, CoFreeUnusedLibraries, and CoFreeAllLibraries, as described below. Normally only CoFreeUnusedLibraries is called from a client whereas the others are generally used inside the COM Library to implement other API functions. In addition, the COM Library supplies one additional function that has meaning in this context, CoIsHandlerConnected, that tells the container if an object handler is currently working in association with a local server as described in its entry below.