我需要使用一个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));

解决方案 »

  1.   

    没看出问题.
    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));
      

  2.   

    这类问题你可以先找一个类似的COM标准接口调用借鉴一下。
      

  3.   

    这类问题你可以先找一个类似的COM标准接口调用借鉴一下。
    ---------------------------------------------
    哥们,要是能找到类似的我能跑到csdn来问么?我自己就可以搞定了
      

  4.   

    没看出问题.
    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));
    -----------------------------------------------------------
    这位兄弟你的调用方法我试下看看。
      

  5.   

    现在突然发现这个com参数真是很龌龊,居然指针套着指针
    比如说structA
    其包含两个参数
    int count;
    [size_is(sz)] structB* b;
    接下来structB的定义包含2个参数
    int id
    structC* c;
    最后才是主角structC,其包含两个参数
    int id
    int name请问我该如何得到最终结果,即structC
      

  6.   

    一步一步往下解析就好了,着先得到structA,然后再structB,最后structA就好了.
    你有调用这个COM的DEMO不,参考下,看这些结构体的内存空间是在COM里分配得,还是在COM外分配好然后再传进去的目前你成功得到structA了没?
      

  7.   

    (*(*ppA))
    这应该就是指向的结构体还没碰到这种事情
      

  8.   

    一步一步往下解析就好了,着先得到structA,然后再structB,最后structA就好了.
    你有调用这个COM的DEMO不,参考下,看这些结构体的内存空间是在COM里分配得,还是在COM外分配好然后再传进去的目前你成功得到structA了没?
    --------------------------------------------------------
    得到了,有demo还好,主要是没demo,没文档,弄这个弄的很无奈啊
    请问在com外分配一般怎么来做,在com内又怎么弄,分别调用什么样的相关方法?(*(*ppA))
    这应该就是指向的结构体还没碰到这种事情
    --------------------------------
    不会这么用吧?这不是简单的本机内存分配,而是com组件方法调用。
      

  9.   

     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));
      

  10.   

     v = Marshal.AllocCoTaskMem(4);
      pv = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(structA)));  Marshal.WriteIntPtr(v, pv);
    -----------------------
     
    xingyuebuyu兄弟,对这段代码我有点疑问,v实际是个指针,pv也是个指针,那么后面的marshal应该将pv的地址当做v的值来存入吧?
      

  11.   

    HRESULT GetStructA(int ssi, [out] structA** ppA);--------这个是随com过来的idl说明文件
    经过vs2008引用后自动变成了  
    public virtual void GetStructA(int ssi, IntPtr ppA);
      

  12.   

    pv是指向一块structA容量大小的指针,v只是一个申请好存放一个指针容量大小的指针,此时v里面的内数应该是随机的,Marshal.WriteIntPtr(v, pv);就是将pv这个指针放到指针v所指向的地址.没有这个COM的说明文件,没有DEMO就难办了.如果可以,你最好使用C++来调用这个COM试试,看得到的structA内容和C#有什么区别,是否相同?不确定structB和structC是否也要像structA那样先分配空间然后再调用GetStructA去获取StructA的内容
      

  13.   

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

  14.   

    像我那样写,就是指针v所指向的地址里的内容是pv,而pv的值是structA所在的内存地址
    并不是说将pv的值即structA内存地址赋值给v了.它还是一个指向关系你最好C++试下,看得到的结果是什么样的?
      

  15.   

    IHTMLDocument2 doc ;
    doc = webBrowser1.Document.DomDocument as IHTMLDocument2;
    webBrowser1.Document.DomDocument 返回的就是一个 非托管的指针IHTMLDocument2 是com的一个指针..当然   IHTMLDocument2 doc = (IHTMLDocument2)webBrowser1.Document.DomDocument 也一样.我就这么用的....