Gunakan Kembali Pointer yang Ada ke Objek
Dalam skenario ini, server merespons permintaan OBJID_CLIENT menggunakan penunjuk antarmuka IAccessible yang sama setiap kali.
Dalam contoh kode berikut, objek kontrol diambil dari data jendela tambahan, dan metode kontrol dipanggil untuk mengambil objek server aksesibilitas (kelas AccServer yang ditentukan aplikasi), jika ada. Jika server aksesibilitas belum ada, server tersebut dibuat.
Ketika objek server aksesibilitas dibuat, objek memiliki jumlah referensi 1. LresultFromObject menaikkan jumlah referensi beberapa kali, tetapi referensi ini akan dirilis ketika klien selesai dengan objek . Server merilis referensinya ketika jendela kontrol dihancurkan.
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;
}