经管没有高手露面,可我还是继续提问题,关于DLL的

xpzhou 2006-09-17 01:27:26
编写了一个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.
...全文
237 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
halfdream 2006-09-21
  • 打赏
  • 举报
回复
楼主就改用阻塞方式吧.

小呆之家 2006-09-21
  • 打赏
  • 举报
回复
library clientsocket;
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;

//----自己看吧,不想多说了。。。。。
fox1999 2006-09-21
  • 打赏
  • 举报
回复
aiirii
已经给你回答了.没有消息循环.不能触发事件

解决的方法.

1, 做成阻塞方式
2. 放一个 Form在 DLL 里.把 Form Hide 起来
xpzhou 2006-09-19
  • 打赏
  • 举报
回复
听了楼上的阐述,仍然迷惑不解,但深感楼主乃高手。帮人帮到底,这段代码到底怎样写,干脆给个完整例子吧。
lxpbuaa 2006-09-19
  • 打赏
  • 举报
回复
这个与消息循环无关,dll里的东西是在外面的程序里被调用。
搂住的程序问题太多……
挑一个说吧,ClientSocket1 被创建了,但OnRead事件未设定(即没有ClientSocket1.OnRead := ClientSocket1Read这样的语句;但是你加上这句,会发现不能编译通过的,见回复末尾),“clientsocket1read事件一直不触发”自然就正常了。

ClientSocket1.OnRead := ClientSocket1Read编译通不过,因为Delphi里对象的事件都是方法指针而不是过程指针,比如TEvent = procedure(……) of object; 注意最后的of object,就要求你写的函数应该是某个对象的方法,才能被作为事件处理方法来使用。像上面的clientsocket1read不属于任何方法,而只是一个普通过程,所以无法这样简单赋值。
zhfeng 2006-09-19
  • 打赏
  • 举报
回复
从主界面传CLIENTSOCKET进去
xpzhou 2006-09-19
  • 打赏
  • 举报
回复
请教一个在DELPHI中加消息循环的例子,多谢
xpzhou 2006-09-19
  • 打赏
  • 举报
回复
DM比FORM强在哪里?请解答
swimming8243 2006-09-18
  • 打赏
  • 举报
回复
我觉得可以建一个dm单元放CLIENTSOCKET控件
dabaicai 2006-09-18
  • 打赏
  • 举报
回复
看你还乱说话
xpzhou 2006-09-18
  • 打赏
  • 举报
回复
真是遇到高手啦
aiirii 2006-09-17
  • 打赏
  • 举报
回复
你这样的dll, 没有消息循环,自然不会触发了,
参考 spcomm.pas 看看如何自定义一个消息循环

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧