⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tmultiulunit.~pas

📁 DELPHI 下远程控制源码
💻 ~PAS
字号:
unit TMultiULUnit;

interface

uses
  Classes,APFUnit,IdTCPClient,IdSocks,SysUtils,IdComponent,IdGlobal,DB;

type
  TMultiULThread = class(TThread)
  private
    iWorkCount   :int64;
    iWorkCountMax:int64;
    TheULSocket  : TIdTcpClient;     
    TheScktInfo  : TSocksInfo;
    TheConnRec   : TConnectRec;
    TheConnectOpt: TConnectOpt;
    TheUlFile    : String;
    TheSavePath  : string;    
  protected
    Procedure ShowULProgress;
    procedure ShowDisConnectState;
    procedure ShowRefuseState;
    procedure ShowNetState;
    procedure ShowErrorstate;
    Function  ConnectThePC(MyTcp:TidTcpClient;
			TheConRec:TConnectRec):Boolean;//连接远程主机
    Procedure SetConnectOpt(TCPClient:TidTCPClient;TheOpt:TConnectOpt);
    procedure Execute; override;
  public 
    procedure TheBeginWork(Sender: TObject; AWorkMode: TWorkMode;
					  const AWorkCountMax: Integer);
    procedure TheWork(Sender: TObject; AWorkMode: TWorkMode;
					  const AWorkCount: Integer);   
    constructor Create(TheConnectRec:TConnectRec;
			 TheConnOpt:TConnectOpt;TheFile,TheSPath:String);     
    destructor  Destroy; override;
  end;

implementation

uses
     unit1;
 
constructor TMultiULThread.Create(TheConnectRec:TConnectRec;
		  TheConnOpt:TConnectOpt;TheFile,TheSPath:String); 
begin
  //===============用于全局变量的赋值+1=========
   LetULSingle.Acquire;
     Form1.ULThreadCount:=Form1.ULThreadCount+1;
   LetULSingle.Release; 
  //===========================================
   TheULFile    :=TheFile;
   TheSavePath  :=TheSPath;
   TheConnRec   :=TheConnectRec;
   TheConnectOpt:=TheConnectOpt;

   TheScktInfo:=TSocksInfo.Create;
   TheScktInfo.Authentication:=TheConnectOPt.PUseAuth;//是否代理验证
   TheScktInfo.Host:=TheConnectOpt.ProxyHost;//代理主机
   TheScktInfo.Port:=TheConnectOPt.ProxyPort;
   TheScktInfo.UserID:=TheConnectOPt.PUserID;
   TheScktInfo.Password:=TheConnectOpt.PPassWD;
   TheScktInfo.Version:=TheConnectOpt.PVersion;
   
   TheULSocket:=TIdTcpClient.Create(nil);
   TheULSocket.Host:=TheConnectRec.ConHost;
   TheULSocket.UseNagle:=True;
   TheULSocket.SocksInfo:=TheScktInfo; 

   TheULSocket.OnWork     :=TheWork;
   TheULSocket.OnWorkBegin:=TheBeginWork;
   Self.FreeOnTerminate:=True;
   inherited Create(True);    
end;

procedure TMultiULThread.Execute;
var
   iRet:Integer;
   TheFLen:integer;
   UpFStream:TFileStream;    
begin
  if ConnectThePC(TheULSocket,TheConnRec) then//连接成功
  begin 
     try 
       iRet:=TheULSocket.ReadInteger;  //读取验证数
     except
       self.Terminate;
       exit;
     end;
     if iRet=1 then //验证通过
     begin
       if Not FileExists(TheULFile) then //如果文件定位失败
       begin
	 self.Synchronize(ShowErrorstate);
	 self.Terminate;
	 exit;
       end;
       try
	 UpFStream:=TFileStream.Create(TheULFile,fmOpenRead);
	 TheFLen:=UpFStream.Size;
       except  	 
	 self.Synchronize(ShowErrorstate);
	 self.Terminate;
	 exit;
       end;
       if TheSavePath[Length(TheSavePath)]<>'\' then
			       TheSavePath:=TheSavepath+'\';
	TheULFile:=TheSavePath+ExtractFileName(TheULFile);        
       try
	TheULSocket.Write('文件上传'+EOL);//发送命令
	TheULSocket.Write(TheULFile+EOL); //发送上传存储的文件名
	TheULSocket.WriteInteger(TheFLen); //发送文件位置
	TheULSocket.WriteStream(UpFStream); //发送文件流       
       except 
	Synchronize(ShowNetState);       
	UpFStream.Free;
	self.Terminate;
	exit;
       end;        
       UpFStream.Free;     
     end else Synchronize(ShowRefuseState);      
  end else Synchronize(ShowDisConnectState);      
end;
destructor TMultiULThread.Destroy;
begin
  //===============用于全局变量的赋值-1=========
   LetULSingle.Acquire;
     Form1.ULThreadCount:=Form1.ULThreadCount-1;
   LetULSingle.Release; 
  //===========================================
  TheULSocket.Disconnect;
  TheULSocket.Free;
  TheScktInfo.Free;
  inherited destroy;
end;
Procedure TMultiULThread.SetConnectOpt(TCPClient:TidTCPClient;TheOpt:TConnectOpt);
begin
  TCPClient.UseNagle:=TheOpt.UseNagle;
  TCPClient.InterceptEnabled:=TheOpt.UseIntercept;
  TCPClient.SocksInfo.Authentication:=TheOpt.PUseAuth;
  TCPClient.SocksInfo.Host:=TheOpt.ProxyHost;
  TCPClient.SocksInfo.Port:=TheOpt.ProxyPort;
  TCPClient.SocksInfo.Password:=TheOpt.PPassWD;
  TCPClient.SocksInfo.UserID:=TheOpt.PUserID;
  TCPClient.SocksInfo.Version:=TheOpt.PVersion;
end;
Function TMultiULThread.ConnectThePC(MyTcp:TidTcpClient;TheConRec:TConnectRec):Boolean;//连接远程主机
var
  ConnectStrList:TStringList;
  ConnectStream :TStringStream;
  NowStr:String;//记录当前时间
  SwapOK:boolean;
begin
  Try
    ConnectStrList:=TStringList.Create;
  except
    Result:=False;
    exit;
  end;
    ConnectStrList.Clear;
    NowStr:=DateTimeToStr(Now);
    ConnectStrList.Add(NowStr);
    ConnectStrList.Add(TheConRec.UserName);
    ConnectStrList.Add(TheConRec.Password);
  Try
    ConnectStream :=TStringStream.Create(ConnectStrList.Text);
  except
    ConnectStrList.Free;
    Result:=False;
    exit;
  end;
  ConnectStream.Position:=0;
  StrInfoSwap('wqkemail8088',ConnectStream,SwapOK);
  if not SwapOK then
  begin
    ConnectStream.Free;
    ConnectStrList.Free;
    Result:=False;
    exit;
  end;
  MyTcp.Disconnect;
  MyTcp.Host:=TheConRec.ConHost;
  MyTcp.Port:=TheConRec.ConPort;
  SetConnectOpt(MyTcp,TheConnectOpt);//设置代理或加密的附加信息
  Try
    MyTcp.Connect;
  except
    ConnectStream.Free;
    ConnectStrList.Free;
    Result:=False;
    exit;
  end;
  Try
    MyTcp.WriteInteger(ConnectStream.Size);
    MyTcp.WriteStream(ConnectStream);
  except
    ConnectStream.Free;
    ConnectStrList.Free;
    Result:=False;
    exit;
  end;
  ConnectStream.Free;
  ConnectStrList.Free;
  Result:=True;
end;
procedure TMultiULThread.TheBeginWork(Sender: TObject; AWorkMode: TWorkMode;
					  const AWorkCountMax: Integer);
begin
    iWorkCountMax:=AWorkCountMax;
end;
procedure TMultiULThread.TheWork(Sender: TObject; AWorkMode: TWorkMode;
					      const AWorkCount: Integer); 
begin
    iWorkCount:=AWorkCount;
    Synchronize(ShowULProgress);
end;
procedure TMultiULThread.ShowDisConnectState;//设置连接失败信息
begin
  With Form1 do
  begin
     if UpCDS.Active=False then UpCDS.Open;    
     UpCDS.DisableControls;      
     UpCDS.First;
     Repeat
       if UpperCase(UpCDS.FieldByName('ULoadFile').AsString)
				      =UpperCase(TheULFile) then
       begin
	   UpCDS.Edit;
	   UpCDS.FieldByName('States').AsString:='连接失败';
	   UpCDS.SaveToFile(TheUpLoadRecFile);
	   break;
       end;
       UpCDS.Next;
     until UpCDS.Eof;
     UpCDS.EnableControls;
  end;
end;
procedure TMultiULThread.ShowRefuseState;//设置拒绝连接信息
begin
  With Form1 do
  begin
     if UpCDS.Active=False then UpCDS.Open;    
     UpCDS.DisableControls;      
     UpCDS.First;
     Repeat
       if UpperCase(UpCDS.FieldByName('DLoadFile').AsString)
				      =UpperCase(TheULFile) then
       begin
	   UpCDS.Edit;
	   UpCDS.FieldByName('States').AsString:='验证失败';
	   UpCDS.SaveToFile(TheUpLoadRecFile);
	   break;
       end;
       UpCDS.Next;
     until UpCDS.Eof;
     UpCDS.EnableControls;
  end;
end;
procedure TMultiULThread.ShowNetState;//设置网络中断信息
begin
  With Form1 do
  begin
     if UpCDS.Active=False then UpCDS.Open;    
     UpCDS.DisableControls;      
     UpCDS.First;
     Repeat
       if UpperCase(UpCDS.FieldByName('DLoadFile').AsString)
				      =UpperCase(TheULFile) then
       begin
	   UpCDS.Edit;
	   UpCDS.FieldByName('States').AsString:='传输中断';
	   UpCDS.SaveToFile(TheUpLoadRecFile);
	   break;
       end;
       UpCDS.Next;
     until UpCDS.Eof;
     UpCDS.EnableControls;
  end;
end;
procedure TMultiULThread.ShowErrorstate;//设置错误信息
begin
  With Form1 do
  begin
     if UpCDS.Active=False then UpCDS.Open;    
     UpCDS.DisableControls;      
     UpCDS.First;
     Repeat
       if UpperCase(UpCDS.FieldByName('ULoadFile').AsString)
				      =UpperCase(TheULFile) then
       begin
	   UpCDS.Edit;
	   UpCDS.FieldByName('States').AsString:='文件失效';
	   UpCDS.SaveToFile(TheUpLoadRecFile);  	   
	   break;
       end;
       UpCDS.Next;
     until UpCDS.Eof;
     UpCDS.EnableControls;
  end;
end;
//临时用以下变量 
var
  TheRatio:Integer;
Procedure TMultiULThread.ShowULProgress;
var 
  TheRatio8:integer;
  TheCDSPos:TBookmark;
begin
  TheRatio8:=((iWorkCount*100) div iWorkCountMax);
  if TheRatio8=TheRatio then exit;
  TheRatio:=TheRatio8;
  
  With Form1 do
  begin
     if UpCDS.Active=False then UpCDS.Open;
     TheCDSPos:=UpCDS.GetBookmark;
     UpCDS.DisableControls;      
     UpCDS.First;
     Repeat
     if UpperCase(UpCDS.FieldByName('ULoadFile').AsString)
				      =UpperCase(TheULFile) then
     begin
	   UpCDS.Edit;
	   UpCDS.FieldByName('States').AsString:='上传..';
	   UpCDS.FieldByName('ULoadSize').AsInteger:=
				     (iWorkCount*100 div iWorkCountMax);
	   if (iWorkCount*100 div iWorkCountMax)=100 then
	   begin
	     UpCDS.FieldByName('States').AsString:='上传完毕';		     
	     UpCDS.FieldByName('ULoadEndTime').AsDateTime:=now;
	     UpCDS.SaveToFile(TheUpLoadRecFile);
	   end;
     end;
     UpCDS.Next;
     until UpCDS.Eof;
     UpCDS.GotoBookmark(TheCDSPos);
     UpCDS.FreeBookmark(TheCDSPos);
     UpCDS.EnableControls; 
     Update;    
  end;
end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -