重用指向对象的现有指针
在此方案中,服务器每次使用相同的 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;
}