Поделиться через


Повторное использование существующих указателей на объекты

В этом сценарии сервер реагирует на запрос OBJID_CLIENT с помощью одного и того же указателя интерфейса IAccessible каждый раз.

В следующем примере кода объект элемента управления извлекается из данных дополнительного окна, а метод элемента управления вызывается для получения объекта сервера специальных возможностей (класса AccServer, определенного приложением), при наличии. Если сервер специальных возможностей еще не существует, он создается.

При создании объекта сервера специальных возможностей у него счётчик ссылок, равный 1. LresultFromObject увеличивает число ссылок несколько раз, но эти ссылки будут выпущены, когда клиент завершит работу с объектом. Сервер освобождает ссылку при уничтожении окна управления.

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