none
IAccessibleEx接口实现的问题 RRS feed

全部回复

  • 看一下这个 http://msdn.microsoft.com/zh-cn/library/dd561924.aspx

    AccessibleObjectFromWindow是否返回成功?


    麻烦把正确答案设为解答。

    2011年3月26日 14:30
    版主
  • CComPtr<IAccessible> CMSAAClientDlg::GetServerAccessible()
    {
    	// get window HWND from the shared memory
    	HANDLE hMap = OpenFileMapping(FILE_MAP_READ, FALSE, _T("ACCESS_HWND")); // 窗口句柄放在共享内存中
    	if ( NULL == hMap )
    	{
    		return NULL;
    	}
    
    	HWND* phWnd = (HWND*)MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, sizeof(HWND));
    	if ( NULL == phWnd )
    	{
    		CloseHandle(hMap);
    		return NULL;
    	}
    
    	m_hServerWnd = *phWnd;
    
    	UnmapViewOfFile(phWnd);
    	CloseHandle(hMap);
    
    	CComPtr<IAccessible> spAcc;
    	HRESULT hRes = AccessibleObjectFromWindow(m_hServerWnd, OBJID_CLIENT, __uuidof(IAccessible), (void**)&spAcc);
    	if ( hRes != S_OK )
    	{
    		return NULL;
    	}
    
    	return spAcc;
    }
    
    void CMSAAClientDlg::OnBnClickedButtonDoaction()
    {
    	// TODO: Add your control notification handler code here
    	CComPtr<IAccessible> spAcc = GetServerAccessible();
    	if ( NULL == spAcc )
    	{
    		AfxMessageBox(_T("Failed to get accessile object."));
    		return;
    	}
    
    	HRESULT hRes;
    
    	CComBSTR bstrName;
    	spAcc->get_accName(CComVariant(CHILDID_SELF), &bstrName);
    	spAcc->get_accDefaultAction(CComVariant(CHILDID_SELF), &bstrName);
    	
    	CComQIPtr<IServiceProvider, &IID_IServiceProvider> spSP = spAcc;
    	
    	if ( NULL == spSP )
    	{
    		AfxMessageBox(_T("IServiceProvider is not supported."));
    		return;
    	}
    
    	CComPtr<IAccessibleEx> spAccEx;
    	//void** p = NULL;
    	hRes = spSP->QueryService(__uuidof(IAccessibleEx), __uuidof(IAccessibleEx), (void**)&spAccEx); //此处返回说“该接口没有注册”,	{
    		AfxMessageBox(_T("IAccessibleEx is not supported."));
    		return;
    	}
    
    	spAccEx->GetIAccessiblePair(NULL, NULL);
    }
    

    hRes = spSP->QueryService(__uuidof(IAccessibleEx), __uuidof(IAccessibleEx), (void**)&spAccEx); 到这一行失败。不知道为什么?是不是又是存根代理出了问题?错误码为:REGDB_E_IIDNOTREG

    这个是系统的接口嘛。而且服务那端的代码都正确返回了、

    2011年3月27日 0:08
  • 我搜索了一下注册表,里面根本没有与IAccessibleEx接口相关的项,

    我用的是Win7,这个接口应该是自带的,为什么会没有,而且我是用VS2010的开发环境,没有道理吧

    http://msdn.microsoft.com/zh-cn/library/ee671234.aspx

    我重新注册了UIAutomationCore.dll,还是没有 

    什么意思这个?!

    2011年3月27日 1:38
  • 没有人玩过这个?

    2011年3月30日 14:06