unit ClientFrmMainUnit;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls,
  GlobalUnit;type
  TClientFrmMain = class(TForm)
                     CBClientActive: TCheckBox;
                     IncomingMessages: TMemo;
                     Label1: TLabel;
                     Client: TIdTCPClient;
                     Label2: TLabel;
                     EditCommand: TComboBox;
                     Label3: TLabel;
                     EditMessage: TEdit;
                     Label4: TLabel;
                     EditRecipient: TEdit;
                     ButtonSend: TButton;                     procedure ButtonSendClick(Sender: TObject);                    private                    public                   end;  TClientHandleThread = class(TThread)
                         private
                          CB: TCommBlock;                          procedure HandleInput;                         protected
                          procedure Execute; override;                        end;var
  ClientFrmMain: TClientFrmMain;
  ClientHandleThread: TClientHandleThread;   // variable (type see above)implementation{$R *.DFM}procedure TClientHandleThread.HandleInput;
begin
  if CB.Command = 'MESSAGE' then
    ClientFrmMain.IncomingMessages.Lines.Add (CB.MyUserName + ': ' + CB.Msg)
  else
  if CB.Command = 'DIALOG' then
    MessageDlg ('"'+CB.MyUserName+'" sends you this message:'+#13+CB.Msg, mtInformation, [mbOk], 0)
  else  // unknown command
    MessageDlg('Unknown command "'+CB.Command+'" containing this message:'+#13+CB.Msg, mtError, [mbOk], 0);
end;procedure TClientHandleThread.Execute;
begin
  while not Terminated do
  begin
    if not ClientFrmMain.Client.Connected then
      Terminate
    else
    try
      ClientFrmMain.Client.ReadBuffer(CB, SizeOf (CB));
      Synchronize(HandleInput);
    except
    end;
  end;
end;procedure TClientFrmMain.ButtonSendClick(Sender: TObject);
var
  CommBlock : TCommBlock;begin
  if CBClientActive.Checked then
  begin
    try
      Client.Connect(10000);  // in Indy < 8.1 leave the parameter away      ClientHandleThread := TClientHandleThread.Create(True);
      ClientHandleThread.FreeOnTerminate:=True;
      ClientHandleThread.Resume;
    except
      on E: Exception do MessageDlg ('Error while connecting:'+#13+E.Message, mtError, [mbOk], 0);
    end;
  end
  else
  begin
    ClientHandleThread.Terminate;
    Client.Disconnect;
  end;  ButtonSend.Enabled := Client.Connected;
  CBClientActive.Checked := Client.Connected;  CommBlock.Command      := EditCommand.Text;         // assign the data
  CommBlock.MyUserName   := Client.LocalName;
  CommBlock.Msg          := EditMessage.Text;
  CommBlock.ReceiverName := EditRecipient.Text;  Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
end;end.上面这段程序怎样封装成一个DLL呢?
这段程序是DLPHI中indy的一个例子,中间用到了一个线程,我的目的是导出一个函数,传递一个值给通过client发送给server,
然后通过线程接受server的值,这个怎样封装呢,给个思路,我自己试以一下

解决方案 »

  1.   

    你说得不清楚呀你要把窗体也放到DLL中吗?
      

  2.   

    我以前只会把一个事件里的功能封装成一个DLL
    现在这个接收文件需要一个线程来实现,
    上面主要的意思就是在程序开头定义了一个线程,同时线程有个接收的功能一、在按钮事件中  客户连接服务,发送信心,同时建立线程(线程的功能不能放在按钮一起执行)二、然后服务返回信息由线程的接收功能处理三、最后断开我不需要封装窗体,只要传个参数(消息)给DLL,DLL就接收服务的信息分当时我没注意就给了20,可以另外加吗???谢谢各位拉