如何封送结构体的二级指针
我的问题是在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();
}
看来只能用指针了? --------------------编程问答-------------------- 也可以不定义结构体
--------------------编程问答-------------------- Console.WriteLine(Marshal.PtrToStringAnsi(p[0],6));
[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],len));
--------------------编程问答--------------------
请问:
在结构体中的二级指针必须用intptr是吗? --------------------编程问答--------------------
未必,要看情况。这里用结构体又包装了一下,要传递结构体指针,实际上是三个指针。如果是单一的二级指针,ref或者out一个数组就行了。
补充:.NET技术 , C#