当前位置:编程学习 > C#/ASP.NET >>

如何封送结构体的二级指针


我的问题是在C#里面调用VC写的DLL,但是在封装一个结构体和一个方法时遇到了点麻烦,搞了好久,希望高手指教
结构体:
原c定义
typedef struct  TSXDATA  
{
    char **msg   ;   
}TSXDATA
转C#定义
[StructLayout(LayoutKind.Sequential)]
public struct TSXDATA  
{
     public string[] msg;  
}

或者用
[StructLayout(LayoutKind.Sequential)]
public struct TSXDATA  
{
     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 1)]
     public stringBuilder[] msg;
}

方法:
int32   TsxInit(   ref TSXDATA Construct   );

那么我怎样封装TSXDATA   ,然后初始化后,再来调用TsxInit  
但我的程序始终报错“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”

真的快崩溃了,就是指向指针的指针没搞过,烦死了……


--------------------编程问答--------------------

[StructLayout(LayoutKind.Sequential)]
public struct TSXDATA
{
      public IntPtr p;
}
[DllImport("StringBuilderptr.dll")]
static extern int TsxInit(ref TSXDATA data);


        unsafe static void Main(string[] args)
        {
            IntPtr p = IntPtr.Zero;
            TSXDATA data = new TSXDATA();
            data.p = (IntPtr)(&p);
            int len = TsxInit(ref data);
            IntPtr q = Marshal.ReadIntPtr(data.p);
            Console.WriteLine(Marshal.PtrToStringAnsi(q,len));
            Console.ReadLine();
        }
--------------------编程问答--------------------
引用 1 楼  的回复:
C# code

[StructLayout(LayoutKind.Sequential)]
public struct TSXDATA
{
      public IntPtr p;
}
[DllImport("StringBuilderptr.dll")]
static extern int TsxInit(ref TSXDATA data);


C# code

        ……



看来只能用指针了? --------------------编程问答-------------------- 也可以不定义结构体

        [DllImport("StringBuilderptr.dll")]
        static extern int TsxInit(ref IntPtr[] b);
        static void Main(string[] args)
        {
            IntPtr[] p = new IntPtr[1];
            int len = TsxInit(ref p);
            Console.WriteLine(Marshal.PtrToStringAnsi(p[0],6));
            Console.ReadLine();
        }
--------------------编程问答-------------------- Console.WriteLine(Marshal.PtrToStringAnsi(p[0],6));
改为Console.WriteLine(Marshal.PtrToStringAnsi(p[0],len));
--------------------编程问答--------------------
引用 4 楼  的回复:
Console.WriteLine(Marshal.PtrToStringAnsi(p[0],6));
改为Console.WriteLine(Marshal.PtrToStringAnsi(p[0],len));


请问:
在结构体中的二级指针必须用intptr是吗? --------------------编程问答--------------------
引用 5 楼  的回复:
引用 4 楼 的回复:
Console.WriteLine(Marshal.PtrToStringAnsi(p[0],6));
改为Console.WriteLine(Marshal.PtrToStringAnsi(p[0],len));


请问:
在结构体中的二级指针必须用intptr是吗?

未必,要看情况。这里用结构体又包装了一下,要传递结构体指针,实际上是三个指针。如果是单一的二级指针,ref或者out一个数组就行了。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,