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


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

В этом сценарии сервер каждый раз отвечает на запрос 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;
    }