EAccessviolation 错误 ()
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,winsock2, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Memo1: TMemo;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const bufsize=1024;
var
Form1: TForm1;
wd:Twsadata;
server:Tsocket;
ca:TsockADDrIn;
ip:pchar;
port:integer;
buf:array[0..bufsize]of string;
flag:boolean;
implementation
{$R *.dfm}
uses unit2;
var T1:Trecv;
procedure TForm1.FormCreate(Sender: TObject);
begin
flag:=false;
if WSAStartup($0101,wd) <> 0 then exit;
server:=socket(pf_inet,sock_stream,ipproto_ip);
if server=invalid_socket then exit;
port:=1304;
ip:= '127.0.0.1 ';
ca.sin_family :=pf_inet;
ca.sin_port :=htons(port);
ca.sin_addr.S_addr:=inet_addr(ip);
if connect(server, @ca ,sizeof(ca)) <> 0 then
exit
else flag:=true;
end;
procedure TForm1.Button1Click(Sender: TObject);
var buf:array[0..1] of string;
begin
if flag then
begin
T1:=Trecv.create(true);
T1.memo2:=memo1;
T1.Resume;
//Trecv.create(false);
buf[0]:=edit1.text;
send(server,buf,sizeof(buf)+1,0);
// memo1.Lines.Add( 'wo: '+buf[0]);
end
else
showmessage( 'Please connect!!! ');
end;
end.
///////////////////////////////////////////////////////////
unit Unit2;
interface
uses
Classes,unit1,StdCtrls,winsock2;
type
Trecv = class(TThread)
private
{ Private declarations }
rebuf:array[0..1]of string;
protected
procedure Execute; override;
procedure Addmesg;
public
memo2:Tmemo;
constructor create(suspends:boolean);
end;
implementation
procedure Trecv.Addmesg;
begin
memo2.Lines.Add(rebuf[0])
end;
constructor Trecv.create(suspends:boolean);
begin
inherited create(suspends);
end;
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure Trecv.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread ';
end; }
{ Trecv }
procedure Trecv.Execute;
begin
{ Place thread code here }
while flag do
begin
recv(server,rebuf,sizeof(rebuf),0);
//form1.Memo1.Lines.Add(rebuf[0]);
synchronize(Addmesg);
end;
end;
end.
老提示EAccessviolation 错误 不知道是哪里的问题
[解决办法]
变量未初始化,访问越界,访问未成功创建的变量,就会出现这个错误。
[解决办法]
一般都用的indy组件,如果不用,你找点C++写的winsock,就知道怎么写了
delphi的winsock程序除了一点点语法不一样外,调用的函数名,参数这些都是一样的。