我需要使用一个com组件,其自带的IDL文件申明是:methodA([out] structA** ppA),当我直接用vs2008引用com组件将其导入后就自动变成了methodA(intptr ppA),该指针最终指向一个结构structA,请问我该怎么使用methodA,并且获取得到那个结构体里面的数据?目前我使用以下代码,请问有什么错误? IntPtr v;
IntPtr pv;
v = Marshal.AllocCoTaskMem(4);
pv = Marshal.AllocCoTaskMem(4);
methodA(v);
pv = (IntPtr)Marshal.PtrToStructure(v, typeof(IntPtr)); structA a=(structA)Marshal.PtrToStructure(pv, typeof(structA));
IntPtr pv;
v = Marshal.AllocCoTaskMem(4);
pv = Marshal.AllocCoTaskMem(4);
methodA(v);
pv = (IntPtr)Marshal.PtrToStructure(v, typeof(IntPtr)); structA a=(structA)Marshal.PtrToStructure(pv, typeof(structA));
解决方案 »
- 用webclient或者webrequest+webreponse获取网页图片为空白?
- 求助:怎样对数组类型的类属性进行赋值操作?
- datatable access
- HttpWebRequest提交对方网站,有的页面成功,有的不成功。几天了,一直没搞定,请高手帮忙解决,非常感谢
- 错误求助:ConnectionString 属性尚未初始化
- C#精髓 第二讲 WMI完美秀出CPU编号制造商名称主频二级缓存电压最大时钟频率等全部信息
- 所有的分一次给完吧?难呀!!!!!!!!!!!!!!
- HttpWebResponse 中cookie传递问
- 我该如何分辨当前操作系统????
- 菜鸟问的问题:Form的Close()方法是否可以重写(很急)
- 如何通过对话框刷新主窗口界面
- 鼠标悬停在TreeView节点上就出现节点信息,想取消息这个节点信息,请前辈指点!小弟选感谢了!
v指向结构体structA的指针地址pv.逻辑没有问题.
除非这个COM需要你对structA的地址空间进行分配完毕,再传进去,不然这样就可以获取到数据了.
可以使用下用的方法尝试下. IntPtr v;
IntPtr pv;
v = Marshal.AllocCoTaskMem(4);
pv = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(structA))); Marshal.WriteIntPtr(v, pv); methodA(v);
structA a=(structA)Marshal.PtrToStructure(pv, typeof(structA));
---------------------------------------------
哥们,要是能找到类似的我能跑到csdn来问么?我自己就可以搞定了
v指向结构体structA的指针地址pv.逻辑没有问题.
除非这个COM需要你对structA的地址空间进行分配完毕,再传进去,不然这样就可以获取到数据了.
可以使用下用的方法尝试下. IntPtr v;
IntPtr pv;
v = Marshal.AllocCoTaskMem(4);
pv = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(structA))); Marshal.WriteIntPtr(v, pv); methodA(v);
structA a=(structA)Marshal.PtrToStructure(pv, typeof(structA));
-----------------------------------------------------------
这位兄弟你的调用方法我试下看看。
比如说structA
其包含两个参数
int count;
[size_is(sz)] structB* b;
接下来structB的定义包含2个参数
int id
structC* c;
最后才是主角structC,其包含两个参数
int id
int name请问我该如何得到最终结果,即structC
你有调用这个COM的DEMO不,参考下,看这些结构体的内存空间是在COM里分配得,还是在COM外分配好然后再传进去的目前你成功得到structA了没?
这应该就是指向的结构体还没碰到这种事情
你有调用这个COM的DEMO不,参考下,看这些结构体的内存空间是在COM里分配得,还是在COM外分配好然后再传进去的目前你成功得到structA了没?
--------------------------------------------------------
得到了,有demo还好,主要是没demo,没文档,弄这个弄的很无奈啊
请问在com外分配一般怎么来做,在com内又怎么弄,分别调用什么样的相关方法?(*(*ppA))
这应该就是指向的结构体还没碰到这种事情
--------------------------------
不会这么用吧?这不是简单的本机内存分配,而是com组件方法调用。
我说的COM内分配空间是指写COM组件的人在COM内分配空间,最后将分配的空间首地址返回给你使用.成功得到structA后再根据b所指向的指针得structB,再根据c所指向的指针得structC.structA a=(structA)Marshal.PtrToStructure(pv, typeof(structA));
structB b1=(structB)Marshal.PtrToStructure(a.b, typeof(structB));
structC c1=(structC)Marshal.PtrToStructure(b1.c, typeof(structC));反正都是Marshl类的使用.你成功得到structA是使用的哪种方式?是像下面这样的不?如果不是贴出来看看
IntPtr v;
IntPtr pv;
v = Marshal.AllocCoTaskMem(4);
pv = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(structA))); Marshal.WriteIntPtr(v, pv); methodA(v);
structA a=(structA)Marshal.PtrToStructure(pv, typeof(structA));
pv = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(structA))); Marshal.WriteIntPtr(v, pv);
-----------------------
xingyuebuyu兄弟,对这段代码我有点疑问,v实际是个指针,pv也是个指针,那么后面的marshal应该将pv的地址当做v的值来存入吧?
经过vs2008引用后自动变成了
public virtual void GetStructA(int ssi, IntPtr ppA);
-------------------------------------------------------
按说pv的值是structA所在的内存地址,而v的值应该是pv的地址值,这样才符合指针的指针的定义吧,不知道我理解对不对?如果是兄弟你那种赋值,从字面来看似乎是将pv的值即structA内存地址赋值给v了。
并不是说将pv的值即structA内存地址赋值给v了.它还是一个指向关系你最好C++试下,看得到的结果是什么样的?
doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
webBrowser1.Document.DomDocument 返回的就是一个 非托管的指针IHTMLDocument2 是com的一个指针..当然 IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument 也一样.我就这么用的....