编写了一个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.

解决方案 »

  1.   

    你这样的dll, 没有消息循环,自然不会触发了,
    参考 spcomm.pas 看看如何自定义一个消息循环
      

  2.   

    我觉得可以建一个dm单元放CLIENTSOCKET控件
      

  3.   

    请教一个在DELPHI中加消息循环的例子,多谢
      

  4.   

    这个与消息循环无关,dll里的东西是在外面的程序里被调用。
    搂住的程序问题太多……
    挑一个说吧,ClientSocket1 被创建了,但OnRead事件未设定(即没有ClientSocket1.OnRead := ClientSocket1Read这样的语句;但是你加上这句,会发现不能编译通过的,见回复末尾),“clientsocket1read事件一直不触发”自然就正常了。ClientSocket1.OnRead := ClientSocket1Read编译通不过,因为Delphi里对象的事件都是方法指针而不是过程指针,比如TEvent = procedure(……) of object; 注意最后的of object,就要求你写的函数应该是某个对象的方法,才能被作为事件处理方法来使用。像上面的clientsocket1read不属于任何方法,而只是一个普通过程,所以无法这样简单赋值。
      

  5.   

    aiirii
      已经给你回答了.没有消息循环.不能触发事件解决的方法.1, 做成阻塞方式
    2. 放一个 Form在 DLL 里.把 Form Hide 起来
      

  6.   

    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;//----自己看吧,不想多说了。。