Wiederverwenden vorhandener Zeiger auf Objekte
In diesem Szenario antwortet der Server jedes Mal mit demselben IAccessible-Schnittstellenzeiger auf eine OBJID-CLIENTanforderung. _
Im folgenden Beispielcode wird das Steuerelementobjekt aus den zusätzlichen Fensterdaten abgerufen, und eine Methode des Steuerelements wird aufgerufen, um das Zugriffsserverobjekt (die anwendungsdefinierte AccServer-Klasse) abzurufen, sofern vorhanden. Wenn der Barrierefreiheitsserver noch nicht vorhanden ist, wird er erstellt.
Wenn das Barrierefreiheitsserverobjekt erstellt wird, hat es den Verweiszähler 1. LresultFromObject erhöht den Verweiszähler mehrmals, aber diese Verweise werden freigegeben, wenn der Client mit dem -Objekt fertig ist. Der Server gibt seinen Verweis frei, wenn das Steuerungsfenster zerstört wird.
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;
}