读书人

!CopyMemory函数困扰好几天了

发布时间: 2012-04-17 15:06:33 作者: rapoo

救命啊!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)

读书人网 >.NET

热点推荐