Compartir a través de


Reutilización de punteros existentes a objetos

En este escenario, el servidor responde a una solicitud de OBJID_CLIENT mediante el mismo puntero de interfaz IAccessible cada vez.

En el código de ejemplo siguiente, el objeto de control se recupera de los datos de ventana adicionales y se llama a un método del control para recuperar el objeto de servidor de accesibilidad (la clase AccServer definida por la aplicación), si existe. Si el servidor de accesibilidad aún no existe, se crea.

Cuando se crea el objeto de servidor de accesibilidad, tiene un recuento de referencias de 1. LresultFromObject incrementa el recuento de referencias varias veces, pero estas referencias se liberarán cuando el cliente haya terminado con el objeto . El servidor libera su referencia cuando se destruye la ventana de control.

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;
    }