问题描述
最近正在学习MSActiveAccessibility技术,本意是想做一个类似AccExplorer32这样的工具,在网络上找了一下相关的资料,发现了如下的页面:(MSActiveAccessibility接口技术编程尝试)根据这个教程给出的资料学习了一下,然后尝试以C#来写例子,发现一些问题,想请教一下各位大大:NativeCodeBOOLFindChild(IAccessible*paccParent,LPSTRszName,LPSTRszRole,LPSTRszClass,IAccessible**paccChild,VARIANT*pvarChild){HRESULThr;longnumChildren;unsignedlongnumFetched;VARIANTvarChild;intindex;IAccessible*pCAcc=NULL;IEnumVARIANT*pEnum=NULL;IDispatch*pDisp=NULL;BOOLfound=false;charszObjName[256],szObjRole[256],szObjClass[256],szObjState[256];//得到父亲支持的IEnumVARIANT接口hr=paccParent->QueryInterface(IID_IEnumVARIANT,(PVOID*)&pEnum);if(pEnum)pEnum->Reset();//取得父亲拥有的可访问的子的数目paccParent->get_accChildCount(&numChildren);//搜索并比较每一个子ID,找到名字、角色、类与输入相一致的。for(index=1;index<=numChildren&&!found;index++){pCAcc=NULL;//如果支持IEnumVARIANT接口,得到下一个子ID//以及其对应的IDispatch接口if(pEnum)hr=pEnum->Next(1,&varChild,&numFetched);else{...}
ManagedCodeprivateboolFindChild(objectpaccParent,stringszName,stringszRole,stringszClass,refAccessibility.IAccessiblepaccChild,refobjectpvarChild){inthr=0;intnumChildren=0;IntPtrnumFetched=default(IntPtr);objectpChild=null;intindex=0;Accessibility.IAccessiblepCAcc=null;IntPtrpUnk=default(IntPtr);IntPtrpInt=default(IntPtr);IEnumVARIANTpEnum=null;pUnk=Marshal.GetIUnknownForObject(paccParent);hr=Marshal.QueryInterface(pUnk,refHeaders.IEnum_GUID,outpInt);pEnum=(IEnumVARIANT)Marshal.GetObjectForIUnknown(pInt);Marshal.Release(pUnk);if(pEnum!=null){pEnum.Reset();}numChildren=((Accessibility.IAccessible)paccParent).accChildCount;for(index=0;index<=numChildren;index++){if(pEnum!=null){hr=pEnum.Next(1,pChild,numFetched);<--调试时中断于此,错误提示为:“其他信息:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”}else{......}
后来又发现,在For上面加入以下代码object[]load=newobject[numChildren];intlCount=0;Accessibility.IAccessibleaccParent=(Accessibility.IAccessible)paccParent;Win32API.AccessibleChildren(accParent,0,numChildren,load,outlCount);for(Int32i=0;i<=lCount-1;i++){Accessibility.IAccessibletmpLoad=(Accessibility.IAccessible)load[i];}
错误提示又没了...同时,执行IEnumVARIANT.Next后pChild永远为null...研究了很久,就是搞不明白,望熟悉C#与COM互操作的大大给解惑一下下!!另外就是C++中的VARIANT类型翻译成C#下的话根据MSDN提供的信息对应Object类型,但想了很久都没明白,望大大们不惜赐教。
解决方案
解决方案二:
这种最好看微软的官方例子。
解决方案三:
解决方案四:
引用1楼devmiao的回复:
这种最好看微软的官方例子。
官方的例子没有找到...
解决方案五:
没人能解决吗?还是c#在COM调用这方面弱?