DLL如何把结构体数组输出到char*

dingshanwei123 2014-08-01 01:59:22
编了一个动态库需要把从设备读到的数据输出到上层
现有结构体保存读到的数据
typedef struct
{
int iDataLen;//数据长度
unsigned char ucData[256];//数据

}T_EW_IPC_MAGCARD_TRACK_INFO;

读数据接口:WORD MAG_Read(char *pIn, char *pOut);
输出参数:pOut,输出读取到的数据(读数据结构体,T_EW_IPC_MAGCARD_TRACK_INFO)。

数据有三段,定义一个数组,T_EW_IPC_MAGCARD_TRACK_INFO track [3],比如:track[0].ucData[i]...,怎么把三个结构体数组的数据输出到pOut呢?上层调该接口时就能看的pOut里保存的三段数据和长度(iDataLen)
...全文
154 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2014-08-01
  • 打赏
  • 举报
回复
		[StructLayout(LayoutKind.Sequential)]
	public struct _READ_DATA
	{
		public int Length;
		[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
		public byte[] Data;
	}
			int Size = Marshal.SizeOf(typeof(_READ_DATA));
				IntPtr ptrData = Marshal.AllocHGlobal(3 * Size);
				if (_ReadData(_basecpp, ptrData))
				{
					byte[][] d = new byte[3][];
					for (int i = 0; i < d.Length;++i)
					{
						var data = (_READ_DATA)Marshal.PtrToStructure(ptrData + i * Size, typeof(_READ_DATA));
						d[i] = new byte[data.Length];
						Array.Copy(data.Data, d[i], d[i].Length);
					}
					return d;
				}
Eleven 2014-08-01
  • 打赏
  • 举报
回复
同意ls的,memcpy直接copy到目的缓冲区中
Saleayas 2014-08-01
  • 打赏
  • 举报
回复
你的 Read 函数契约不足, Read 函数如何知道pOut 参数是否有3个? Read 函数如何确定缓冲区大小? 解决好了这些问题,就简单了。
dingshanwei123 2014-08-01
  • 打赏
  • 举报
回复
引用 1 楼 wu330 的回复:
把结构体地址导出输出


WORD_MAG_READ(pIn,pOut);
定义的接口就是这样的,不能修改,刚用你的方法试了,模拟一些数据传过去也就一串不规则的数,很乱,感觉不能传三个数组进去啊?
WORD WINAPI MAG_Read(char *pIn, char *pOut)
{
T_EW_IPC_MAGCARD_TRACK_INFO tMagCardTrackInfo[3];
int ret,i;
ret=GetMagnet(tMagCardTrackInfo);
for(int j=0;j<3;j++)
{
for ( i = 0; i < 10; i++ ) {
tMagCardTrackInfo[j].ucData[i]= 0x12;
}
}
memcpy(pOut,tMagCardTrackInfo,sizeof(T_EW_IPC_MAGCARD_TRACK_INFO)*3);
}
SiGoYi 2014-08-01
  • 打赏
  • 举报
回复
输入端直接使用结构体地址;输出端再使用结构指针先创建对象,再使用这个对象的指针接收就可以了。
快乐鹦鹉 2014-08-01
  • 打赏
  • 举报
回复
T_EW_IPC_MAGCARD_TRACK_INFO track [3]; WORD_MAG_READ(pIn,track);
快乐鹦鹉 2014-08-01
  • 打赏
  • 举报
回复
char *pOut = new char[1024];
memset(pOut,0,1024);
WORD_MAG_READ(pIn,pOut);

WORD WORD_MAG_READ(char *pIn,char *pOut)
{
...
memcpy(pOut,track,sizeof(T_EW_IPC_MAGCARD_TRACK_INFO)*3);
}
江明大吴 2014-08-01
  • 打赏
  • 举报
回复
把结构体地址导出输出

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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