背景信息:
PC通过SOCKET收到一数据包(包头+数据长度+数据),其中数据由用户ID+用户心率组成,但数据个数不固定(N*(用户ID+用户心率)。
要求:
写一个DLL解包过滤出用户信息(用户ID+用户心率),无疑要用结构体数组来实现!
问题:
不知道如何编写通过DLL输出一个结构体数组供其它程序调用!或者提供其它方法,DLL是必须的!
PC通过SOCKET收到一数据包(包头+数据长度+数据),其中数据由用户ID+用户心率组成,但数据个数不固定(N*(用户ID+用户心率)。
要求:
写一个DLL解包过滤出用户信息(用户ID+用户心率),无疑要用结构体数组来实现!
问题:
不知道如何编写通过DLL输出一个结构体数组供其它程序调用!或者提供其它方法,DLL是必须的!
解决方案 »
- 设置TrayIcon的Visible时抛异常,求解
- webbrowser打开网页问题
- 关于获得汉字拼音首位字母的函数在delphi2010无效
- 我的网站 www.31qq.com 请大家看看去 顶者有分!!!!!!!!
- 100分紧急求助:IdTCPServer接收数据问题。
- combobox的改造问题。。
- 怎么打印屏幕显示不到的一个窗体上的内容。
- dbgrid显示问题
- 在不想显示Word的情况下打开文档进行处理后将其关闭,但总说:Open2000方法因 此文档在另一应用程序中 而无效。这是为什么?怎么解决?
- 如何判断当前操作系统是98还是2000或者NT?
- 能否把NMFTP控件下载下来的图片文件直接保存到内存?
- Delphi 怎样将数值型空值附给Edit
结构体数组最好也在主程序中创建,只是将指针传递给DLL的函数就可以了。
type TBuffer=array [0..255] of byte;function GetUserData(var buffer:Tbuffer):byte;stdcall;所有的用户数据都用BUFFER来处理并回调.
至于数据的解析,你可以在应用软件中来实现了.这个并不麻烦. .^_^.
1.先传递给函数1,函数1判断数据量,EXE根据返回的数据量生成缓冲区,然后调用函数2,由函数2进行数据拆分。2.直接将数据包传递给DLL,并传递窗口句柄,DLL使用消息方式返回数据,由窗口接收消息。3.直接将数据包传递给DLL,并提供回调函数,DLL使用回调函数返回数据。
function DllFunc(Data : Pointer;DataLength : Integer;DataCount : Integer) : Integer;
type
//假定数据内容
pData = ^TData; TData = record
id : Integer;
name : array [0..9] of char;
end;
var
P : pData;
i : Integer;
DadaItem : TData;
begin
P := Data;
for i:=0 to DataCount-1 do
begin
DadaItem := pData(p)^;
inc(p);
end;end;procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
type
//假定数据头占10Byte
TDataHeader = record
value : array [0..9] of char;
end; //假定数据内容
TData = record
id : Integer;
name : array [0..9] of char;
end; //假定用4Byte存放个数
TCount = array[0..3] of Byte;var
BufferCount : Integer;
Buffer : array of Byte;
a : array of TData;
aCount : TCount;
iCount : DWORD;begin
a := nil;
if not AThread.Terminated and AThread.Connection.Connected then
begin
//读取Buffer
BufferCount := AThread.Connection.ReadFromStack;
SetLength(Buffer,BufferCount);
AThread.Connection.ReadBuffer(Buffer[0],BufferCount); //从Buffer读取个数放入一个数组
Move(Buffer[SizeOf(TDataHeader)],aCount[0],Length(aCount));
//初始化整型变量
FillMemory(@iCount,SizeOf(DWORD),0);
//数组中的内容写入整型变量
Move(aCount[0],iCount,Length(aCount)); //给data数组分配内存空间
SetLength(a,iCount*SizeOf(TData));
//从Buffer中读取数据
Move(Buffer[SizeOf(TDataHeader)+Length(aCount)],
a[0],
Length(aCount)); //调用Dll中的函数
DllFunc(@a[0],Length(aCount),iCount); end;
end;
方法1. 先getlen
方法2. 传接口
方法3. sharemem
方法4. MapViewOfFile
.......
用内存映射有点小题大做了