다음을 통해 공유


개체에 대한 기존 포인터 다시 사용

이 시나리오에서 서버는 매번 동일한 IAccessible 인터페이스 포인터를 사용하여 OBJID_CLIENT 요청에 응답합니다.

다음 예제 코드에서는 컨트롤 개체가 추가 창 데이터에서 검색되고 컨트롤의 메서드가 호출되어 접근성 서버 개체(애플리케이션에서 정의한 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;
    }