C#调用C++的dll时候用到的类
public struct DBCSignal
{
...
public Byte multiplexer_value;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]
public Byte[] unit;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public Byte[] strName;
//[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 201)]
public Byte[] strComment;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public Byte[] strValDesc;
}
public struct DBCMessage
{
public UInt32 nSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public DBCSignal[] vSignals;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] strName;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 201)]
public byte[] strComment;
}
结构体传递的时候用到intptr指针
IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(DBCMessage)));
if (DBC_GetFirstMessage(m_hDBC,pt))
{
DBCMessage msg = (DBCMessage)Marshal.PtrToStructure(pt, typeof(DBCMessage));
m_vMsg.Add(msg);
Marshal.FreeHGlobal(pt);//释放内存
while (DBC_GetNextMessage(m_hDBC,pt))
{
msg = (DBCMessage)Marshal.PtrToStructure(pt, typeof(DBCMessage));
this.dataGridView1.Rows[index1].Cells[9].Value = Regex.Replace(System.Text.Encoding.Default.GetString(msg.strComment), @"\0", string.Empty);
//怀疑再次用Marshal.PtrToStructure会把上一次的数据传给msg
}
在循环的时候Marshal.PtrToStructure为什么会把上一次循环的数据又传给msg呢?能不能把pt所指内存清零呢?