Opakované použití existujících ukazatelů na objekty
V tomto scénáři server odpoví na požadavek OBJID_CLIENT pomocí stejného IAccessible ukazatel rozhraní pokaždé.
V následujícím příkladu kódu se ovládací objekt načte z doplňkových dat okna a je volána metoda ovládacího prvku pro načtení objektu serveru usnadnění (třída AccServer definovaná aplikací), pokud existuje. Pokud server přístupnosti ještě neexistuje, vytvoří se.
Při vytváření objektu serveru přístupnosti má referenční počet 1. LresultFromObject několikrát zvýší počet odkazů, ale tyto odkazy budou vydány po dokončení klienta s objektem. Server uvolní svou referenci, když je ovládací okno zničeno.
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;
}