Riutilizzare i puntatori esistenti agli oggetti

In questo scenario il server risponde a una richiesta di OBJID_CLIENT usando lo stesso puntatore dell'interfaccia IAccessibile ogni volta.

Nel codice di esempio seguente l'oggetto control viene recuperato dai dati della finestra aggiuntiva e viene chiamato un metodo del controllo per recuperare l'oggetto server di accessibilità (classe AccServer definita dall'applicazione), se presente. Se il server di accessibilità non esiste ancora, viene creato.

Quando viene creato l'oggetto server di accessibilità, ha un numero di riferimenti pari a 1. LresultFromObject incrementa il conteggio dei riferimenti più volte, ma questi riferimenti verranno rilasciati al termine del client con l'oggetto . Il server rilascia il riferimento quando la finestra di controllo viene eliminata.

case WM_GETOBJECT:
    {
        // Return the IAccessible object. 
        if ((DWORD)lParam == (DWORD)OBJID_CLIENT)
        {
            // Get the control.  
            CustomListControl* pCustomList = (CustomListControl*)(LONG_PTR)GetWindowLongPtr(hwnd, 0);
            // Create the accessible object. 
            AccServer* pAccServer = pCustomList->GetAccServer();
            if (pAccServer == NULL)
            {
                pAccServer = new AccServer(hwnd, pCustomList);
                pCustomList->SetAccServer(pAccServer);
            }
            if (pAccServer != NULL)  // NULL if out of memory. 
            {
                LRESULT Lresult = LresultFromObject(IID_IAccessible, wParam, pAccServer);
                return Lresult;
            }
            else return 0;
        }
        break;
    }

    
case WM_DESTROY:
    {
    CustomListControl* pCustomList = (CustomListControl*)(LONG_PTR)GetWindowLongPtr(hwnd, 0);
    AccServer* pAccServer = pCustomList->GetAccServer();
    if (pAccServer!= NULL)
    {
        // Notify the accessibility object that the control no longer exists. 
        pAccServer->SetControlIsAlive(false);
        // Release the reference created in WM_GETOBJECT. 
        pAccServer->Release(); 
    }   
    // Destroy the control. 
    delete pCustomList;
     break;
    }