救命啊!CopyMemory函数困扰好几天了
type CRLogin=record Name:string[20]; ID:string[20]; IP:string[20]; Port:Word; end;
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;
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;
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)