向熟悉C#与COM组件互操作的大神们求助!

问题描述

最近正在学习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调用这方面弱?

时间: 2024-10-18 14:06:27

向熟悉C#与COM组件互操作的大神们求助!的相关文章

有熟悉http接口 的大神吗 高分

问题描述 有熟悉http接口 的大神吗 高分 想了解下 怎么写一个网管http接口 不太明白 网管http接口_是什么意思 解决方案 就是说用web服务编程技术写一个基于 web 的管理程序.你可以用jsp asp php python ruby等语言来实现. 解决方案二: 就是提供web服务的网管页面,通过网页发送各种请求,后台web server将指令转换为网管指令 解决方案三: 网吧类的使用吗,网管接口你可以用PHP实现,注意是需要服务器的 写一个功能类的东西,比如查询一下网吧用户信息或是

求助!基于opnet的VPN仿真。拜托各位大神谁熟悉opnet可以帮帮我吗?

问题描述 求助!基于opnet的VPN仿真.拜托各位大神谁熟悉opnet可以帮帮我吗? 真的很急TAT,求大神帮忙!小女子在此谢过各路大神~~~~~~~~ 解决方案 OPNETOPNET

关于tomcat级联 有没有熟悉这方面的大神

问题描述 关于tomcat级联 有没有熟悉这方面的大神 大家有熟悉tomcat apache级联技术的 做全国的级联需要的技术条件 解决方案 http://blog.csdn.net/kypfos/article/details/3081330http://www.iteye.com/topic/1017961

menu-熟悉android5.0或者对源码熟悉的大神帮帮忙。。。。。困扰好几天了。。。。在下感激不尽

问题描述 熟悉android5.0或者对源码熟悉的大神帮帮忙.....困扰好几天了....在下感激不尽 问题描述:android5.0将Menu键取消之后,公司里面在底层加了一个实现Menu的按钮. 放在了actionBar的overflow的位置,虽然它是调用系统的....但显示的位置是在那 个地方...现在的问题是要怎么改变他设计的Menu Button的样式和颜色...(这个样式 是画出来的..),我曾经用Menu的overflow的src属性去覆盖它...但是切屏之后 会消失,而且不能再

fpga-哪位大神熟悉FPGA的FIFO操作,尤其是IP软核,帮个忙分析一下原因

问题描述 哪位大神熟悉FPGA的FIFO操作,尤其是IP软核,帮个忙分析一下原因 这是我用IP核生成的FIFO,测试了一下,为什么q[7:0]输出的数据全都是00啊?顶层中重实例化的FIFO: FIFO FIFO_inst( .clock ( clk ), .data ( Rx_Data ), .rdreq ( read ), .wrreq (write), .empty ( empty_sig ), .full ( full_sig ), .q ( Tx_Data ) ); 串行接收数据时wr

数据仓库-SSIS 查找组件 自定义查询 求大神指导!

问题描述 SSIS 查找组件 自定义查询 求大神指导! 我正在使用SQLSERVER的SSIS处理数据,现在遇到一个问题:数据仓库中有一维度表A,A的主键由A_id和时间组成,A中还有一列是自己新加的自增长的SK,现在想通过A_id和时间来查找SK.事实表B有A_id和另一个相关的时间列(但B中时间不与A中相等),想用B表查找其对应的A表的SK,有人说要用查找组件的自定义查找,试了一下发现自己写的SQL不能用if else等的判断语句,这下该肿么办? T_T

java-请熟悉Java swing的大神帮忙看下这是什么控件

问题描述 请熟悉Java swing的大神帮忙看下这是什么控件 就是常见的这种提示框,Java有没有这种控件?叫什么名字? 解决方案 这是用JComponent的一个方法实现的,方法名为public void setToolTipText(String text) 例如我最近用给 JLabel添加提示语, 代码如下: JLabel lbl_setOutput = new JLabel(); ...... lbl_setOutput.setToolTipText("修改输出目录"); 效

c#调用com组件的奇怪问题,各位大神帮忙

问题描述 c#调用com组件的奇怪问题最近做了一个简单的http服务器,要求在收到客户端发送的数据后根据数据的不同调用com组件的不同方法,现在总是没有响应,代码流程示例如下:1.线程定义thread=newThread(newThreadStart(listen));thread.IsBackground=true;thread.Start();2.方法体其中:c.OpenCard()是调用com组件的代码,该com组件由c++bulider编写.publicvoidlisten(){IPAd

编程-c#,winform跨线程更改ui组件,出错,求大神帮帮忙

问题描述 c#,winform跨线程更改ui组件,出错,求大神帮帮忙 以下是截图: 源码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windo