Delphi 7项目迁移至XE7编译时Indy UDP Server相关报错如何解决
问题原因与解决步骤
你的问题完全是Indy 9到Indy 10的接口不兼容导致的,两个报错点分别对应两处API变更,按下面修改即可:
1. 修正OnUDPRead事件的方法签名
Indy 9的OnUDPRead事件回调参数为(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle),而Indy 10已经把第二个参数从TStream改为TIdBytes类型的字节数组,第一个参数也从TObject替换为TIdUDPListenerThread类型,你需要先修改事件方法的定义:
// 替换原有UDPServerUDPRead方法的签名 procedure TRealTimeForm.UDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle);
原有流读取逻辑也要对应修改,不需要再调用ReadBuffer,直接做内存拷贝即可:
// 替换原有的AData.Size判断和ReadBuffer相关代码 if Length(AData) < GLogLen then begin SetLength(lReceiveData, Length(AData)); Move(AData[0], lReceiveData[0], Length(AData)); ShowDataLog(lReceiveData); Exit; end; SetLength(lReceiveData, GLogLen); Move(AData[0], lReceiveData[0], GLogLen); ShowDataLog(lReceiveData);
2. 修正SendBuffer方法调用
Indy 10的SendBuffer方法不再支持直接传字节变量首地址+长度的参数形式,需要先把你的动态字节数组转成TIdBytes再调用:
// 替换原有FUDPServer.SendBuffer那行代码 var SendData: TIdBytes; begin SetLength(SendData, GLogLen); Move(lReceiveData[0], SendData[0], GLogLen); FUDPServer.SendBuffer(ABinding.PeerIP, ABinding.PeerPort, SendData); end;
如果后续还要大量操作字节数组,建议直接把项目里的自定义动态字节数组全换成TIdBytes类型,不用反复转换效率更高。
可选兼容方案
如果你不想大面积修改原有代码,可以把XE7自带的Indy 10卸载,手动安装Indy 9到XE7环境,也可以直接编译通过。不过长期来看还是建议适配Indy 10的接口,后续维护和功能扩展更方便。
内容的提问来源于stack exchange,提问作者Cihad Şükrü Yaşar
相关产品推荐
相关产品推荐

