delphi之shell远程管理类模块

来源:互联网 发布:php是面向对象的吗 编辑:程序博客网 时间:2024/06/10 07:10
unit UnitRemoteShell;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, ExtCtrls, ScktComp, StdCtrls, Spin, umSFPack,zlib,ImageHLP,  ComCtrls, ImgList, ToolWin, Menus, ClipBrd, UnitSharedData;type  TRemoteShell = class(TForm)    Memo1: TMemo;    StatusBar1: TStatusBar;    Timer1: TTimer;    procedure Memo1KeyPress(Sender: TObject; var Key: Char);    procedure Timer1Timer(Sender: TObject);    procedure FormClose(Sender: TObject; var Action: TCloseAction);  private    { Private declarations }    lastcommand: string;    LastLength: dword;  public    { Public declarations }    MainSocket: TCustomWinSocket;    NewSocket: TCustomWinSocket;    SocketData: TSocketData;    Group,Computer,User: string;    procedure ParseData(Socket: TCustomWinSocket; Data: string);    procedure SetUpConnection(Socket: TCustomWinSocket);  end;var  RemoteShell: TRemoteShell;implementation{$R *.dfm}procedure SendData(Socket: TCustomWinSocket; Data: string);begin  UnitSharedData.SendData(Socket,'RemoteShell|' + Data);end;procedure DisconnectProc(Socket: TCustomWinSocket);var  SocketData: TSocketData;begin  SocketData := TSocketData(Socket.Data);  if TRemoteShell(SocketData.Form).NewSocket = nil then exit;  TRemoteShell(SocketData.Form).Timer1.Enabled := True;  TRemoteShell(SocketData.Form).NewSocket := nil;  TRemoteShell(SocketData.Form).Caption := TRemoteShell(SocketData.Form).Caption + ' - [Offline]';end;procedure TRemoteShell.SetUpConnection(Socket: TCustomWinSocket);var  SocketData: TSocketData;begin  SocketData := TSocketData(Socket.Data);  SocketData.DisconnectProc := @DisconnectProc;  Timer1.Enabled := False;  Caption := Copy(Caption,1,Length(Caption) -12);  Memo1.Text := '';  LastLength := 0;  SendData(Socket,'Activate');end;procedure TRemoteShell.ParseData(Socket: TCustomWinSocket; Data: string);var  Command: string;begin  Command := Split(Data,'|',1);  Delete(Data,1,Length(Command)+1);  if Command = 'Command' then begin    Delete(Data,1,length(LastCommand));    LastCommand := '';    Memo1.Text := Memo1.Text + Data;    Memo1.SetFocus;    Memo1.SelStart := Length(Memo1.Text);    SendMessage(Memo1.handle, EM_SCROLLCARET, 0, 0);    LastLength := Length(Memo1.Text);  end;end;procedure TRemoteShell.Memo1KeyPress(Sender: TObject; var Key: Char);var  c: string;begin  Memo1.SelStart := Length(Memo1.Text);  SendMessage(Memo1.handle, EM_SCROLLCARET, 0, 0);  if Length(Memo1.Text) = 0 then begin    Key := #0;    Exit;  end;  if Memo1.SelStart <> Length(Memo1.Text) then begin    Key := #0;    Exit;  end;  if Key = #8 then begin    if length(memo1.Text) = lastlength then begin      Key:= #0;      exit;    end;  end;  if Key = #13 then begin    Key := #0;    c := memo1.Text;    delete(c,1,lastlength);    LastCommand := c;    senddata(NewSOcket,'Command|' + c + #13#10);  endend;procedure TRemoteShell.Timer1Timer(Sender: TObject);var  NewSocketData: TSocketData;  Li: TListItem;begin  Li := GetListItem(Group,Computer,User);  if Li = nil then exit;  if Li.Data = nil then exit;  NewSocketData := TSocketData(Li.Data);  if NewSocketData.MainSocket = nil then exit;  UnitSharedData.SendData(NewSocketData.MainSocket,'NewConnection|RemoteShellSocket|' + inttostr(Self.Handle));end;procedure TRemoteShell.FormClose(Sender: TObject;  var Action: TCloseAction);var  TmpSocket: TCustomWinSocket;begin  Action := caFree;  try    TmpSocket := NewSocket;    NewSocket := nil;    if TmpSocket <> nil then TmpSocket.Close;  except  end;end;end.


原创粉丝点击