编写了一个DLL,用CLIENTSOCKET控件,但是clientsocket1read事件一直不触发,请问为什么?
library clientsocket;
uses
SysUtils,
ScktComp,
Dialogs,
Classes;var
ClientSocket1 : TClientSocket;
{$R *.res}procedure init_socket(svr_ip : pchar) stdcall;
begin
ClientSocket1 := TClientSocket.create(nil);
ClientSocket1.ClientType := ctNonBlocking;
ClientSocket1.Address:=svr_ip;
ClientSocket1.port:=2058;
ClientSocket1.Active:= false;
ClientSocket1.Active:= true;
// if ClientSocket1.Active then
// else
// begin
// showmessage('无法连接服务器!');
// ClientSocket1.close();
// ClientSocket1.free;
// end;end;
procedure sendmsg( send_text : pchar) stdcall;
begin
ClientSocket1.Socket.SendText(send_text);
if not ClientSocket1.Active then
begin
showmessage('无法连接服务器!');
ClientSocket1.close();
ClientSocket1.free;
end;
end;procedure close_socket( ) stdcall;
begin
ClientSocket1.Active:= false;
ClientSocket1.close();
ClientSocket1.free;
end;
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
s:string;
begin
s:=ClientSocket1.Socket.ReceiveText;//接收信息
showmessage(s);
//Memo1.Lines.Add('服务器端返回的信息为:'+s);
end;exports
init_socket,
close_socket,
sendmsg;
begin
end.
library clientsocket;
uses
SysUtils,
ScktComp,
Dialogs,
Classes;var
ClientSocket1 : TClientSocket;
{$R *.res}procedure init_socket(svr_ip : pchar) stdcall;
begin
ClientSocket1 := TClientSocket.create(nil);
ClientSocket1.ClientType := ctNonBlocking;
ClientSocket1.Address:=svr_ip;
ClientSocket1.port:=2058;
ClientSocket1.Active:= false;
ClientSocket1.Active:= true;
// if ClientSocket1.Active then
// else
// begin
// showmessage('无法连接服务器!');
// ClientSocket1.close();
// ClientSocket1.free;
// end;end;
procedure sendmsg( send_text : pchar) stdcall;
begin
ClientSocket1.Socket.SendText(send_text);
if not ClientSocket1.Active then
begin
showmessage('无法连接服务器!');
ClientSocket1.close();
ClientSocket1.free;
end;
end;procedure close_socket( ) stdcall;
begin
ClientSocket1.Active:= false;
ClientSocket1.close();
ClientSocket1.free;
end;
procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
s:string;
begin
s:=ClientSocket1.Socket.ReceiveText;//接收信息
showmessage(s);
//Memo1.Lines.Add('服务器端返回的信息为:'+s);
end;exports
init_socket,
close_socket,
sendmsg;
begin
end.
参考 spcomm.pas 看看如何自定义一个消息循环
搂住的程序问题太多……
挑一个说吧,ClientSocket1 被创建了,但OnRead事件未设定(即没有ClientSocket1.OnRead := ClientSocket1Read这样的语句;但是你加上这句,会发现不能编译通过的,见回复末尾),“clientsocket1read事件一直不触发”自然就正常了。ClientSocket1.OnRead := ClientSocket1Read编译通不过,因为Delphi里对象的事件都是方法指针而不是过程指针,比如TEvent = procedure(……) of object; 注意最后的of object,就要求你写的函数应该是某个对象的方法,才能被作为事件处理方法来使用。像上面的clientsocket1read不属于任何方法,而只是一个普通过程,所以无法这样简单赋值。
已经给你回答了.没有消息循环.不能触发事件解决的方法.1, 做成阻塞方式
2. 放一个 Form在 DLL 里.把 Form Hide 起来
uses
SysUtils,
ScktComp,
Dialogs,
Classes; ttcpclient=class(tclientsocket)
procedure readdata(Sender: TObject; Socket: TCustomWinSocket);
procedure tcpconnected(Sender: TObject; Socket: TCustomWinSocket);
procedure tcpdisconnected(Sender: TObject; Socket: TCustomWinSocket);
procedure tcperror(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
end;var
ClientSocket1 : ttcpclient;
{$R *.res}
begin
ClientSocket1 := ttcpclient.create(nil);
ClientSocket1.ClientType := ctNonBlocking;
ClientSocket1.Address:=svr_ip;
ClientSocket1.port:=2058;
ClientSocket1.onread:=tcpclient.readdata;
ClientSocket1.OnConnect:=tcpclient.tcpconnected;
ClientSocket1.ondisconnect:=tcpclient.tcpdisconnected;
ClientSocket1.onerror:=tcpclient.tcperror; //ClientSocket1.Active:= false;
ClientSocket1.Active:= true;
// if ClientSocket1.Active then
// else
// begin
// showmessage('无法连接服务器!');
// ClientSocket1.close();
// ClientSocket1.free;
// end;end;//----自己看吧,不想多说了。。