重複使用物件的現有指標
在此案例中,伺服器會每次使用相同的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;
}