com组件中有个函数比如A(string para1,structCC** ppmyStruct);
导入到vs2008可使用的dll变成了A(string para1,out intptr struct)请问这样以后我该如何做才能够获取到结构体信息?肯定是在c#里面

解决方案 »

  1.   

    http://topic.csdn.net/t/20050714/18/4145144.html
    哥们请看这个文章
      

  2.   

    谢谢这位哥们,刚刚看了下c++里面的注释,居然还有更bt的事情:
    原来这个结构体的元素又是个指针结构的指针。
    这可就难办了,总不能嵌套使用这个方法吧?
      

  3.   

    unsafe struct Struct1
    {
       .......
    }unsafe struct Struct2
    {
       public Struct1* PtrStruct1;
    ......
    }
      

  4.   

    结构体就是个连续存储多个对象的内存空间
    你定义个和他结构一样的结构就行了,在不行你取到intptr指针,一段一段分析里面数据,也能知道具体是怎么存储的。
      

  5.   

    Marshal这个命名空间下的方法·
      

  6.   

    unsafe struct Struct1 

      ....... 
    } unsafe struct Struct2 

      public Struct1* PtrStruct1; 
    ...... 
    }
    -----------------------------
    那我怎么把类似您这样定义的结构和我将要使用的方法结合在一起使用了?能否给个示范了?结构体就是个连续存储多个对象的内存空间 
    你定义个和他结构一样的结构就行了,在不行你取到intptr指针,一段一段分析里面数据,也能知道具体是怎么存储的。
    --------------------------
    说是这样说,但是怎么定义了?能否给出你的定义了?这个是com组件,我这边没有相应的试验环境,只靠本机是无法得到指针信息的。不然我早就自己解决了。
    Marshal这个命名空间下的方法·
    -----------------
    1楼兄弟已经告诉当结构体没有另外一个指针的时候的解决的例子,不知道你能否给出个结构体元素是指针的例子了?不然就告诉有这个方法我也不知道具体用哪个以及该怎么用
      

  7.   

     AnyStruct obj=new AnyStruct ();
     IntPtr address=IntPtr.Zero;
     System.Runtime.InteropServices.Marshal.StructureToPtr((object)obj, address, false);
      

  8.   

    知道指针得到结构体是:
     System.Runtime.InteropServices.Marshal.PtrToStructure()
    自己看看参数就行了 很简单的参数
      

  9.   

    IntPtr ptr;
    A("aaaaa",out ptr);
    ....
    Struct2* ps2 = (Struct2*)ptr.ToPointer();
    ....
    ps2->......
      

  10.   

    AnyStruct obj=new AnyStruct (); 
    IntPtr address=IntPtr.Zero; 
    System.Runtime.InteropServices.Marshal.StructureToPtr((object)obj, address, false); 
    ------------------------
    这个结构该怎么定义了?怎么和我将要使用的方法结合使用了?请你再看看我最开始的说明!!ref:
    com组件中有个函数比如A(string para1,structCC** ppmyStruct); 
    导入到vs2008可使用的dll变成了A(string para1,out intptr struct) 请问这样以后我该如何做才能够获取到结构体信息?肯定是在c#里面
      

  11.   

    你要先知道他structCC这个结构体的内容,
    然后自己定义一个一样的结构体
    然后执行方法得到IntPtr然后
    System.Runtime.InteropServices.Marshal.PtrToStructure() 
    得到结构体
      

  12.   

    你要先知道他structCC这个结构体的内容, 
    然后自己定义一个一样的结构体 
    然后执行方法得到IntPtr然后 
    System.Runtime.InteropServices.Marshal.PtrToStructure() 
    得到结构体
    -----------------------------------------
    因为我目前能够看到dll转换成vs生成的dll中的类型和方法定义,例如上面的
    structCC的元素
    int count;
    intptr structBBlist;-----这应该是个结构体数组structBB的元素
    string x;
    string y;
    那我是不是不需要自己定义了?我该怎么得到structBB的数组了?
      

  13.   

    你把Struct的结构题代码放出来吧 我给你写个……
      

  14.   

    com组件的idl中声明:
    typedef struct _strcutBB
    {  
    int m_a;      
    BSTR m_b;
    } strcutBB; 
    typedef struct _structAA
    {
    int   count;
    [size_is(count)] strcutBB* m_list;
    } strcutAA;通过vs导入转换成了如下定义:
         public struct _structAA
        {
            [ComConversionLoss]
            public IntPtr m_list;
            public int count;
        }
        public struct _structBB
        {
            public string m_b;
            public int m_a;
        }
      

  15.   

    structAA就是“com组件中有个函数比如A(string para1,structCC** ppmyStruct)”提到的structCC
      

  16.   

    在VC++和Delphi这是一个很简单的事
      

  17.   

    在VC++和Delphi这是一个很简单的事
    --------------------
    请帮忙解决问题