Partager via


Réutiliser des pointeurs existants vers des objets

Dans ce scénario, le serveur répond à une demande de OBJID_CLIENT à l’aide du même pointeur d’interface IAccessible à chaque fois.

Dans l’exemple de code suivant, l’objet de contrôle est récupéré à partir des données de fenêtre supplémentaires, et une méthode du contrôle est appelée pour récupérer l’objet serveur d’accessibilité (classe AccServer définie par l’application), le cas échéant. Si le serveur d’accessibilité n’existe pas encore, il est créé.

Lorsque l’objet serveur d’accessibilité est créé, il a un nombre de références de 1. LresultFromObject incrémente le nombre de références plusieurs fois, mais ces références sont publiées lorsque le client a terminé l’objet. Le serveur libère sa référence lorsque la fenêtre de contrôle est détruite.

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