unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp;type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure ClientRead (Sender: TObject; Socket: TCustomWinSocket);
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}var
  ServerSocket1: TServerSocket;procedure TForm1.Button1Click(Sender: TObject);
begin
  ServerSocket1.OnClientRead := ClientRead;
end;procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
beginend;end.
上面的代码是可行的,而且没有错误的
\\-------------------------------------------------------------------------
下面的代码是不可行的,而且有错误,但我不清楚为什么会出错library ClientDll;uses
  SysUtils,
  Classes,
  ScktComp,
  Command in 'Command.pas';{$R *.res}var
  ServerSocket1: TServerSocket;procedure ClientRead (Sender: TObject; Socket: TCustomWinSocket);
var
  S: string;
begin
  S := Socket.ReceiveText;
end;procedure StartTcpServer;
begin
  ServerSocket1 := TServerSocket.Create(nil);
  with ServerSocket1 do
  begin
    Port := 503;
    ServerType := stThreadBlocking;
    OnClientRead := ClientRead;
    Active := True;
  end;
end;procedure CloseTcpServer;
begin
  with ServerSocket1 do
  begin
    Active := False;
    Free;
  end;
end;beginend.
\\--------------------------------------------------------------上面的二段代码同样是OnClientRead := ClientRead;但下面的一个就有问题,是错误的。我不知道是那里出了问题,是不是DLL里面不能这样写。

解决方案 »

  1.   

    非成员函数也用过,这样转一下吧,新建一个Unitunit Unit1;interfaceuses
       ScktComp;type
     TProcess=class
     public
       class procedure ClientRead (Sender: TObject; Socket: TCustomWinSocket);
     end;implementation{ TProcess }class procedure TProcess.ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
      S: string;
    begin
      S := Socket.ReceiveText;
    end;end.然后到Dll library中改OnClientRead := TProcess.ClientRead;  //TProcess不用创建,ClientRead只是一个类方法
      

  2.   

    唉..都难我不小心,编译是没有问题.  但都收不到数据...Server----------------------------------------------------------------------------------program Server;{$APPTYPE CONSOLE}uses
      SysUtils, ScktComp;type
      TProcess = class
        class procedure ClientRead(Sender: TObject; Socket: TCustomWinSocket);
      end;var
      ServerSocket1: TServerSocket;{ TProcess }class procedure TProcess.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
    var
      S: string;
    begin
      S := Socket.ReceiveText;
      WriteLn(S);
    end;begin
      ServerSocket1 := TServerSocket.Create(nil);
      with ServerSocket1 do
      begin
        Port := 11111;
        Active := True;
        OnClientRead := TProcess.ClientRead;
      end;
      WriteLn('ServerSocket...Open OK');
      ReadLn;
    end.Client----------------------------------------------------------------------------unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ScktComp;type
      TForm1 = class(TForm)
        ClientSocket1: TClientSocket;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      with ClientSocket1 do
      begin
        Address := '127.0.0.1';
        Port := 11111;
        Active := True;
        Socket.SendText('Hello,World');
      end;
    end;end.