救命啊!CopyMemory函数困扰好几天了
- Delphi(Pascal) code
type CRLogin=record Name:string[20]; ID:string[20]; IP:string[20]; Port:Word; end;
- Delphi(Pascal) code
procedure CLogin;var Login:CRLogin; buffer:array[1..2048]of char;begin Login.Name :=MainForm.Edit3.Text; CopyMemory(@buffer,@login,SizeOf(Login)); MainForm.IdUDPClient1.SendBuffer(RawToBytes(buffer,SizeOf(buffer)));end;
- Delphi(Pascal) code
procedure TMainForm.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; AData: TBytes; ABinding: TIdSocketHandle);var login:CRLogin; buffer:array[1..2048]of Char;begin BytesToRaw(AData,buffer,SizeOf(AData)); CopyMemory(@login,@buffer,SizeOf(login)); memo1.Lines.Add(login.Name);end;
memo1.Lines.Add(login.Name);只可以接受3个字节
稍作修改后,放delphi7里用indy9测试,没有问题
[解决办法]
楼主是delphi7吗?
我直接转换的,delphi7 + 默认 id控件
我这delphi7 根本就没有RawToBytes和BytesToRaw
但是我发送和接收都正常
接收的时候用的流读出的
- Delphi(Pascal) code
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, IdUDPServer, IdException, IdGlobal, IdSocketHandle, IdStackConsts, IdThread;type TForm1 = class(TForm) Button1: TButton; Edit3: TEdit; IdUDPClient1: TIdUDPClient; IdUDPServer1: TIdUDPServer; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); private { Private declarations } public { Public declarations } procedure CLogin; end; type CRLogin=record // Name:array[0..20] of char; Name:string[20]; // ID:string[20]; // IP:string[20]; Port:Word; end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.CLogin;var Login:CRLogin; buffer:array[1..2048]of char;begin FillChar(login,SizeOf(Login),#0); FillChar(buffer,SizeOf(buffer),#0); Login.Name :=Edit3.Text; CopyMemory(@buffer,@login ,SizeOf(Login)); Form1.IdUDPClient1.SendBuffer(buffer,SizeOf(Login));end;procedure TForm1.Button1Click(Sender: TObject);begin IdUDPClient1.Active:=True; IdUDPServer1.Active:=True;CLogin;end;procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);var login:CRLogin; buffer:array[1..2048]of Char;begin FillChar(buffer,SizeOf(buffer),#0); AData.Position:=0; AData.Read(buffer,AData.Size); CopyMemory(@login,@buffer ,SizeOf(login)); memo1.Lines.Add(login.Name); memo1.Lines.Add('read');end;end.
[解决办法]
不论是把// Name:array[0..20] of char;
Name:string[20];
用char和string都正常
[解决办法]
你这 SizeOf(login) 用的不对
应该写成 SizeOf(CRLogin)