|                
 |  | 
  
    |  | COM and CORBAŽ Side by Side |  Errata
Errors always pop up where you least expect them. This page describes errors
contained in the book.
 Page 78 - Attempting to call SysFreeString() with an unset pointer.Thanks to Tomas Palmer for pointing this out. Here is a code snippet identifying
the problem.BOOL MyCheckingAccount::Init(const CString& name,
                             const CString& serverName,
                             CString& errmsg)
{
    Reset();
    // Create server info.
    COSERVERINFO  serverInfo;
    COSERVERINFO* pServerInfo;
    if ( serverName.IsEmpty() )
    {
        // Use local server.
        pServerInfo = NULL;
    }
    else
    {
        serverInfo.dwReserved1 = 0;
        serverInfo.dwReserved2 = 0;
        serverInfo.pwszName    = serverName.AllocSysString();
        serverInfo.pAuthInfo   = NULL;
        pServerInfo = &serverInfo;
    }
    // Create MULTI_QI array to get all pertinent interfaces.
    MULTI_QI mqi[] =
    {
        {&IID_IAccount,         NULL, 0},
        {&IID_IAccountInit,     NULL, 0},
        {&IID_ICheckingAccount, NULL, 0},
    };
    // Create a server object instance.
    HRESULT hr;
    hr = CoCreateInstanceEx
            (CLSID_Ch3CheckingAccount, NULL,
             CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER,
             pServerInfo, 3, mqi);
    ::SysFreeString(serverInfo.pwszName);   // ****** ERROR ******
Notice that if the serverName argument to Init() is an empty string,
serverInfo.pwszName never gets set. To correct the problem, a check needs to be
made before calling ::SysFreeString(). For example, the check could be written
as shown here:    if ( !serverName.IsEmpty() )
    {
        ::SysFreeString(serverInfo.pwszName);
    }
 |