C#调用c++中的dll出现的奇怪问题,请大家来帮帮忙!

yjj200000 2013-02-26 09:30:50
有这样一个C++的Dll方法
typedef struct//结构体定义
{
unsigned int checkvalue;
unsigned int total_num
unsigned char bar_code[21];
unsigned char spec[6][22];
unsigned char name[31];
unsigned char last_in_datetime[7];
unsigned char last_out_datetime[7];
}TGOODS_INFO_RECORD;

//调用方法
RETVALUE ExportGoodsRecord(unsigned char TransType, int *recordNum, unsigned int recordoffset, unsigned char *recordsBytes, unsigned int *recordslen, unsigned int *recordCount);



在C#中我是这样调用的
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi,Pack=1)]//定义结构体对应
public struct TGOODS_INFO_RECORD
{
public uint checkvalue; // 4字节
public uint total_num; // 4字节
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 21)]
public char[] bar_code; // 21字节
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 31)]
public char[] name; // 32字节
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 6 * 22)]
public char[] spec; //132
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public char[] last_in_datetime; // 7字节
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 7)]
public char[] last_out_datetime; // 7字节
//共206字节
};
[DllImport("ImExAPI.dll", EntryPoint = "ExportGoodsRecord")]
private static extern RETVALUE ExportGoodsRecord(byte TransType, ref int recordNum, uint recordoffset, IntPtr recordsBytes, ref int recordslen, ref uint recordCount);
private void button3_Click(object sender, EventArgs e)
{
int recordNum=4;//一次读取4条记录、
uint recordoffset;//存储读取记录的偏移
int recordslen;//数据记录长度
uint recordCount;//存储记录总数
int j;
bool bSuccess=true;
TGOODS_INFO_RECORD[] goods_info_record = new TGOODS_INFO_RECORD[4];//定义结构体数据,允许一次导出4条商品信息记录
for (int a = 0; a < goods_info_record.Length; a++)
{
goods_info_record[a] = new TGOODS_INFO_RECORD();
}
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TGOODS_INFO_RECORD)));
recordoffset=0;
recordCount=4;//假定总记录数为一次能读到的记录数据数
while(recordoffset<recordCount)
{
for (int a = 0; a < goods_info_record.Length; a++)
{
goods_info_record[a] = new TGOODS_INFO_RECORD();
}
recordslen = Marshal.SizeOf(typeof(TGOODS_INFO_RECORD)) * recordNum;
if (ExportGoodsRecord(0x01, ref recordNum, recordoffset, ptr, ref recordslen, ref recordCount) != RETVALUE.TRANS_SUCCESS)
{
bSuccess = false;
break;
}
for (j = 0; j < recordNum; j++)
{
goods_info_record[j] = (TGOODS_INFO_RECORD)Marshal.PtrToStructure((IntPtr)((UInt32)ptr + j * Marshal.SizeOf(typeof(TGOODS_INFO_RECORD))), typeof(TGOODS_INFO_RECORD));
string sa = new string(goods_info_record[j].bar_code);
textBox1.Text += "\r\n数据为" + sa;
}
recordoffset += (uint)recordNum;//此处需要判断返回数据的长度与需要读取的数据长度是否匹配,如果不匹配,则判断实际读到的记录数为多少,然后改变其偏移位置
}
}
数据已经可以读出了,但是在程序关闭时报出了程序内存无法"read"的问题,各位大大有遇见的么,是我的调用函数有问题么??
...全文
147 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjj200000 2013-02-27
  • 打赏
  • 举报
回复
引用 5 楼 hdt 的回复:
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TGOODS_INFO_RECORD))) 读四个记录怎么分配一个记录长度的内存?
谢谢版主~就是这个问题,我用了指针数组后内存不溢出了~
真相重于对错 2013-02-27
  • 打赏
  • 举报
回复
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(TGOODS_INFO_RECORD))) 读四个记录怎么分配一个记录长度的内存?
yjj200000 2013-02-27
  • 打赏
  • 举报
回复
在哪释放?c++的函数中还是C#中,如何释放,麻烦给点代码提示
不慕繁华 2013-02-26
  • 打赏
  • 举报
回复
结构体中的非托管资源没有释放吧
yjj200000 2013-02-26
  • 打赏
  • 举报
回复
怎么释放,在哪里写?我知道有一个 Marshal.FreeHGlobal(ptr);方法,不过不知道应该放在什么位置,我试着放在 recordoffset += (uint)recordNum;这句话前,可还是没有用。
  • 打赏
  • 举报
回复
你用到指针的地方释放了吗?

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧