指针的指针该怎么得到其中的数据了?

jimu8130 2010-04-03 11:38:52
我需要使用一个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));

...全文
168 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimu8130 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 liaochong19870619 的回复:]
com 不是可以直接转的吗?
[/Quote]
不明白你所谓的转是什么意思,请帮忙说明白点!
jimu8130 2010-04-04
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 xingyuebuyu 的回复:]
像我那样写,就是指针v所指向的地址里的内容是pv,而pv的值是structA所在的内存地址
并不是说将pv的值即structA内存地址赋值给v了.它还是一个指向关系

你最好C++试下,看得到的结果是什么样的?
[/Quote]
唉,c++好久没用了,不知道该怎么下手,郁闷,调试了几次,你那样的写法得不到正确的结果
liaochong19870619 2010-04-04
  • 打赏
  • 举报
回复
IHTMLDocument2 doc ;
doc = webBrowser1.Document.DomDocument as IHTMLDocument2;


webBrowser1.Document.DomDocument 返回的就是一个 非托管的指针

IHTMLDocument2 是com的一个指针..

当然 IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument 也一样.

我就这么用的....
jimu8130 2010-04-03
  • 打赏
  • 举报
回复
没看出问题.
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));
-----------------------------------------------------------
这位兄弟你的调用方法我试下看看。
jimu8130 2010-04-03
  • 打赏
  • 举报
回复
这类问题你可以先找一个类似的COM标准接口调用借鉴一下。
---------------------------------------------
哥们,要是能找到类似的我能跑到csdn来问么?我自己就可以搞定了
王集鹄 2010-04-03
  • 打赏
  • 举报
回复
这类问题你可以先找一个类似的COM标准接口调用借鉴一下。
xingyuebuyu 2010-04-03
  • 打赏
  • 举报
回复
没看出问题.
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));
liaochong19870619 2010-04-03
  • 打赏
  • 举报
回复
com 不是可以直接转的吗?
xingyuebuyu 2010-04-03
  • 打赏
  • 举报
回复
像我那样写,就是指针v所指向的地址里的内容是pv,而pv的值是structA所在的内存地址
并不是说将pv的值即structA内存地址赋值给v了.它还是一个指向关系

你最好C++试下,看得到的结果是什么样的?
jimu8130 2010-04-03
  • 打赏
  • 举报
回复
pv是指向一块structA容量大小的指针,v只是一个申请好存放一个指针容量大小的指针,此时v里面的内数应该是随机的,Marshal.WriteIntPtr(v, pv);就是将pv这个指针放到指针v所指向的地址.

没有这个COM的说明文件,没有DEMO就难办了.

如果可以,你最好使用C++来调用这个COM试试,看得到的structA内容和C#有什么区别,是否相同?
-------------------------------------------------------
按说pv的值是structA所在的内存地址,而v的值应该是pv的地址值,这样才符合指针的指针的定义吧,不知道我理解对不对?如果是兄弟你那种赋值,从字面来看似乎是将pv的值即structA内存地址赋值给v了。
operatezhang 2010-04-03
  • 打赏
  • 举报
回复
没有看到过这个东西啊!
xingyuebuyu 2010-04-03
  • 打赏
  • 举报
回复
pv是指向一块structA容量大小的指针,v只是一个申请好存放一个指针容量大小的指针,此时v里面的内数应该是随机的,Marshal.WriteIntPtr(v, pv);就是将pv这个指针放到指针v所指向的地址.

没有这个COM的说明文件,没有DEMO就难办了.

如果可以,你最好使用C++来调用这个COM试试,看得到的structA内容和C#有什么区别,是否相同?

不确定structB和structC是否也要像structA那样先分配空间然后再调用GetStructA去获取StructA的内容
jimu8130 2010-04-03
  • 打赏
  • 举报
回复
HRESULT GetStructA(int ssi, [out] structA** ppA);--------这个是随com过来的idl说明文件
经过vs2008引用后自动变成了
public virtual void GetStructA(int ssi, IntPtr ppA);
jimu8130 2010-04-03
  • 打赏
  • 举报
回复
我就是用你说的这种方式来试验,不过貌似能取到值,不过从值上面来看并不正确
jimu8130 2010-04-03
  • 打赏
  • 举报
回复
v = Marshal.AllocCoTaskMem(4);
pv = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(structA)));

Marshal.WriteIntPtr(v, pv);
-----------------------

xingyuebuyu兄弟,对这段代码我有点疑问,v实际是个指针,pv也是个指针,那么后面的marshal应该将pv的地址当做v的值来存入吧?
xingyuebuyu 2010-04-03
  • 打赏
  • 举报
回复
Marshal.AllocCoTaskMem就是在外面分配空间了.
我说的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));
jimu8130 2010-04-03
  • 打赏
  • 举报
回复
一步一步往下解析就好了,着先得到structA,然后再structB,最后structA就好了.
你有调用这个COM的DEMO不,参考下,看这些结构体的内存空间是在COM里分配得,还是在COM外分配好然后再传进去的

目前你成功得到structA了没?
--------------------------------------------------------
得到了,有demo还好,主要是没demo,没文档,弄这个弄的很无奈啊
请问在com外分配一般怎么来做,在com内又怎么弄,分别调用什么样的相关方法?

(*(*ppA))
这应该就是指向的结构体

还没碰到这种事情
--------------------------------
不会这么用吧?这不是简单的本机内存分配,而是com组件方法调用。
flyerwing 2010-04-03
  • 打赏
  • 举报
回复
(*(*ppA))
这应该就是指向的结构体

还没碰到这种事情
xingyuebuyu 2010-04-03
  • 打赏
  • 举报
回复
一步一步往下解析就好了,着先得到structA,然后再structB,最后structA就好了.
你有调用这个COM的DEMO不,参考下,看这些结构体的内存空间是在COM里分配得,还是在COM外分配好然后再传进去的

目前你成功得到structA了没?
jimu8130 2010-04-03
  • 打赏
  • 举报
回复
现在突然发现这个com参数真是很龌龊,居然指针套着指针
比如说structA
其包含两个参数
int count;
[size_is(sz)] structB* b;
接下来structB的定义包含2个参数
int id
structC* c;
最后才是主角structC,其包含两个参数
int id
int name

请问我该如何得到最终结果,即structC

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧