CSDN没有人回答的问题(关于创建DLL) ( 积分: 50 )

  • 主题发起人 主题发起人 南柯一梦
  • 开始时间 开始时间

南柯一梦

Unregistered / Unconfirmed
GUEST, unregistred user!
背景信息:
PC通过SOCKET收到一数据包(包头+数据长度+数据),其中数据由用户ID+用户心率组成,但数据个数不固定(N*(用户ID+用户心率)。
要求:
写一个DLL解包过滤出用户信息(用户ID+用户心率),无疑要用结构体数组来实现!
问题:
不知道如何编写通过DLL输出一个结构体数组供其它程序调用!或者提供其它方法,DLL是必须的!
 
不用传结构体,只要定义好结构体的标准就行了
比如用户ID是几位,用户心率是几位(我假设都是integer类型)
ttest
id,x:integer;
end;
然后在你的程序和dll都用这个同样的结构体定义
就算不用delphi写,按照integer为4字节长度,按字节读出来就行了,就当传递的是一堆有固定字节长度的2进制数据读
 
主要问题,现在是用户个数不固定,有可能收到十个用户的数据,也有可能收到一个用户的数据,这个如何处理,感谢回复!
 
如果结构体是像我上面说的,可以确定固定位数(还是按我那个ttest结构举例子)
当成2进制数据,循环每次读8个字节,直到读不到数据为止,不就都取出来了?
 
数据处理我根据协议都可以分离出来,举个例子吧
TUserInfo
UserID:Integer;
HeartBaud:Integer;
end;
UserInfo:array of TUserInfo;
我收到一串(十六进制) 08 00 01 00 02 00 02 00 02(,第一个字节是数据长度,用户ID两字节,用户心率2字节)
setlength(UserInfo,2);
现通过分离后得到
UserInfo[0].UserID=1
UserInfo[0].HeartBaud=1
UserInfo[1].UserID=2
UserInfo[2].HeartBaud=2
如何把得到的这些内容传出来啊!
DLL中的参数该如何定义,或者返回结果应如何定义!
 
?你干吗要分离?直接把那一堆2进制数据传出来在程序里去分离他不就好了

如果你一定要分离以后再传出来,可以考虑用OleVariant类型传递
 
不是我要分离,我也不想分离啊!
呵呵。我提供给用户的二次开发接口,用户要求这样子,我也没办法,OLEVariant类型传?能不能再深入一点儿,我没写过DLL,诚心请教!
 
这样啊,呵呵 dll传递复杂数据我也没写过,一般都是传简单类型的数据

OLEVariant我不是很熟,只是知道他可以采用数组方式访问,感觉上你的要求他应该能满足
具体的,建议你找个大富翁的离线数据包查一下以前的帖子
 
我搜搜看,感谢你的关注,其它人也不知道干嘛儿呢! 呵呵!孤独啊!
 
delphi世界qq群:23981160,喜欢Delphi的都进来
 
OLEVariant存储的是记录类型的数据
clientdataset就是通过这个传输到服务端的
 
改个提问方式吧,就是通过DLL输出一个动态数组,如何实现
 
用指针实现啊,输出数组的时候同时输出数组的大小。
比如:
function func(buff: Pointer, var length: Integer): Boolean;

用户在调用的时候自己分配足够的空间就行了
 
同意 汾阳仲王 的说法,在主程序内分配好空间,然后传入空间指针和空间大小给dll的输出函数。不过,对于这个空间大小如何确定?

或者,用回调函数,你的dll提供一个初始化过程,使用此dll需要先初始化。
然后在初始化过程内传入回掉函数地址。你收到数据时就调用此回调函数,函数提供一个数据指针和数据大小。
然后你只需在回调函数内写收到数据后的处理过程。
 
汾阳仲王,感谢你的关注,现在就是UFO说的问题,用户事先不能确定要分配的内存大小
UFO,同样也感谢你,弱弱的问一句,初使化的过程用户都做些什么工作?
 
你可以将数组长度做为一个参数传进传出啊,所谓动态在程序运行的时候也是动态的?
 
所谓的初始化,只是主程序在这里给dll一个回调函数地址,同时让dll开始侦听指定端口。
然后你可以在dll内实现接收数据和解压缩数据。数据解包以后调用回调函数,把数据首地址和数据长度作为参数传入回调函数内。
主程序只需在这个回调函数的实现过程内处理解包后数据就可以了。
 
ufo!:传入空间指针和空间大小给dll的输出函数
同意!
南柯一梦:用户事先不能确定要分配的内存大小..
可以用New来分配,或者用Getmem申请一大块内存(最好是64的倍数)
 
恕我愚昧,假设DLL写成了,函数名为(getuserinfo),第一个参数是原始数据,第二个是用户数据指针,现在开始调用,就以delphi下为例吧:
GetData:获取的SOCKET数据原型
UserInfo:用户数据指针
调用:
Result:=getuserinfo(GetData,UserInfo)
试问一下啊。呵呵
UserInfo事先不要分配内存吗?如果要怎么确定大小,如果不要怎么声明和调用?
 
不知道你的用户数据是什么样的,但为什么不试试用XML呢?
定义成:
<itemcount></itemcount>
<item><uid></uid><data></data></item>
不是很好取吗?
 
后退
顶部