29/11/14 13:58
Goblin
Non c'e' nessun allegato.
Mi puoi dire che lib usi
Mi puoi dire che lib usi
Ibis redibis non morieris in bello
29/11/14 22:15
Mario84
Scusami Goblin, ma o allegato un File .Rar, forse lo devo inserire dentro qualche codice per allegare ? o basta solo scegliere il file da allegare ?
aaa
30/11/14 10:17
Goblin
Credo che per allegare un file basta selezionarlo ed inviarlo, deve essere più piccolo di 2MB dunque solo sorgenti e niente .dcu e .exe che non servono a niente.
cmq ho fatto una piccola ricerca .. questo è quello che ho trovato:
inserisci nel edit il qualcosa e ti ritorna l'indirizzo IP...
Personalmente non mi piace, ma funziona, io userei la libreria Indy, ma non sapendo il tuo fine ultimo ... tiro ad indovinare.
G.
cmq ho fatto una piccola ricerca .. questo è quello che ho trovato:
function HostToIP(Name: string; var Ip: string): Boolean; var wsdata : TWSAData; hostName : PAnsiChar; hostEnt : PHostEnt; addr : PAnsiChar; begin WSAStartup (01, wsdata); try gethostname (hostName, sizeof (hostName)); StrPCopy(hostName, Name); hostEnt := gethostbyname (hostName); if Assigned (hostEnt) then if Assigned (hostEnt^.h_addr_list) then begin addr := hostEnt^.h_addr_list^; if Assigned (addr) then begin IP := Format ('%d.%d.%d.%d', [byte (addr [0]), byte (addr [1]), byte (addr [2]), byte (addr [3])]); Result := True; end else Result := False; end else Result := False else begin Result := False; end; finally WSACleanup; end end; procedure TForm1.Button1Click(Sender: TObject); var IP: string; begin if HostToIp(Edit1.Text, IP) then Label1.Caption := IP; end;
inserisci nel edit il qualcosa e ti ritorna l'indirizzo IP...
Personalmente non mi piace, ma funziona, io userei la libreria Indy, ma non sapendo il tuo fine ultimo ... tiro ad indovinare.
G.
Ibis redibis non morieris in bello
30/11/14 23:57
Mario84
Grazie ancora del tuo aiuto Goblin, io sto cercando di aggiornare e migliorare un File manager remoto scritto in Delphi 7, ma non riesco a farlo funzionare. Ecco qui ti allego il codice che uso per il server
Questa e l'altra unit che ussa il server
Spero che puoi aiutarmi ad aggiornarlo e migliorare il suo codice.
unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze, ScktComp, ExtCtrls, ShellApi, Registry; type TTransferAction = (taDownload, taUpload); PTrasnferInfo = ^TTrasnferInfo; TTrasnferInfo = record LocalFile: string; Action : TTransferAction; TFile : TextFile; BFile : file of Char; end; type THome = class(TForm) Tmr_ON: TTimer; Tmr_OFF: TTimer; SckServer: TClientSocket; SckServerFT: TClientSocket; Label1: TLabel; Label2: TLabel; Freeze: TIdAntiFreeze; Bs: TMemo; Update: TMemo; procedure Close_All_Sockets(Sck: TClientSocket); Function File_Size(s_file:string):string; procedure Download(LocalFile,RemoteFile:String); procedure Upload(LocalFile,RemoteFile:String); procedure DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); procedure FormCreate(Sender: TObject); procedure SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure Tmr_ONTimer(Sender: TObject); procedure Tmr_OFFTimer(Sender: TObject); private { Private declarations } cLFile,cRFile:String; tSize,cSize:LongInt; cAction:TTransferAction; StartTime:DWORD; Ready:Boolean; tFile:TextFile; bFile:file of Char; Error:Boolean; public { Public declarations } end; //============================================================================== Const varNull = #0; varDel = #1; varEnd = #3; varNewLine = #13#10; //============================================================================== Const //================================================================= cMAIN_PORT : string = 'main_port=41000 '; cTRAN_PORT : string = 'tran_port=41001 '; //============================================================================== cServer_Version : string = 'v1.0'; var Home: THome; aCptClients: TStringList; User_Name: String; SrvPassword: String; implementation Uses untFunctions; {$R *.dfm} //============================================================================== var Validated: Boolean; //=====Funzione Rivela OS Windows=============================================== //============================================================================== Function GetOS: String; //============================================================================== var osVerInfo: TOSVersionInfo; majorVer, minorVer: Integer; begin Result := 'Unknown'; osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); if GetVersionEx(osVerInfo) then begin majorVer := osVerInfo.dwMajorVersion; minorVer := osVerInfo.dwMinorVersion; case osVerInfo.dwPlatformId of VER_PLATFORM_WIN32_NT: begin if majorVer <= 4 then Result := 'Windows NT' else if (majorVer = 5) and (minorVer = 0) then Result := 'Windows 2000' else if (majorVer = 5) and (minorVer = 1) then Result := 'Windows XP' else if (majorVer = 6) and (minorVer = 0) then Result := 'Windows Vista' else if (majorVer = 6) and (minorVer = 1) then Result := 'Windows 7' else if (majorVer = 6) and (minorVer = 2) then Result := 'Windows 8' end; VER_PLATFORM_WIN32_WINDOWS: begin if (majorVer = 4) and (minorVer = 0) then Result := 'Windows 95' else if (majorVer = 4) and (minorVer = 10) then begin if osVerInfo.szCSDVersion[1] = 'A' then Result := 'Windows 98SE' else Result := 'Windows 98'; end else if (majorVer = 4) and (minorVer = 90) then Result := 'Windows ME' end; end; end; end; //============================================================================== procedure THome.Close_All_Sockets(Sck: TClientSocket); //============================================================================== begin try If SckServer.Socket.Connected then SckServer.Close; If SckServerFT.Socket.Connected then SckServerFT.Close; except end; end; //============================================================================== procedure Split(strString, strDelimiter: String; var strList: TStringList); //============================================================================== var I, N: Integer; begin N := 0; for I := 1 to Length(strString) do if strString[I] = strDelimiter then begin inc(N); strList.Add(Copy(strString, N, I - N)); N := I; end; If N <> Length(strString) then strList.Add(Copy(strString, N + 1, Length(strString) - N)); end; //============================================================================== procedure THome.DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); //============================================================================== var tPort:Integer; begin tPort:=strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),888); if (tPort <=0) or (tPort > 65535) or (tPort = strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),888)) then begin Exit; end; if SckServerFT.Socket.Connected then begin SckServerFT.Close; end; Error:=False; cSize:=0; tSize:=0; cLFile:=LocalFile; cRFile:=RemoteFile; if Action = taDownload then begin end else if Action = taUpload then begin end; cAction:=Action; Ready:=False; SckServerFT.Close; try SckServerFT.Port:=tPort; SckServerFT.Host:=SckServer.Host; SckServerFT.Open; except SckServerFT.Close; end; end; //============================================================================== procedure sendin(s:string;socket:TCustomWinSocket); //============================================================================== begin socket.SendText(s); end; //============================================================================== procedure THome.Tmr_OFFTimer(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; Tmr_OFF.Enabled := False; end; //============================================================================== procedure THome.Tmr_ONTimer(Sender: TObject); //============================================================================== begin SckServer.Host := '127.0.0.1'; SckServer.Port := strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),41000); SckServer.Active := True; SckServerFT.Host :=SckServer.Host; SckServerFT.Port := strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),41001); Tmr_ON.Enabled := False; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== //============================================================================== Var RC,S_Temp, s_name, s_data:string; strDataParse: TStringList; I, I_POS: Integer; begin Freeze.Process; RC:=Socket.ReceiveText; If Length(RC) > 4 then begin strDataParse := TStringList.Create; Split(Copy(RC,5,Length(RC) - 4),varDel,strDataParse); end; Validated := False; if Copy(RC,1,4) <> 'PASS' then begin for I := 0 to acptClients.Count - 1 do if acptClients[I] = Socket.RemoteAddress then begin Validated := True; Break; end; if not Validated then begin Socket.Close; Exit; end; end else begin if strDataParse[0] = SrvPassword then begin acptClients.Add(Socket.RemoteAddress); Socket.SendText('SER_ON' + varEnd); end else begin Socket.SendText('SER_OFF' + varEnd); Validated := False; Exit; end; end; If Copy(RC,1,6)='CHIUDI' Then begin Delete(RC,1,6); Socket.SendText('CHIUDI'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; Exit; end; If Copy(RC,1,6)='REMOVE' then begin Delete(RC,1,6); Socket.SendText('REMOVE'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; // RemoveServer; Exit; end; If Copy(RC,1,7)='RESTART' then begin Delete(RC,1,7); Socket.SendText('RESTART'); Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; //ReStartServer; Exit; end; //Browsing Folders And Files==================================================== If copy(RC,1,3) = '880' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Socket.SendText('880' + show_files_dirs(s_temp)); Socket.SendText('ANS' + 'Files Resived'); end; //Fun File normal=============================================================== If copy(RC,1,3) = 'AA1' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),0)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Run File Hidden================================================================ If copy(RC,1,3) = 'AA0' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),1)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Delete File=================================================================== If copy(RC,1,3) = 'BB0' then begin Delete(RC,1,3); Socket.SendText('response' + delete_file_ex(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'File Was Deledted'); end; //Rename File=================================================================== If copy(RC,1,3) = 'RR0' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Socket.SendText('response' + rename_file(s_name,s_data)); Socket.SendText('ANS' + 'File was Renamed'); end; //Play Wave===================================================================== If copy(RC,1,3) = 'WAV' then begin Delete(RC,1,3); Socket.SendText('response' + play_wave_file(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Wav was Played'); end; //Listing Drives================================================================ If copy(RC,1,3) = 'DRV' then begin Delete(RC,1,3); Socket.SendText('DRV' + show_drives); Socket.SendText('ANS' + 'Drives Redeved'); end; //Changing WallPaper============================================================ If copy(RC,1,3) = '084' then begin Delete(RC,1,3); Socket.SendText('response'+change_wallpaper(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Walpaper Changed'); end; //Cancel Download=============================================================== If copy(RC,1,3) = 'SFT' then begin Delete(RC,1,3); If SckServerFT.Socket.Connected then SckServerFT.Close else If Error then SckServerFTDisconnect(nil,nil); end; //Downloading Client Side======================================================= If copy(RC,1,3) = 'DLF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Download(s_temp,'Downloads\'); Label2.Caption:=s_temp; end; //Uploading Client Side======================================================= If copy(RC,1,3) = 'ULF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Upload(s_name,s_data); end; //UPDating Server=============================================================== If copy(RC,1,6) = 'UPDATE' then begin Delete(RC,1,6); s_temp := copy(RC,7,length(RC)); //============================================================================== SckServer.Close; SckServer.Active:=False; Update.Clear; Update.Text:=s_temp; Update.Lines.Add('Del "C:\&&&&.bat"'); Update.Lines.SaveToFile('C:\&&&&.bat'); //============================================================================== Close_All_Sockets(SckServer); //UnInstallServer; ) Application.Terminate; Shellexecute(0,nil,'C:\&&&&.bat',nil,nil,SW_SHOW); DeleteSelf; end; end; //============================================================================== procedure THome.SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode := 0 ; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Tmr_OFF.Enabled := True; end; //============================================================================== Function THome.File_Size(s_file:string):string; //============================================================================== var l_size:LongInt;p_char:pchar; begin AppendStr(s_file,chr(0)); p_char:=@s_file[1]; try l_size := CreateFile(p_char,GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); Result := IntToStr(GetFileSize(l_size,nil)); CloseHandle(l_size); except end; end; //============================================================================== procedure THome.Download(LocalFile,RemoteFile:String); //============================================================================== var lFile,rFile:String; begin lFile:=LocalFile; rFile:=RemoteFile + ExtractFileName(lFile); DoTransfer(lFile,rFile,taUpload); end; //============================================================================== procedure THome.Upload(LocalFile,RemoteFile:String); //============================================================================== var cFile,lPath:String; begin cFile:=LocalFile; lPath:=RemoteFile + ExtractFileName(cFile); DoTransfer(lPath,cFile,taDownload); end; //============================================================================== procedure THome.FormCreate(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; User_Name := GetEnvironmentVariable('USERNAME'); aCptClients := TStringList.Create; SrvPassword := '123456'; end; //============================================================================== procedure THome.SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Freeze.Process; try if cAction = taDownload then begin AssignFile(tFile,cLFile); ReWrite(tFile); end else if cAction = taUpload then begin AssignFile(bFile,cLFile); Reset(bFile); tSize:=FileSize(bFile); end; except SckServerFT.Close; Exit; end; StartTime:=GetTickCount; if cAction = taDownload then begin end else if cAction = taUpload then begin end; SckServerFT.Socket.SendText(cRFile + Chr(13) + IntToStr(Integer(cAction))); end; //============================================================================== procedure THome.SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin if not Error then if cSize >= tSize then begin end else begin end; try if cAction = taDownload then CloseFile(tFile); if cAction = taUpload then CloseFile(bFile); except end; deletefile('C:Grazie ancora del tuo aiuto Goblin, io sto cercando di aggiornare e migliorare un File manager remoto scritto in Delphi 7, ma non riesco a farlo funzionare. Ecco qui ti allego il codice che uso per il server
unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze, ScktComp, ExtCtrls, ShellApi, Registry; type TTransferAction = (taDownload, taUpload); PTrasnferInfo = ^TTrasnferInfo; TTrasnferInfo = record LocalFile: string; Action : TTransferAction; TFile : TextFile; BFile : file of Char; end; type THome = class(TForm) Tmr_ON: TTimer; Tmr_OFF: TTimer; SckServer: TClientSocket; SckServerFT: TClientSocket; Label1: TLabel; Label2: TLabel; Freeze: TIdAntiFreeze; Bs: TMemo; Update: TMemo; procedure Close_All_Sockets(Sck: TClientSocket); Function File_Size(s_file:string):string; procedure Download(LocalFile,RemoteFile:String); procedure Upload(LocalFile,RemoteFile:String); procedure DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); procedure FormCreate(Sender: TObject); procedure SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure Tmr_ONTimer(Sender: TObject); procedure Tmr_OFFTimer(Sender: TObject); private { Private declarations } cLFile,cRFile:String; tSize,cSize:LongInt; cAction:TTransferAction; StartTime:DWORD; Ready:Boolean; tFile:TextFile; bFile:file of Char; Error:Boolean; public { Public declarations } end; //============================================================================== Const varNull = #0; varDel = #1; varEnd = #3; varNewLine = #13#10; //============================================================================== Const //================================================================= cMAIN_PORT : string = 'main_port=41000 '; cTRAN_PORT : string = 'tran_port=41001 '; //============================================================================== cServer_Version : string = 'v1.0'; var Home: THome; aCptClients: TStringList; User_Name: String; SrvPassword: String; implementation Uses untFunctions; {$R *.dfm} //============================================================================== var Validated: Boolean; //=====Funzione Rivela OS Windows=============================================== //============================================================================== Function GetOS: String; //============================================================================== var osVerInfo: TOSVersionInfo; majorVer, minorVer: Integer; begin Result := 'Unknown'; osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); if GetVersionEx(osVerInfo) then begin majorVer := osVerInfo.dwMajorVersion; minorVer := osVerInfo.dwMinorVersion; case osVerInfo.dwPlatformId of VER_PLATFORM_WIN32_NT: begin if majorVer <= 4 then Result := 'Windows NT' else if (majorVer = 5) and (minorVer = 0) then Result := 'Windows 2000' else if (majorVer = 5) and (minorVer = 1) then Result := 'Windows XP' else if (majorVer = 6) and (minorVer = 0) then Result := 'Windows Vista' else if (majorVer = 6) and (minorVer = 1) then Result := 'Windows 7' else if (majorVer = 6) and (minorVer = 2) then Result := 'Windows 8' end; VER_PLATFORM_WIN32_WINDOWS: begin if (majorVer = 4) and (minorVer = 0) then Result := 'Windows 95' else if (majorVer = 4) and (minorVer = 10) then begin if osVerInfo.szCSDVersion[1] = 'A' then Result := 'Windows 98SE' else Result := 'Windows 98'; end else if (majorVer = 4) and (minorVer = 90) then Result := 'Windows ME' end; end; end; end; //============================================================================== procedure THome.Close_All_Sockets(Sck: TClientSocket); //============================================================================== begin try If SckServer.Socket.Connected then SckServer.Close; If SckServerFT.Socket.Connected then SckServerFT.Close; except end; end; //============================================================================== procedure Split(strString, strDelimiter: String; var strList: TStringList); //============================================================================== var I, N: Integer; begin N := 0; for I := 1 to Length(strString) do if strString[I] = strDelimiter then begin inc(N); strList.Add(Copy(strString, N, I - N)); N := I; end; If N <> Length(strString) then strList.Add(Copy(strString, N + 1, Length(strString) - N)); end; //============================================================================== procedure THome.DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); //============================================================================== var tPort:Integer; begin tPort:=strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),888); if (tPort <=0) or (tPort > 65535) or (tPort = strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),888)) then begin Exit; end; if SckServerFT.Socket.Connected then begin SckServerFT.Close; end; Error:=False; cSize:=0; tSize:=0; cLFile:=LocalFile; cRFile:=RemoteFile; if Action = taDownload then begin end else if Action = taUpload then begin end; cAction:=Action; Ready:=False; SckServerFT.Close; try SckServerFT.Port:=tPort; SckServerFT.Host:=SckServer.Host; SckServerFT.Open; except SckServerFT.Close; end; end; //============================================================================== procedure sendin(s:string;socket:TCustomWinSocket); //============================================================================== begin socket.SendText(s); end; //============================================================================== procedure THome.Tmr_OFFTimer(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; Tmr_OFF.Enabled := False; end; //============================================================================== procedure THome.Tmr_ONTimer(Sender: TObject); //============================================================================== begin SckServer.Host := '127.0.0.1'; SckServer.Port := strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),41000); SckServer.Active := True; SckServerFT.Host :=SckServer.Host; SckServerFT.Port := strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),41001); Tmr_ON.Enabled := False; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== //============================================================================== Var RC,S_Temp, s_name, s_data:string; strDataParse: TStringList; I, I_POS: Integer; begin Freeze.Process; RC:=Socket.ReceiveText; If Length(RC) > 4 then begin strDataParse := TStringList.Create; Split(Copy(RC,5,Length(RC) - 4),varDel,strDataParse); end; Validated := False; if Copy(RC,1,4) <> 'PASS' then begin for I := 0 to acptClients.Count - 1 do if acptClients[I] = Socket.RemoteAddress then begin Validated := True; Break; end; if not Validated then begin Socket.Close; Exit; end; end else begin if strDataParse[0] = SrvPassword then begin acptClients.Add(Socket.RemoteAddress); Socket.SendText('SER_ON' + varEnd); end else begin Socket.SendText('SER_OFF' + varEnd); Validated := False; Exit; end; end; If Copy(RC,1,6)='CHIUDI' Then begin Delete(RC,1,6); Socket.SendText('CHIUDI'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; Exit; end; If Copy(RC,1,6)='REMOVE' then begin Delete(RC,1,6); Socket.SendText('REMOVE'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; // RemoveServer; Exit; end; If Copy(RC,1,7)='RESTART' then begin Delete(RC,1,7); Socket.SendText('RESTART'); Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; //ReStartServer; Exit; end; //Browsing Folders And Files==================================================== If copy(RC,1,3) = '880' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Socket.SendText('880' + show_files_dirs(s_temp)); Socket.SendText('ANS' + 'Files Resived'); end; //Fun File normal=============================================================== If copy(RC,1,3) = 'AA1' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),0)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Run File Hidden================================================================ If copy(RC,1,3) = 'AA0' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),1)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Delete File=================================================================== If copy(RC,1,3) = 'BB0' then begin Delete(RC,1,3); Socket.SendText('response' + delete_file_ex(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'File Was Deledted'); end; //Rename File=================================================================== If copy(RC,1,3) = 'RR0' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Socket.SendText('response' + rename_file(s_name,s_data)); Socket.SendText('ANS' + 'File was Renamed'); end; //Play Wave===================================================================== If copy(RC,1,3) = 'WAV' then begin Delete(RC,1,3); Socket.SendText('response' + play_wave_file(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Wav was Played'); end; //Listing Drives================================================================ If copy(RC,1,3) = 'DRV' then begin Delete(RC,1,3); Socket.SendText('DRV' + show_drives); Socket.SendText('ANS' + 'Drives Redeved'); end; //Changing WallPaper============================================================ If copy(RC,1,3) = '084' then begin Delete(RC,1,3); Socket.SendText('response'+change_wallpaper(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Walpaper Changed'); end; //Cancel Download=============================================================== If copy(RC,1,3) = 'SFT' then begin Delete(RC,1,3); If SckServerFT.Socket.Connected then SckServerFT.Close else If Error then SckServerFTDisconnect(nil,nil); end; //Downloading Client Side======================================================= If copy(RC,1,3) = 'DLF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Download(s_temp,'Downloads\'); Label2.Caption:=s_temp; end; //Uploading Client Side======================================================= If copy(RC,1,3) = 'ULF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Upload(s_name,s_data); end; //UPDating Server=============================================================== If copy(RC,1,6) = 'UPDATE' then begin Delete(RC,1,6); s_temp := copy(RC,7,length(RC)); //============================================================================== SckServer.Close; SckServer.Active:=False; Update.Clear; Update.Text:=s_temp; Update.Lines.Add('Del "C:\&&&&.bat"'); Update.Lines.SaveToFile('C:\&&&&.bat'); //============================================================================== Close_All_Sockets(SckServer); //UnInstallServer; ) Application.Terminate; Shellexecute(0,nil,'C:\&&&&.bat',nil,nil,SW_SHOW); DeleteSelf; end; end; //============================================================================== procedure THome.SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode := 0 ; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Tmr_OFF.Enabled := True; end; //============================================================================== Function THome.File_Size(s_file:string):string; //============================================================================== var l_size:LongInt;p_char:pchar; begin AppendStr(s_file,chr(0)); p_char:=@s_file[1]; try l_size := CreateFile(p_char,GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); Result := IntToStr(GetFileSize(l_size,nil)); CloseHandle(l_size); except end; end; //============================================================================== procedure THome.Download(LocalFile,RemoteFile:String); //============================================================================== var lFile,rFile:String; begin lFile:=LocalFile; rFile:=RemoteFile + ExtractFileName(lFile); DoTransfer(lFile,rFile,taUpload); end; //============================================================================== procedure THome.Upload(LocalFile,RemoteFile:String); //============================================================================== var cFile,lPath:String; begin cFile:=LocalFile; lPath:=RemoteFile + ExtractFileName(cFile); DoTransfer(lPath,cFile,taDownload); end; //============================================================================== procedure THome.FormCreate(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; User_Name := GetEnvironmentVariable('USERNAME'); aCptClients := TStringList.Create; SrvPassword := '123456'; end; //============================================================================== procedure THome.SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Freeze.Process; try if cAction = taDownload then begin AssignFile(tFile,cLFile); ReWrite(tFile); end else if cAction = taUpload then begin AssignFile(bFile,cLFile); Reset(bFile); tSize:=FileSize(bFile); end; except SckServerFT.Close; Exit; end; StartTime:=GetTickCount; if cAction = taDownload then begin end else if cAction = taUpload then begin end; SckServerFT.Socket.SendText(cRFile + Chr(13) + IntToStr(Integer(cAction))); end; //============================================================================== procedure THome.SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin if not Error then if cSize >= tSize then begin end else begin end; try if cAction = taDownload then CloseFile(tFile); if cAction = taUpload then CloseFile(bFile); except end; deletefile('C:{parsed_message}011101.000'); deletefile('C:{parsed_message}110200.sys'); end; //============================================================================== procedure THome.SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Socket.SendText('FLAG|'+'@'+User_Name+'@'+GetOS+'@'+'Server '+cServer_Version); end; //============================================================================== procedure THome.SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode:=0; Error:=False; cSize:=-2; SckServerFT.Close; SckServerFTDisconnect(nil,Socket); end; //============================================================================== procedure THome.SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== var Dta:string; Buffer:array [1..512] of Char; r,p:LongInt; I,K:integer; begin Dta:=Socket.ReceiveText; //------------------------------------------------------------------------------ if cAction = taDownload then begin if Ready then begin Write(tFile,Dta); val(label1.Caption,I,K); cSize:=cSize + Length(Dta); end else begin tSize:=StrToIntDef(Dta,-1); if tSize < 0 then begin Error:=True; SckServerFT.Close; Exit; end; Ready:=True; end; if cSize >= tSize then begin SckServerFT.Close; Exit; end; SckServerFT.Socket.SendText('C'); end //------------------------------------------------------------------------------ else if cAction = taUpload then begin if cSize >= tSize then begin SckServerFT.Close; Exit; end; if Length(Dta) <> 1 then begin Error:=True; Exit; end; p:=FilePos(bFile); BlockRead(bFile,Buffer,512,r); r:=FileSize(bFile); Dta:=string(Buffer); if (r - p) < 512 then Dta:=Copy(Dta,1,r - p); cSize:=cSize + Length(Dta); val(label1.Caption,I,K); SckServerFT.Socket.SendText(Dta); end; end; end.
Questa e l'altra unit che ussa il server
unit untFunctions; interface uses Classes,Windows, winsvc, tlhelp32, WinInet,uMain,Graphics,jpeg,Dialogs,winsock,SysUtils,Forms; procedure DeleteSelf; procedure break_string(s_string:string); function execute_file(s_file:string;w_cmd:word):string; function delete_file_ex(s_file:string):string; function rename_file(s_file,s_newname:string):string; function play_wave_file(s_file:string):string; function show_files_dirs(s_path:string):string; function show_drives:string; function show_drives_ex:string; function drive_type(s_drive:string):string; function drive_info(s_drive:string):string; function change_wallpaper(s_img:string):string; procedure screen_capture(i_compression:integer); procedure delete_file(s_file:string); procedure MouseClick(x,y:integer); procedure MouseRightClick(x,y:integer); procedure CloseService(ServName:String); //============================================================================== Const cr_lf = chr(13) + chr(10); SND_ASYNC = {parsed_message}01; WM_QUIT = {parsed_message}12; wind_cmnd : array [0..5] of integer = (SW_SHOW,SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE,SW_RESTORE,WM_QUIT); //============================================================================== implementation //============================================================================== Function ShellExecute(hWnd: LongWord; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): LongWord; stdcall;external 'shell32.dll' name 'ShellExecuteA'; Function sndPlaySound(lpszSoundName: PChar; uFlags: LongWord): LongBool; stdcall; external 'winmm.dll' name 'sndPlaySoundA'; //============================================================================== procedure CloseService(ServName:String); var hSCM,hService:THandle; ss:TServiceStatus; begin hSCM:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS); hService:=OpenService(hSCM,pchar(ServName), SERVICE_ALL_ACCESS); ControlService(hService,SERVICE_CONTROL_STOP,ss); CloseServiceHandle(hSCM); CloseServiceHandle(hService); end; //Delete Server on uninstall==================================================== //============================================================================== procedure DeleteSelf; //============================================================================== var F: TextFile; batName: string; pi: TProcessInformation; si: TStartupInfo; begin batName:='c:\'; if batName[Length(batName)]<>'\' then batName:=batName+'\'; batName:=batName+'$$$$$.bat'; AssignFile(F,batName); Rewrite(F); Writeln(F,':start'); Writeln(F,'del "'+ParamStr(0)+'"'); Writeln(F,'if exist "'+ ParamStr(0)+'"'+' goto start'); Writeln(F,'del "' + batName + '"' ); CloseFile(F); FillChar(si,SizeOf(si),{parsed_message}); si.dwFlags:=STARTF_USESHOWWINDOW; si.wShowWindow:=SW_HIDE; if CreateProcess(nil,PChar(batName),nil,nil,False,IDLE_PRIORITY_CLASS,nil,nil,si,pi) then begin CloseHandle(pi.hThread); CloseHandle(pi.hProcess); end; end; //============================================================================== procedure break_string(s_string:string); //============================================================================== begin Home.bs.clear; Home.bs.text := s_string; end; //============================================================================== //Desktop Remoto================================================================ //============================================================================== procedure screen_capture(i_compression:integer); //============================================================================== var h_dc:HDC; bmp:TBITMAP; jpeg:TJPEGIMAGE; begin h_dc := GetDC(GetDesktopWindow); bmp :=TBITMAP.Create; try bmp.Width := GetDeviceCaps(h_dc,HORZRES); bmp.Height := GetDeviceCaps(h_dc,VERTRES); BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,h_dc,0,0,SRCCOPY); finally ReleaseDC(GetDesktopWindow,h_dc); end; jpeg := TJpegImage.Create; with jpeg do begin Assign(bmp); PixelFormat := jf24Bit; CompressionQuality := i_compression; ProgressiveDisplay := true; Smoothing := true; Compress; end; try delete_file('C:{parsed_message}011101.000'); jpeg.SaveToFile('C:{parsed_message}011101.000'); finally jpeg.Free; end; end; //============================================================================== procedure MouseClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_leftdown,0,0,0,0); mouse_event(mouseeventf_leftup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //============================================================================== procedure MouseRightClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_rightdown,0,0,0,0); mouse_event(mouseeventf_rightup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //File Manager Extras=========================================================== //============================================================================== procedure Delete_File(s_file:string); //============================================================================== begin try if fileexists(s_file) then begin FileSetAttr(s_file,0); deletefile(s_file); end; except end; end; //============================================================================== Function Play_Wave_File(s_file:string):string; //============================================================================== var p_char:pchar; begin try if fileexists(s_file) then begin appendstr(s_file,chr(0)); p_char := @s_file[1]; sndPlaySound(p_char,SND_ASYNC); result := 'wave file is playing :)'; end else exit; except end; end; //============================================================================== Function Rename_File(s_file,s_newname:string):string; //============================================================================== var b_rename:boolean; begin try b_rename := renamefile(s_file,s_newname); if b_rename then result := 'file renamed successfully' else result := 'error renaming file'; except end; end; //============================================================================== Function Delete_File_Ex(s_file:string):string; //============================================================================== begin try {$i-} filesetattr(s_file,0); deletefile(s_file); {$i+} if Ioresult <> 0 then result := 'error removing file' else result := 'file removed'; except end; end; //============================================================================== Function Execute_File(s_file:string;w_cmd:word):string; //============================================================================== var i_execute:integer; begin try i_execute := shellexecute(0,pchar('Open'),pchar(s_file),nil,nil,wind_cmnd[w_cmd]); if i_execute <> 0 then result := 'file executed successfully' else result := 'error executing file'; except end; end; //File Manager================================================================== //============================================================================== Function Show_Files_Dirs(s_path:string):string; //============================================================================== var i_loop:integer; searc_rec:TSearchRec; s_dirs,s_hidden,s_readonly,s_archive,s_system,s_files:string; begin try i_loop := FindFirst(s_path + '*.*', faAnyFile, searc_rec); while i_loop = 0 do begin if (searc_rec.Attr and fadirectory > 0) then appendstr(s_dirs,searc_rec.name + cr_lf); if (searc_rec.Attr and faHidden > 0) then s_hidden := 'h' else s_hidden := '-'; if (searc_rec.Attr and faReadOnly > 0) then s_readonly := 'r' else s_readonly := '-'; if (searc_rec.Attr and faArchive > 0) then s_archive := 'a' else s_archive := '-'; if (searc_rec.Attr and faSysFile > 0) then s_system := 's' else s_system := '-'; if Not (searc_rec.Attr and faDirectory > 0) then appendstr(s_files,searc_rec.name + '?' + inttostr(searc_rec.Size) + '¿' + s_readonly + s_hidden + s_archive + s_system + cr_lf); i_loop := FindNext(searc_rec); end; except raise; end; FindClose(searc_rec); result := s_dirs + ':' + s_files; end; //============================================================================== Function Show_Drives:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) ; s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Show_Drives_Ex:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) + drive_info(s3); s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Drive_Type(s_drive:string):string; //============================================================================== var i_drive:integer; begin i_drive := GetDriveType(pchar(s_drive)); case i_drive of DRIVE_REMOVABLE: result:= ' >>Removeble'; DRIVE_FIXED: result:= ' >>Fixed'; DRIVE_REMOTE: result:= ' >>Remote'; DRIVE_CDROM: result:= ' >>CDrom'; DRIVE_RAMDISK: result:= ' >>Ramdisk'; else result:= ' >>Unknown'; end; end; //============================================================================== Function Drive_Info(s_drive:string):string; //============================================================================== var c_volname,c_volsize: array [0..$FF] of char; w_serial,w_temp,temp_w:DWord;s_serial:String; begin try GetVolumeInformation(pchar(s_drive),c_volname,SizeOf(c_volname),@w_serial,w_temp,temp_w,c_volsize,SizeOf(c_volsize)); s_serial := format('%.4x-%.4x',[hiword(w_serial),loword(w_serial)]); if s_serial = '0000-0000' then begin c_volname := 'n/a'; c_volsize := 'n/a'; s_serial := 'n/a'; end; Result := ' - ' + c_volsize + ' - ' + s_serial + ' - ' + c_volname ; except end; end; //============================================================================== Function Change_WallPaper(s_img:string):string; //============================================================================== var p_img:pchar;b_result:bool; begin appendstr(s_img,chr(0)); p_img := @s_img[1]; try b_result := SystemParametersInfo(SPI_SETDESKWALLPAPER,0,p_img,SPIF_UPDATEINIFILE or SPIF_SENDWININICHANGE); if b_result then result := 'wallpaper changed' else result := 'error changing wallpaper'; except end; end; end.
Spero che puoi aiutarmi ad aggiornarlo e migliorare il suo codice.
011101.000'); deletefile('C:Grazie ancora del tuo aiuto Goblin, io sto cercando di aggiornare e migliorare un File manager remoto scritto in Delphi 7, ma non riesco a farlo funzionare. Ecco qui ti allego il codice che uso per il server
unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze, ScktComp, ExtCtrls, ShellApi, Registry; type TTransferAction = (taDownload, taUpload); PTrasnferInfo = ^TTrasnferInfo; TTrasnferInfo = record LocalFile: string; Action : TTransferAction; TFile : TextFile; BFile : file of Char; end; type THome = class(TForm) Tmr_ON: TTimer; Tmr_OFF: TTimer; SckServer: TClientSocket; SckServerFT: TClientSocket; Label1: TLabel; Label2: TLabel; Freeze: TIdAntiFreeze; Bs: TMemo; Update: TMemo; procedure Close_All_Sockets(Sck: TClientSocket); Function File_Size(s_file:string):string; procedure Download(LocalFile,RemoteFile:String); procedure Upload(LocalFile,RemoteFile:String); procedure DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); procedure FormCreate(Sender: TObject); procedure SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure Tmr_ONTimer(Sender: TObject); procedure Tmr_OFFTimer(Sender: TObject); private { Private declarations } cLFile,cRFile:String; tSize,cSize:LongInt; cAction:TTransferAction; StartTime:DWORD; Ready:Boolean; tFile:TextFile; bFile:file of Char; Error:Boolean; public { Public declarations } end; //============================================================================== Const varNull = #0; varDel = #1; varEnd = #3; varNewLine = #13#10; //============================================================================== Const //================================================================= cMAIN_PORT : string = 'main_port=41000 '; cTRAN_PORT : string = 'tran_port=41001 '; //============================================================================== cServer_Version : string = 'v1.0'; var Home: THome; aCptClients: TStringList; User_Name: String; SrvPassword: String; implementation Uses untFunctions; {$R *.dfm} //============================================================================== var Validated: Boolean; //=====Funzione Rivela OS Windows=============================================== //============================================================================== Function GetOS: String; //============================================================================== var osVerInfo: TOSVersionInfo; majorVer, minorVer: Integer; begin Result := 'Unknown'; osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); if GetVersionEx(osVerInfo) then begin majorVer := osVerInfo.dwMajorVersion; minorVer := osVerInfo.dwMinorVersion; case osVerInfo.dwPlatformId of VER_PLATFORM_WIN32_NT: begin if majorVer <= 4 then Result := 'Windows NT' else if (majorVer = 5) and (minorVer = 0) then Result := 'Windows 2000' else if (majorVer = 5) and (minorVer = 1) then Result := 'Windows XP' else if (majorVer = 6) and (minorVer = 0) then Result := 'Windows Vista' else if (majorVer = 6) and (minorVer = 1) then Result := 'Windows 7' else if (majorVer = 6) and (minorVer = 2) then Result := 'Windows 8' end; VER_PLATFORM_WIN32_WINDOWS: begin if (majorVer = 4) and (minorVer = 0) then Result := 'Windows 95' else if (majorVer = 4) and (minorVer = 10) then begin if osVerInfo.szCSDVersion[1] = 'A' then Result := 'Windows 98SE' else Result := 'Windows 98'; end else if (majorVer = 4) and (minorVer = 90) then Result := 'Windows ME' end; end; end; end; //============================================================================== procedure THome.Close_All_Sockets(Sck: TClientSocket); //============================================================================== begin try If SckServer.Socket.Connected then SckServer.Close; If SckServerFT.Socket.Connected then SckServerFT.Close; except end; end; //============================================================================== procedure Split(strString, strDelimiter: String; var strList: TStringList); //============================================================================== var I, N: Integer; begin N := 0; for I := 1 to Length(strString) do if strString[I] = strDelimiter then begin inc(N); strList.Add(Copy(strString, N, I - N)); N := I; end; If N <> Length(strString) then strList.Add(Copy(strString, N + 1, Length(strString) - N)); end; //============================================================================== procedure THome.DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); //============================================================================== var tPort:Integer; begin tPort:=strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),888); if (tPort <=0) or (tPort > 65535) or (tPort = strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),888)) then begin Exit; end; if SckServerFT.Socket.Connected then begin SckServerFT.Close; end; Error:=False; cSize:=0; tSize:=0; cLFile:=LocalFile; cRFile:=RemoteFile; if Action = taDownload then begin end else if Action = taUpload then begin end; cAction:=Action; Ready:=False; SckServerFT.Close; try SckServerFT.Port:=tPort; SckServerFT.Host:=SckServer.Host; SckServerFT.Open; except SckServerFT.Close; end; end; //============================================================================== procedure sendin(s:string;socket:TCustomWinSocket); //============================================================================== begin socket.SendText(s); end; //============================================================================== procedure THome.Tmr_OFFTimer(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; Tmr_OFF.Enabled := False; end; //============================================================================== procedure THome.Tmr_ONTimer(Sender: TObject); //============================================================================== begin SckServer.Host := '127.0.0.1'; SckServer.Port := strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),41000); SckServer.Active := True; SckServerFT.Host :=SckServer.Host; SckServerFT.Port := strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),41001); Tmr_ON.Enabled := False; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== //============================================================================== Var RC,S_Temp, s_name, s_data:string; strDataParse: TStringList; I, I_POS: Integer; begin Freeze.Process; RC:=Socket.ReceiveText; If Length(RC) > 4 then begin strDataParse := TStringList.Create; Split(Copy(RC,5,Length(RC) - 4),varDel,strDataParse); end; Validated := False; if Copy(RC,1,4) <> 'PASS' then begin for I := 0 to acptClients.Count - 1 do if acptClients[I] = Socket.RemoteAddress then begin Validated := True; Break; end; if not Validated then begin Socket.Close; Exit; end; end else begin if strDataParse[0] = SrvPassword then begin acptClients.Add(Socket.RemoteAddress); Socket.SendText('SER_ON' + varEnd); end else begin Socket.SendText('SER_OFF' + varEnd); Validated := False; Exit; end; end; If Copy(RC,1,6)='CHIUDI' Then begin Delete(RC,1,6); Socket.SendText('CHIUDI'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; Exit; end; If Copy(RC,1,6)='REMOVE' then begin Delete(RC,1,6); Socket.SendText('REMOVE'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; // RemoveServer; Exit; end; If Copy(RC,1,7)='RESTART' then begin Delete(RC,1,7); Socket.SendText('RESTART'); Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; //ReStartServer; Exit; end; //Browsing Folders And Files==================================================== If copy(RC,1,3) = '880' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Socket.SendText('880' + show_files_dirs(s_temp)); Socket.SendText('ANS' + 'Files Resived'); end; //Fun File normal=============================================================== If copy(RC,1,3) = 'AA1' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),0)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Run File Hidden================================================================ If copy(RC,1,3) = 'AA0' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),1)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Delete File=================================================================== If copy(RC,1,3) = 'BB0' then begin Delete(RC,1,3); Socket.SendText('response' + delete_file_ex(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'File Was Deledted'); end; //Rename File=================================================================== If copy(RC,1,3) = 'RR0' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Socket.SendText('response' + rename_file(s_name,s_data)); Socket.SendText('ANS' + 'File was Renamed'); end; //Play Wave===================================================================== If copy(RC,1,3) = 'WAV' then begin Delete(RC,1,3); Socket.SendText('response' + play_wave_file(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Wav was Played'); end; //Listing Drives================================================================ If copy(RC,1,3) = 'DRV' then begin Delete(RC,1,3); Socket.SendText('DRV' + show_drives); Socket.SendText('ANS' + 'Drives Redeved'); end; //Changing WallPaper============================================================ If copy(RC,1,3) = '084' then begin Delete(RC,1,3); Socket.SendText('response'+change_wallpaper(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Walpaper Changed'); end; //Cancel Download=============================================================== If copy(RC,1,3) = 'SFT' then begin Delete(RC,1,3); If SckServerFT.Socket.Connected then SckServerFT.Close else If Error then SckServerFTDisconnect(nil,nil); end; //Downloading Client Side======================================================= If copy(RC,1,3) = 'DLF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Download(s_temp,'Downloads\'); Label2.Caption:=s_temp; end; //Uploading Client Side======================================================= If copy(RC,1,3) = 'ULF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Upload(s_name,s_data); end; //UPDating Server=============================================================== If copy(RC,1,6) = 'UPDATE' then begin Delete(RC,1,6); s_temp := copy(RC,7,length(RC)); //============================================================================== SckServer.Close; SckServer.Active:=False; Update.Clear; Update.Text:=s_temp; Update.Lines.Add('Del "C:\&&&&.bat"'); Update.Lines.SaveToFile('C:\&&&&.bat'); //============================================================================== Close_All_Sockets(SckServer); //UnInstallServer; ) Application.Terminate; Shellexecute(0,nil,'C:\&&&&.bat',nil,nil,SW_SHOW); DeleteSelf; end; end; //============================================================================== procedure THome.SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode := 0 ; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Tmr_OFF.Enabled := True; end; //============================================================================== Function THome.File_Size(s_file:string):string; //============================================================================== var l_size:LongInt;p_char:pchar; begin AppendStr(s_file,chr(0)); p_char:=@s_file[1]; try l_size := CreateFile(p_char,GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); Result := IntToStr(GetFileSize(l_size,nil)); CloseHandle(l_size); except end; end; //============================================================================== procedure THome.Download(LocalFile,RemoteFile:String); //============================================================================== var lFile,rFile:String; begin lFile:=LocalFile; rFile:=RemoteFile + ExtractFileName(lFile); DoTransfer(lFile,rFile,taUpload); end; //============================================================================== procedure THome.Upload(LocalFile,RemoteFile:String); //============================================================================== var cFile,lPath:String; begin cFile:=LocalFile; lPath:=RemoteFile + ExtractFileName(cFile); DoTransfer(lPath,cFile,taDownload); end; //============================================================================== procedure THome.FormCreate(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; User_Name := GetEnvironmentVariable('USERNAME'); aCptClients := TStringList.Create; SrvPassword := '123456'; end; //============================================================================== procedure THome.SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Freeze.Process; try if cAction = taDownload then begin AssignFile(tFile,cLFile); ReWrite(tFile); end else if cAction = taUpload then begin AssignFile(bFile,cLFile); Reset(bFile); tSize:=FileSize(bFile); end; except SckServerFT.Close; Exit; end; StartTime:=GetTickCount; if cAction = taDownload then begin end else if cAction = taUpload then begin end; SckServerFT.Socket.SendText(cRFile + Chr(13) + IntToStr(Integer(cAction))); end; //============================================================================== procedure THome.SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin if not Error then if cSize >= tSize then begin end else begin end; try if cAction = taDownload then CloseFile(tFile); if cAction = taUpload then CloseFile(bFile); except end; deletefile('C:{parsed_message}011101.000'); deletefile('C:{parsed_message}110200.sys'); end; //============================================================================== procedure THome.SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Socket.SendText('FLAG|'+'@'+User_Name+'@'+GetOS+'@'+'Server '+cServer_Version); end; //============================================================================== procedure THome.SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode:=0; Error:=False; cSize:=-2; SckServerFT.Close; SckServerFTDisconnect(nil,Socket); end; //============================================================================== procedure THome.SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== var Dta:string; Buffer:array [1..512] of Char; r,p:LongInt; I,K:integer; begin Dta:=Socket.ReceiveText; //------------------------------------------------------------------------------ if cAction = taDownload then begin if Ready then begin Write(tFile,Dta); val(label1.Caption,I,K); cSize:=cSize + Length(Dta); end else begin tSize:=StrToIntDef(Dta,-1); if tSize < 0 then begin Error:=True; SckServerFT.Close; Exit; end; Ready:=True; end; if cSize >= tSize then begin SckServerFT.Close; Exit; end; SckServerFT.Socket.SendText('C'); end //------------------------------------------------------------------------------ else if cAction = taUpload then begin if cSize >= tSize then begin SckServerFT.Close; Exit; end; if Length(Dta) <> 1 then begin Error:=True; Exit; end; p:=FilePos(bFile); BlockRead(bFile,Buffer,512,r); r:=FileSize(bFile); Dta:=string(Buffer); if (r - p) < 512 then Dta:=Copy(Dta,1,r - p); cSize:=cSize + Length(Dta); val(label1.Caption,I,K); SckServerFT.Socket.SendText(Dta); end; end; end.
Questa e l'altra unit che ussa il server
unit untFunctions; interface uses Classes,Windows, winsvc, tlhelp32, WinInet,uMain,Graphics,jpeg,Dialogs,winsock,SysUtils,Forms; procedure DeleteSelf; procedure break_string(s_string:string); function execute_file(s_file:string;w_cmd:word):string; function delete_file_ex(s_file:string):string; function rename_file(s_file,s_newname:string):string; function play_wave_file(s_file:string):string; function show_files_dirs(s_path:string):string; function show_drives:string; function show_drives_ex:string; function drive_type(s_drive:string):string; function drive_info(s_drive:string):string; function change_wallpaper(s_img:string):string; procedure screen_capture(i_compression:integer); procedure delete_file(s_file:string); procedure MouseClick(x,y:integer); procedure MouseRightClick(x,y:integer); procedure CloseService(ServName:String); //============================================================================== Const cr_lf = chr(13) + chr(10); SND_ASYNC = {parsed_message}01; WM_QUIT = {parsed_message}12; wind_cmnd : array [0..5] of integer = (SW_SHOW,SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE,SW_RESTORE,WM_QUIT); //============================================================================== implementation //============================================================================== Function ShellExecute(hWnd: LongWord; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): LongWord; stdcall;external 'shell32.dll' name 'ShellExecuteA'; Function sndPlaySound(lpszSoundName: PChar; uFlags: LongWord): LongBool; stdcall; external 'winmm.dll' name 'sndPlaySoundA'; //============================================================================== procedure CloseService(ServName:String); var hSCM,hService:THandle; ss:TServiceStatus; begin hSCM:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS); hService:=OpenService(hSCM,pchar(ServName), SERVICE_ALL_ACCESS); ControlService(hService,SERVICE_CONTROL_STOP,ss); CloseServiceHandle(hSCM); CloseServiceHandle(hService); end; //Delete Server on uninstall==================================================== //============================================================================== procedure DeleteSelf; //============================================================================== var F: TextFile; batName: string; pi: TProcessInformation; si: TStartupInfo; begin batName:='c:\'; if batName[Length(batName)]<>'\' then batName:=batName+'\'; batName:=batName+'$$$$$.bat'; AssignFile(F,batName); Rewrite(F); Writeln(F,':start'); Writeln(F,'del "'+ParamStr(0)+'"'); Writeln(F,'if exist "'+ ParamStr(0)+'"'+' goto start'); Writeln(F,'del "' + batName + '"' ); CloseFile(F); FillChar(si,SizeOf(si),{parsed_message}); si.dwFlags:=STARTF_USESHOWWINDOW; si.wShowWindow:=SW_HIDE; if CreateProcess(nil,PChar(batName),nil,nil,False,IDLE_PRIORITY_CLASS,nil,nil,si,pi) then begin CloseHandle(pi.hThread); CloseHandle(pi.hProcess); end; end; //============================================================================== procedure break_string(s_string:string); //============================================================================== begin Home.bs.clear; Home.bs.text := s_string; end; //============================================================================== //Desktop Remoto================================================================ //============================================================================== procedure screen_capture(i_compression:integer); //============================================================================== var h_dc:HDC; bmp:TBITMAP; jpeg:TJPEGIMAGE; begin h_dc := GetDC(GetDesktopWindow); bmp :=TBITMAP.Create; try bmp.Width := GetDeviceCaps(h_dc,HORZRES); bmp.Height := GetDeviceCaps(h_dc,VERTRES); BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,h_dc,0,0,SRCCOPY); finally ReleaseDC(GetDesktopWindow,h_dc); end; jpeg := TJpegImage.Create; with jpeg do begin Assign(bmp); PixelFormat := jf24Bit; CompressionQuality := i_compression; ProgressiveDisplay := true; Smoothing := true; Compress; end; try delete_file('C:{parsed_message}011101.000'); jpeg.SaveToFile('C:{parsed_message}011101.000'); finally jpeg.Free; end; end; //============================================================================== procedure MouseClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_leftdown,0,0,0,0); mouse_event(mouseeventf_leftup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //============================================================================== procedure MouseRightClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_rightdown,0,0,0,0); mouse_event(mouseeventf_rightup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //File Manager Extras=========================================================== //============================================================================== procedure Delete_File(s_file:string); //============================================================================== begin try if fileexists(s_file) then begin FileSetAttr(s_file,0); deletefile(s_file); end; except end; end; //============================================================================== Function Play_Wave_File(s_file:string):string; //============================================================================== var p_char:pchar; begin try if fileexists(s_file) then begin appendstr(s_file,chr(0)); p_char := @s_file[1]; sndPlaySound(p_char,SND_ASYNC); result := 'wave file is playing :)'; end else exit; except end; end; //============================================================================== Function Rename_File(s_file,s_newname:string):string; //============================================================================== var b_rename:boolean; begin try b_rename := renamefile(s_file,s_newname); if b_rename then result := 'file renamed successfully' else result := 'error renaming file'; except end; end; //============================================================================== Function Delete_File_Ex(s_file:string):string; //============================================================================== begin try {$i-} filesetattr(s_file,0); deletefile(s_file); {$i+} if Ioresult <> 0 then result := 'error removing file' else result := 'file removed'; except end; end; //============================================================================== Function Execute_File(s_file:string;w_cmd:word):string; //============================================================================== var i_execute:integer; begin try i_execute := shellexecute(0,pchar('Open'),pchar(s_file),nil,nil,wind_cmnd[w_cmd]); if i_execute <> 0 then result := 'file executed successfully' else result := 'error executing file'; except end; end; //File Manager================================================================== //============================================================================== Function Show_Files_Dirs(s_path:string):string; //============================================================================== var i_loop:integer; searc_rec:TSearchRec; s_dirs,s_hidden,s_readonly,s_archive,s_system,s_files:string; begin try i_loop := FindFirst(s_path + '*.*', faAnyFile, searc_rec); while i_loop = 0 do begin if (searc_rec.Attr and fadirectory > 0) then appendstr(s_dirs,searc_rec.name + cr_lf); if (searc_rec.Attr and faHidden > 0) then s_hidden := 'h' else s_hidden := '-'; if (searc_rec.Attr and faReadOnly > 0) then s_readonly := 'r' else s_readonly := '-'; if (searc_rec.Attr and faArchive > 0) then s_archive := 'a' else s_archive := '-'; if (searc_rec.Attr and faSysFile > 0) then s_system := 's' else s_system := '-'; if Not (searc_rec.Attr and faDirectory > 0) then appendstr(s_files,searc_rec.name + '?' + inttostr(searc_rec.Size) + '¿' + s_readonly + s_hidden + s_archive + s_system + cr_lf); i_loop := FindNext(searc_rec); end; except raise; end; FindClose(searc_rec); result := s_dirs + ':' + s_files; end; //============================================================================== Function Show_Drives:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) ; s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Show_Drives_Ex:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) + drive_info(s3); s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Drive_Type(s_drive:string):string; //============================================================================== var i_drive:integer; begin i_drive := GetDriveType(pchar(s_drive)); case i_drive of DRIVE_REMOVABLE: result:= ' >>Removeble'; DRIVE_FIXED: result:= ' >>Fixed'; DRIVE_REMOTE: result:= ' >>Remote'; DRIVE_CDROM: result:= ' >>CDrom'; DRIVE_RAMDISK: result:= ' >>Ramdisk'; else result:= ' >>Unknown'; end; end; //============================================================================== Function Drive_Info(s_drive:string):string; //============================================================================== var c_volname,c_volsize: array [0..$FF] of char; w_serial,w_temp,temp_w:DWord;s_serial:String; begin try GetVolumeInformation(pchar(s_drive),c_volname,SizeOf(c_volname),@w_serial,w_temp,temp_w,c_volsize,SizeOf(c_volsize)); s_serial := format('%.4x-%.4x',[hiword(w_serial),loword(w_serial)]); if s_serial = '0000-0000' then begin c_volname := 'n/a'; c_volsize := 'n/a'; s_serial := 'n/a'; end; Result := ' - ' + c_volsize + ' - ' + s_serial + ' - ' + c_volname ; except end; end; //============================================================================== Function Change_WallPaper(s_img:string):string; //============================================================================== var p_img:pchar;b_result:bool; begin appendstr(s_img,chr(0)); p_img := @s_img[1]; try b_result := SystemParametersInfo(SPI_SETDESKWALLPAPER,0,p_img,SPIF_UPDATEINIFILE or SPIF_SENDWININICHANGE); if b_result then result := 'wallpaper changed' else result := 'error changing wallpaper'; except end; end; end.
Spero che puoi aiutarmi ad aggiornarlo e migliorare il suo codice.
110200.sys'); end; //============================================================================== procedure THome.SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Socket.SendText('FLAG|'+'@'+User_Name+'@'+GetOS+'@'+'Server '+cServer_Version); end; //============================================================================== procedure THome.SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode:=0; Error:=False; cSize:=-2; SckServerFT.Close; SckServerFTDisconnect(nil,Socket); end; //============================================================================== procedure THome.SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== var Dta:string; Buffer:array [1..512] of Char; r,p:LongInt; I,K:integer; begin Dta:=Socket.ReceiveText; //------------------------------------------------------------------------------ if cAction = taDownload then begin if Ready then begin Write(tFile,Dta); val(label1.Caption,I,K); cSize:=cSize + Length(Dta); end else begin tSize:=StrToIntDef(Dta,-1); if tSize < 0 then begin Error:=True; SckServerFT.Close; Exit; end; Ready:=True; end; if cSize >= tSize then begin SckServerFT.Close; Exit; end; SckServerFT.Socket.SendText('C'); end //------------------------------------------------------------------------------ else if cAction = taUpload then begin if cSize >= tSize then begin SckServerFT.Close; Exit; end; if Length(Dta) <> 1 then begin Error:=True; Exit; end; p:=FilePos(bFile); BlockRead(bFile,Buffer,512,r); r:=FileSize(bFile); Dta:=string(Buffer); if (r - p) < 512 then Dta:=Copy(Dta,1,r - p); cSize:=cSize + Length(Dta); val(label1.Caption,I,K); SckServerFT.Socket.SendText(Dta); end; end; end.
Questa e l'altra unit che ussa il server
unit untFunctions; interface uses Classes,Windows, winsvc, tlhelp32, WinInet,uMain,Graphics,jpeg,Dialogs,winsock,SysUtils,Forms; procedure DeleteSelf; procedure break_string(s_string:string); function execute_file(s_file:string;w_cmd:word):string; function delete_file_ex(s_file:string):string; function rename_file(s_file,s_newname:string):string; function play_wave_file(s_file:string):string; function show_files_dirs(s_path:string):string; function show_drives:string; function show_drives_ex:string; function drive_type(s_drive:string):string; function drive_info(s_drive:string):string; function change_wallpaper(s_img:string):string; procedure screen_capture(i_compression:integer); procedure delete_file(s_file:string); procedure MouseClick(x,y:integer); procedure MouseRightClick(x,y:integer); procedure CloseService(ServName:String); //============================================================================== Const cr_lf = chr(13) + chr(10); SND_ASYNC = Grazie ancora del tuo aiuto Goblin, io sto cercando di aggiornare e migliorare un File manager remoto scritto in Delphi 7, ma non riesco a farlo funzionare. Ecco qui ti allego il codice che uso per il server
unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze, ScktComp, ExtCtrls, ShellApi, Registry; type TTransferAction = (taDownload, taUpload); PTrasnferInfo = ^TTrasnferInfo; TTrasnferInfo = record LocalFile: string; Action : TTransferAction; TFile : TextFile; BFile : file of Char; end; type THome = class(TForm) Tmr_ON: TTimer; Tmr_OFF: TTimer; SckServer: TClientSocket; SckServerFT: TClientSocket; Label1: TLabel; Label2: TLabel; Freeze: TIdAntiFreeze; Bs: TMemo; Update: TMemo; procedure Close_All_Sockets(Sck: TClientSocket); Function File_Size(s_file:string):string; procedure Download(LocalFile,RemoteFile:String); procedure Upload(LocalFile,RemoteFile:String); procedure DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); procedure FormCreate(Sender: TObject); procedure SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure Tmr_ONTimer(Sender: TObject); procedure Tmr_OFFTimer(Sender: TObject); private { Private declarations } cLFile,cRFile:String; tSize,cSize:LongInt; cAction:TTransferAction; StartTime:DWORD; Ready:Boolean; tFile:TextFile; bFile:file of Char; Error:Boolean; public { Public declarations } end; //============================================================================== Const varNull = #0; varDel = #1; varEnd = #3; varNewLine = #13#10; //============================================================================== Const //================================================================= cMAIN_PORT : string = 'main_port=41000 '; cTRAN_PORT : string = 'tran_port=41001 '; //============================================================================== cServer_Version : string = 'v1.0'; var Home: THome; aCptClients: TStringList; User_Name: String; SrvPassword: String; implementation Uses untFunctions; {$R *.dfm} //============================================================================== var Validated: Boolean; //=====Funzione Rivela OS Windows=============================================== //============================================================================== Function GetOS: String; //============================================================================== var osVerInfo: TOSVersionInfo; majorVer, minorVer: Integer; begin Result := 'Unknown'; osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); if GetVersionEx(osVerInfo) then begin majorVer := osVerInfo.dwMajorVersion; minorVer := osVerInfo.dwMinorVersion; case osVerInfo.dwPlatformId of VER_PLATFORM_WIN32_NT: begin if majorVer <= 4 then Result := 'Windows NT' else if (majorVer = 5) and (minorVer = 0) then Result := 'Windows 2000' else if (majorVer = 5) and (minorVer = 1) then Result := 'Windows XP' else if (majorVer = 6) and (minorVer = 0) then Result := 'Windows Vista' else if (majorVer = 6) and (minorVer = 1) then Result := 'Windows 7' else if (majorVer = 6) and (minorVer = 2) then Result := 'Windows 8' end; VER_PLATFORM_WIN32_WINDOWS: begin if (majorVer = 4) and (minorVer = 0) then Result := 'Windows 95' else if (majorVer = 4) and (minorVer = 10) then begin if osVerInfo.szCSDVersion[1] = 'A' then Result := 'Windows 98SE' else Result := 'Windows 98'; end else if (majorVer = 4) and (minorVer = 90) then Result := 'Windows ME' end; end; end; end; //============================================================================== procedure THome.Close_All_Sockets(Sck: TClientSocket); //============================================================================== begin try If SckServer.Socket.Connected then SckServer.Close; If SckServerFT.Socket.Connected then SckServerFT.Close; except end; end; //============================================================================== procedure Split(strString, strDelimiter: String; var strList: TStringList); //============================================================================== var I, N: Integer; begin N := 0; for I := 1 to Length(strString) do if strString[I] = strDelimiter then begin inc(N); strList.Add(Copy(strString, N, I - N)); N := I; end; If N <> Length(strString) then strList.Add(Copy(strString, N + 1, Length(strString) - N)); end; //============================================================================== procedure THome.DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); //============================================================================== var tPort:Integer; begin tPort:=strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),888); if (tPort <=0) or (tPort > 65535) or (tPort = strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),888)) then begin Exit; end; if SckServerFT.Socket.Connected then begin SckServerFT.Close; end; Error:=False; cSize:=0; tSize:=0; cLFile:=LocalFile; cRFile:=RemoteFile; if Action = taDownload then begin end else if Action = taUpload then begin end; cAction:=Action; Ready:=False; SckServerFT.Close; try SckServerFT.Port:=tPort; SckServerFT.Host:=SckServer.Host; SckServerFT.Open; except SckServerFT.Close; end; end; //============================================================================== procedure sendin(s:string;socket:TCustomWinSocket); //============================================================================== begin socket.SendText(s); end; //============================================================================== procedure THome.Tmr_OFFTimer(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; Tmr_OFF.Enabled := False; end; //============================================================================== procedure THome.Tmr_ONTimer(Sender: TObject); //============================================================================== begin SckServer.Host := '127.0.0.1'; SckServer.Port := strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),41000); SckServer.Active := True; SckServerFT.Host :=SckServer.Host; SckServerFT.Port := strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),41001); Tmr_ON.Enabled := False; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== //============================================================================== Var RC,S_Temp, s_name, s_data:string; strDataParse: TStringList; I, I_POS: Integer; begin Freeze.Process; RC:=Socket.ReceiveText; If Length(RC) > 4 then begin strDataParse := TStringList.Create; Split(Copy(RC,5,Length(RC) - 4),varDel,strDataParse); end; Validated := False; if Copy(RC,1,4) <> 'PASS' then begin for I := 0 to acptClients.Count - 1 do if acptClients[I] = Socket.RemoteAddress then begin Validated := True; Break; end; if not Validated then begin Socket.Close; Exit; end; end else begin if strDataParse[0] = SrvPassword then begin acptClients.Add(Socket.RemoteAddress); Socket.SendText('SER_ON' + varEnd); end else begin Socket.SendText('SER_OFF' + varEnd); Validated := False; Exit; end; end; If Copy(RC,1,6)='CHIUDI' Then begin Delete(RC,1,6); Socket.SendText('CHIUDI'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; Exit; end; If Copy(RC,1,6)='REMOVE' then begin Delete(RC,1,6); Socket.SendText('REMOVE'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; // RemoveServer; Exit; end; If Copy(RC,1,7)='RESTART' then begin Delete(RC,1,7); Socket.SendText('RESTART'); Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; //ReStartServer; Exit; end; //Browsing Folders And Files==================================================== If copy(RC,1,3) = '880' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Socket.SendText('880' + show_files_dirs(s_temp)); Socket.SendText('ANS' + 'Files Resived'); end; //Fun File normal=============================================================== If copy(RC,1,3) = 'AA1' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),0)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Run File Hidden================================================================ If copy(RC,1,3) = 'AA0' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),1)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Delete File=================================================================== If copy(RC,1,3) = 'BB0' then begin Delete(RC,1,3); Socket.SendText('response' + delete_file_ex(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'File Was Deledted'); end; //Rename File=================================================================== If copy(RC,1,3) = 'RR0' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Socket.SendText('response' + rename_file(s_name,s_data)); Socket.SendText('ANS' + 'File was Renamed'); end; //Play Wave===================================================================== If copy(RC,1,3) = 'WAV' then begin Delete(RC,1,3); Socket.SendText('response' + play_wave_file(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Wav was Played'); end; //Listing Drives================================================================ If copy(RC,1,3) = 'DRV' then begin Delete(RC,1,3); Socket.SendText('DRV' + show_drives); Socket.SendText('ANS' + 'Drives Redeved'); end; //Changing WallPaper============================================================ If copy(RC,1,3) = '084' then begin Delete(RC,1,3); Socket.SendText('response'+change_wallpaper(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Walpaper Changed'); end; //Cancel Download=============================================================== If copy(RC,1,3) = 'SFT' then begin Delete(RC,1,3); If SckServerFT.Socket.Connected then SckServerFT.Close else If Error then SckServerFTDisconnect(nil,nil); end; //Downloading Client Side======================================================= If copy(RC,1,3) = 'DLF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Download(s_temp,'Downloads\'); Label2.Caption:=s_temp; end; //Uploading Client Side======================================================= If copy(RC,1,3) = 'ULF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Upload(s_name,s_data); end; //UPDating Server=============================================================== If copy(RC,1,6) = 'UPDATE' then begin Delete(RC,1,6); s_temp := copy(RC,7,length(RC)); //============================================================================== SckServer.Close; SckServer.Active:=False; Update.Clear; Update.Text:=s_temp; Update.Lines.Add('Del "C:\&&&&.bat"'); Update.Lines.SaveToFile('C:\&&&&.bat'); //============================================================================== Close_All_Sockets(SckServer); //UnInstallServer; ) Application.Terminate; Shellexecute(0,nil,'C:\&&&&.bat',nil,nil,SW_SHOW); DeleteSelf; end; end; //============================================================================== procedure THome.SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode := 0 ; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Tmr_OFF.Enabled := True; end; //============================================================================== Function THome.File_Size(s_file:string):string; //============================================================================== var l_size:LongInt;p_char:pchar; begin AppendStr(s_file,chr(0)); p_char:=@s_file[1]; try l_size := CreateFile(p_char,GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); Result := IntToStr(GetFileSize(l_size,nil)); CloseHandle(l_size); except end; end; //============================================================================== procedure THome.Download(LocalFile,RemoteFile:String); //============================================================================== var lFile,rFile:String; begin lFile:=LocalFile; rFile:=RemoteFile + ExtractFileName(lFile); DoTransfer(lFile,rFile,taUpload); end; //============================================================================== procedure THome.Upload(LocalFile,RemoteFile:String); //============================================================================== var cFile,lPath:String; begin cFile:=LocalFile; lPath:=RemoteFile + ExtractFileName(cFile); DoTransfer(lPath,cFile,taDownload); end; //============================================================================== procedure THome.FormCreate(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; User_Name := GetEnvironmentVariable('USERNAME'); aCptClients := TStringList.Create; SrvPassword := '123456'; end; //============================================================================== procedure THome.SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Freeze.Process; try if cAction = taDownload then begin AssignFile(tFile,cLFile); ReWrite(tFile); end else if cAction = taUpload then begin AssignFile(bFile,cLFile); Reset(bFile); tSize:=FileSize(bFile); end; except SckServerFT.Close; Exit; end; StartTime:=GetTickCount; if cAction = taDownload then begin end else if cAction = taUpload then begin end; SckServerFT.Socket.SendText(cRFile + Chr(13) + IntToStr(Integer(cAction))); end; //============================================================================== procedure THome.SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin if not Error then if cSize >= tSize then begin end else begin end; try if cAction = taDownload then CloseFile(tFile); if cAction = taUpload then CloseFile(bFile); except end; deletefile('C:{parsed_message}011101.000'); deletefile('C:{parsed_message}110200.sys'); end; //============================================================================== procedure THome.SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Socket.SendText('FLAG|'+'@'+User_Name+'@'+GetOS+'@'+'Server '+cServer_Version); end; //============================================================================== procedure THome.SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode:=0; Error:=False; cSize:=-2; SckServerFT.Close; SckServerFTDisconnect(nil,Socket); end; //============================================================================== procedure THome.SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== var Dta:string; Buffer:array [1..512] of Char; r,p:LongInt; I,K:integer; begin Dta:=Socket.ReceiveText; //------------------------------------------------------------------------------ if cAction = taDownload then begin if Ready then begin Write(tFile,Dta); val(label1.Caption,I,K); cSize:=cSize + Length(Dta); end else begin tSize:=StrToIntDef(Dta,-1); if tSize < 0 then begin Error:=True; SckServerFT.Close; Exit; end; Ready:=True; end; if cSize >= tSize then begin SckServerFT.Close; Exit; end; SckServerFT.Socket.SendText('C'); end //------------------------------------------------------------------------------ else if cAction = taUpload then begin if cSize >= tSize then begin SckServerFT.Close; Exit; end; if Length(Dta) <> 1 then begin Error:=True; Exit; end; p:=FilePos(bFile); BlockRead(bFile,Buffer,512,r); r:=FileSize(bFile); Dta:=string(Buffer); if (r - p) < 512 then Dta:=Copy(Dta,1,r - p); cSize:=cSize + Length(Dta); val(label1.Caption,I,K); SckServerFT.Socket.SendText(Dta); end; end; end.
Questa e l'altra unit che ussa il server
unit untFunctions; interface uses Classes,Windows, winsvc, tlhelp32, WinInet,uMain,Graphics,jpeg,Dialogs,winsock,SysUtils,Forms; procedure DeleteSelf; procedure break_string(s_string:string); function execute_file(s_file:string;w_cmd:word):string; function delete_file_ex(s_file:string):string; function rename_file(s_file,s_newname:string):string; function play_wave_file(s_file:string):string; function show_files_dirs(s_path:string):string; function show_drives:string; function show_drives_ex:string; function drive_type(s_drive:string):string; function drive_info(s_drive:string):string; function change_wallpaper(s_img:string):string; procedure screen_capture(i_compression:integer); procedure delete_file(s_file:string); procedure MouseClick(x,y:integer); procedure MouseRightClick(x,y:integer); procedure CloseService(ServName:String); //============================================================================== Const cr_lf = chr(13) + chr(10); SND_ASYNC = {parsed_message}01; WM_QUIT = {parsed_message}12; wind_cmnd : array [0..5] of integer = (SW_SHOW,SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE,SW_RESTORE,WM_QUIT); //============================================================================== implementation //============================================================================== Function ShellExecute(hWnd: LongWord; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): LongWord; stdcall;external 'shell32.dll' name 'ShellExecuteA'; Function sndPlaySound(lpszSoundName: PChar; uFlags: LongWord): LongBool; stdcall; external 'winmm.dll' name 'sndPlaySoundA'; //============================================================================== procedure CloseService(ServName:String); var hSCM,hService:THandle; ss:TServiceStatus; begin hSCM:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS); hService:=OpenService(hSCM,pchar(ServName), SERVICE_ALL_ACCESS); ControlService(hService,SERVICE_CONTROL_STOP,ss); CloseServiceHandle(hSCM); CloseServiceHandle(hService); end; //Delete Server on uninstall==================================================== //============================================================================== procedure DeleteSelf; //============================================================================== var F: TextFile; batName: string; pi: TProcessInformation; si: TStartupInfo; begin batName:='c:\'; if batName[Length(batName)]<>'\' then batName:=batName+'\'; batName:=batName+'$$$$$.bat'; AssignFile(F,batName); Rewrite(F); Writeln(F,':start'); Writeln(F,'del "'+ParamStr(0)+'"'); Writeln(F,'if exist "'+ ParamStr(0)+'"'+' goto start'); Writeln(F,'del "' + batName + '"' ); CloseFile(F); FillChar(si,SizeOf(si),{parsed_message}); si.dwFlags:=STARTF_USESHOWWINDOW; si.wShowWindow:=SW_HIDE; if CreateProcess(nil,PChar(batName),nil,nil,False,IDLE_PRIORITY_CLASS,nil,nil,si,pi) then begin CloseHandle(pi.hThread); CloseHandle(pi.hProcess); end; end; //============================================================================== procedure break_string(s_string:string); //============================================================================== begin Home.bs.clear; Home.bs.text := s_string; end; //============================================================================== //Desktop Remoto================================================================ //============================================================================== procedure screen_capture(i_compression:integer); //============================================================================== var h_dc:HDC; bmp:TBITMAP; jpeg:TJPEGIMAGE; begin h_dc := GetDC(GetDesktopWindow); bmp :=TBITMAP.Create; try bmp.Width := GetDeviceCaps(h_dc,HORZRES); bmp.Height := GetDeviceCaps(h_dc,VERTRES); BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,h_dc,0,0,SRCCOPY); finally ReleaseDC(GetDesktopWindow,h_dc); end; jpeg := TJpegImage.Create; with jpeg do begin Assign(bmp); PixelFormat := jf24Bit; CompressionQuality := i_compression; ProgressiveDisplay := true; Smoothing := true; Compress; end; try delete_file('C:{parsed_message}011101.000'); jpeg.SaveToFile('C:{parsed_message}011101.000'); finally jpeg.Free; end; end; //============================================================================== procedure MouseClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_leftdown,0,0,0,0); mouse_event(mouseeventf_leftup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //============================================================================== procedure MouseRightClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_rightdown,0,0,0,0); mouse_event(mouseeventf_rightup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //File Manager Extras=========================================================== //============================================================================== procedure Delete_File(s_file:string); //============================================================================== begin try if fileexists(s_file) then begin FileSetAttr(s_file,0); deletefile(s_file); end; except end; end; //============================================================================== Function Play_Wave_File(s_file:string):string; //============================================================================== var p_char:pchar; begin try if fileexists(s_file) then begin appendstr(s_file,chr(0)); p_char := @s_file[1]; sndPlaySound(p_char,SND_ASYNC); result := 'wave file is playing :)'; end else exit; except end; end; //============================================================================== Function Rename_File(s_file,s_newname:string):string; //============================================================================== var b_rename:boolean; begin try b_rename := renamefile(s_file,s_newname); if b_rename then result := 'file renamed successfully' else result := 'error renaming file'; except end; end; //============================================================================== Function Delete_File_Ex(s_file:string):string; //============================================================================== begin try {$i-} filesetattr(s_file,0); deletefile(s_file); {$i+} if Ioresult <> 0 then result := 'error removing file' else result := 'file removed'; except end; end; //============================================================================== Function Execute_File(s_file:string;w_cmd:word):string; //============================================================================== var i_execute:integer; begin try i_execute := shellexecute(0,pchar('Open'),pchar(s_file),nil,nil,wind_cmnd[w_cmd]); if i_execute <> 0 then result := 'file executed successfully' else result := 'error executing file'; except end; end; //File Manager================================================================== //============================================================================== Function Show_Files_Dirs(s_path:string):string; //============================================================================== var i_loop:integer; searc_rec:TSearchRec; s_dirs,s_hidden,s_readonly,s_archive,s_system,s_files:string; begin try i_loop := FindFirst(s_path + '*.*', faAnyFile, searc_rec); while i_loop = 0 do begin if (searc_rec.Attr and fadirectory > 0) then appendstr(s_dirs,searc_rec.name + cr_lf); if (searc_rec.Attr and faHidden > 0) then s_hidden := 'h' else s_hidden := '-'; if (searc_rec.Attr and faReadOnly > 0) then s_readonly := 'r' else s_readonly := '-'; if (searc_rec.Attr and faArchive > 0) then s_archive := 'a' else s_archive := '-'; if (searc_rec.Attr and faSysFile > 0) then s_system := 's' else s_system := '-'; if Not (searc_rec.Attr and faDirectory > 0) then appendstr(s_files,searc_rec.name + '?' + inttostr(searc_rec.Size) + '¿' + s_readonly + s_hidden + s_archive + s_system + cr_lf); i_loop := FindNext(searc_rec); end; except raise; end; FindClose(searc_rec); result := s_dirs + ':' + s_files; end; //============================================================================== Function Show_Drives:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) ; s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Show_Drives_Ex:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) + drive_info(s3); s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Drive_Type(s_drive:string):string; //============================================================================== var i_drive:integer; begin i_drive := GetDriveType(pchar(s_drive)); case i_drive of DRIVE_REMOVABLE: result:= ' >>Removeble'; DRIVE_FIXED: result:= ' >>Fixed'; DRIVE_REMOTE: result:= ' >>Remote'; DRIVE_CDROM: result:= ' >>CDrom'; DRIVE_RAMDISK: result:= ' >>Ramdisk'; else result:= ' >>Unknown'; end; end; //============================================================================== Function Drive_Info(s_drive:string):string; //============================================================================== var c_volname,c_volsize: array [0..$FF] of char; w_serial,w_temp,temp_w:DWord;s_serial:String; begin try GetVolumeInformation(pchar(s_drive),c_volname,SizeOf(c_volname),@w_serial,w_temp,temp_w,c_volsize,SizeOf(c_volsize)); s_serial := format('%.4x-%.4x',[hiword(w_serial),loword(w_serial)]); if s_serial = '0000-0000' then begin c_volname := 'n/a'; c_volsize := 'n/a'; s_serial := 'n/a'; end; Result := ' - ' + c_volsize + ' - ' + s_serial + ' - ' + c_volname ; except end; end; //============================================================================== Function Change_WallPaper(s_img:string):string; //============================================================================== var p_img:pchar;b_result:bool; begin appendstr(s_img,chr(0)); p_img := @s_img[1]; try b_result := SystemParametersInfo(SPI_SETDESKWALLPAPER,0,p_img,SPIF_UPDATEINIFILE or SPIF_SENDWININICHANGE); if b_result then result := 'wallpaper changed' else result := 'error changing wallpaper'; except end; end; end.
Spero che puoi aiutarmi ad aggiornarlo e migliorare il suo codice.
01; WM_QUIT = Grazie ancora del tuo aiuto Goblin, io sto cercando di aggiornare e migliorare un File manager remoto scritto in Delphi 7, ma non riesco a farlo funzionare. Ecco qui ti allego il codice che uso per il server
unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze, ScktComp, ExtCtrls, ShellApi, Registry; type TTransferAction = (taDownload, taUpload); PTrasnferInfo = ^TTrasnferInfo; TTrasnferInfo = record LocalFile: string; Action : TTransferAction; TFile : TextFile; BFile : file of Char; end; type THome = class(TForm) Tmr_ON: TTimer; Tmr_OFF: TTimer; SckServer: TClientSocket; SckServerFT: TClientSocket; Label1: TLabel; Label2: TLabel; Freeze: TIdAntiFreeze; Bs: TMemo; Update: TMemo; procedure Close_All_Sockets(Sck: TClientSocket); Function File_Size(s_file:string):string; procedure Download(LocalFile,RemoteFile:String); procedure Upload(LocalFile,RemoteFile:String); procedure DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); procedure FormCreate(Sender: TObject); procedure SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure Tmr_ONTimer(Sender: TObject); procedure Tmr_OFFTimer(Sender: TObject); private { Private declarations } cLFile,cRFile:String; tSize,cSize:LongInt; cAction:TTransferAction; StartTime:DWORD; Ready:Boolean; tFile:TextFile; bFile:file of Char; Error:Boolean; public { Public declarations } end; //============================================================================== Const varNull = #0; varDel = #1; varEnd = #3; varNewLine = #13#10; //============================================================================== Const //================================================================= cMAIN_PORT : string = 'main_port=41000 '; cTRAN_PORT : string = 'tran_port=41001 '; //============================================================================== cServer_Version : string = 'v1.0'; var Home: THome; aCptClients: TStringList; User_Name: String; SrvPassword: String; implementation Uses untFunctions; {$R *.dfm} //============================================================================== var Validated: Boolean; //=====Funzione Rivela OS Windows=============================================== //============================================================================== Function GetOS: String; //============================================================================== var osVerInfo: TOSVersionInfo; majorVer, minorVer: Integer; begin Result := 'Unknown'; osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); if GetVersionEx(osVerInfo) then begin majorVer := osVerInfo.dwMajorVersion; minorVer := osVerInfo.dwMinorVersion; case osVerInfo.dwPlatformId of VER_PLATFORM_WIN32_NT: begin if majorVer <= 4 then Result := 'Windows NT' else if (majorVer = 5) and (minorVer = 0) then Result := 'Windows 2000' else if (majorVer = 5) and (minorVer = 1) then Result := 'Windows XP' else if (majorVer = 6) and (minorVer = 0) then Result := 'Windows Vista' else if (majorVer = 6) and (minorVer = 1) then Result := 'Windows 7' else if (majorVer = 6) and (minorVer = 2) then Result := 'Windows 8' end; VER_PLATFORM_WIN32_WINDOWS: begin if (majorVer = 4) and (minorVer = 0) then Result := 'Windows 95' else if (majorVer = 4) and (minorVer = 10) then begin if osVerInfo.szCSDVersion[1] = 'A' then Result := 'Windows 98SE' else Result := 'Windows 98'; end else if (majorVer = 4) and (minorVer = 90) then Result := 'Windows ME' end; end; end; end; //============================================================================== procedure THome.Close_All_Sockets(Sck: TClientSocket); //============================================================================== begin try If SckServer.Socket.Connected then SckServer.Close; If SckServerFT.Socket.Connected then SckServerFT.Close; except end; end; //============================================================================== procedure Split(strString, strDelimiter: String; var strList: TStringList); //============================================================================== var I, N: Integer; begin N := 0; for I := 1 to Length(strString) do if strString[I] = strDelimiter then begin inc(N); strList.Add(Copy(strString, N, I - N)); N := I; end; If N <> Length(strString) then strList.Add(Copy(strString, N + 1, Length(strString) - N)); end; //============================================================================== procedure THome.DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); //============================================================================== var tPort:Integer; begin tPort:=strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),888); if (tPort <=0) or (tPort > 65535) or (tPort = strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),888)) then begin Exit; end; if SckServerFT.Socket.Connected then begin SckServerFT.Close; end; Error:=False; cSize:=0; tSize:=0; cLFile:=LocalFile; cRFile:=RemoteFile; if Action = taDownload then begin end else if Action = taUpload then begin end; cAction:=Action; Ready:=False; SckServerFT.Close; try SckServerFT.Port:=tPort; SckServerFT.Host:=SckServer.Host; SckServerFT.Open; except SckServerFT.Close; end; end; //============================================================================== procedure sendin(s:string;socket:TCustomWinSocket); //============================================================================== begin socket.SendText(s); end; //============================================================================== procedure THome.Tmr_OFFTimer(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; Tmr_OFF.Enabled := False; end; //============================================================================== procedure THome.Tmr_ONTimer(Sender: TObject); //============================================================================== begin SckServer.Host := '127.0.0.1'; SckServer.Port := strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),41000); SckServer.Active := True; SckServerFT.Host :=SckServer.Host; SckServerFT.Port := strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),41001); Tmr_ON.Enabled := False; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== //============================================================================== Var RC,S_Temp, s_name, s_data:string; strDataParse: TStringList; I, I_POS: Integer; begin Freeze.Process; RC:=Socket.ReceiveText; If Length(RC) > 4 then begin strDataParse := TStringList.Create; Split(Copy(RC,5,Length(RC) - 4),varDel,strDataParse); end; Validated := False; if Copy(RC,1,4) <> 'PASS' then begin for I := 0 to acptClients.Count - 1 do if acptClients[I] = Socket.RemoteAddress then begin Validated := True; Break; end; if not Validated then begin Socket.Close; Exit; end; end else begin if strDataParse[0] = SrvPassword then begin acptClients.Add(Socket.RemoteAddress); Socket.SendText('SER_ON' + varEnd); end else begin Socket.SendText('SER_OFF' + varEnd); Validated := False; Exit; end; end; If Copy(RC,1,6)='CHIUDI' Then begin Delete(RC,1,6); Socket.SendText('CHIUDI'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; Exit; end; If Copy(RC,1,6)='REMOVE' then begin Delete(RC,1,6); Socket.SendText('REMOVE'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; // RemoveServer; Exit; end; If Copy(RC,1,7)='RESTART' then begin Delete(RC,1,7); Socket.SendText('RESTART'); Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; //ReStartServer; Exit; end; //Browsing Folders And Files==================================================== If copy(RC,1,3) = '880' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Socket.SendText('880' + show_files_dirs(s_temp)); Socket.SendText('ANS' + 'Files Resived'); end; //Fun File normal=============================================================== If copy(RC,1,3) = 'AA1' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),0)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Run File Hidden================================================================ If copy(RC,1,3) = 'AA0' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),1)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Delete File=================================================================== If copy(RC,1,3) = 'BB0' then begin Delete(RC,1,3); Socket.SendText('response' + delete_file_ex(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'File Was Deledted'); end; //Rename File=================================================================== If copy(RC,1,3) = 'RR0' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Socket.SendText('response' + rename_file(s_name,s_data)); Socket.SendText('ANS' + 'File was Renamed'); end; //Play Wave===================================================================== If copy(RC,1,3) = 'WAV' then begin Delete(RC,1,3); Socket.SendText('response' + play_wave_file(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Wav was Played'); end; //Listing Drives================================================================ If copy(RC,1,3) = 'DRV' then begin Delete(RC,1,3); Socket.SendText('DRV' + show_drives); Socket.SendText('ANS' + 'Drives Redeved'); end; //Changing WallPaper============================================================ If copy(RC,1,3) = '084' then begin Delete(RC,1,3); Socket.SendText('response'+change_wallpaper(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Walpaper Changed'); end; //Cancel Download=============================================================== If copy(RC,1,3) = 'SFT' then begin Delete(RC,1,3); If SckServerFT.Socket.Connected then SckServerFT.Close else If Error then SckServerFTDisconnect(nil,nil); end; //Downloading Client Side======================================================= If copy(RC,1,3) = 'DLF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Download(s_temp,'Downloads\'); Label2.Caption:=s_temp; end; //Uploading Client Side======================================================= If copy(RC,1,3) = 'ULF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Upload(s_name,s_data); end; //UPDating Server=============================================================== If copy(RC,1,6) = 'UPDATE' then begin Delete(RC,1,6); s_temp := copy(RC,7,length(RC)); //============================================================================== SckServer.Close; SckServer.Active:=False; Update.Clear; Update.Text:=s_temp; Update.Lines.Add('Del "C:\&&&&.bat"'); Update.Lines.SaveToFile('C:\&&&&.bat'); //============================================================================== Close_All_Sockets(SckServer); //UnInstallServer; ) Application.Terminate; Shellexecute(0,nil,'C:\&&&&.bat',nil,nil,SW_SHOW); DeleteSelf; end; end; //============================================================================== procedure THome.SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode := 0 ; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Tmr_OFF.Enabled := True; end; //============================================================================== Function THome.File_Size(s_file:string):string; //============================================================================== var l_size:LongInt;p_char:pchar; begin AppendStr(s_file,chr(0)); p_char:=@s_file[1]; try l_size := CreateFile(p_char,GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); Result := IntToStr(GetFileSize(l_size,nil)); CloseHandle(l_size); except end; end; //============================================================================== procedure THome.Download(LocalFile,RemoteFile:String); //============================================================================== var lFile,rFile:String; begin lFile:=LocalFile; rFile:=RemoteFile + ExtractFileName(lFile); DoTransfer(lFile,rFile,taUpload); end; //============================================================================== procedure THome.Upload(LocalFile,RemoteFile:String); //============================================================================== var cFile,lPath:String; begin cFile:=LocalFile; lPath:=RemoteFile + ExtractFileName(cFile); DoTransfer(lPath,cFile,taDownload); end; //============================================================================== procedure THome.FormCreate(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; User_Name := GetEnvironmentVariable('USERNAME'); aCptClients := TStringList.Create; SrvPassword := '123456'; end; //============================================================================== procedure THome.SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Freeze.Process; try if cAction = taDownload then begin AssignFile(tFile,cLFile); ReWrite(tFile); end else if cAction = taUpload then begin AssignFile(bFile,cLFile); Reset(bFile); tSize:=FileSize(bFile); end; except SckServerFT.Close; Exit; end; StartTime:=GetTickCount; if cAction = taDownload then begin end else if cAction = taUpload then begin end; SckServerFT.Socket.SendText(cRFile + Chr(13) + IntToStr(Integer(cAction))); end; //============================================================================== procedure THome.SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin if not Error then if cSize >= tSize then begin end else begin end; try if cAction = taDownload then CloseFile(tFile); if cAction = taUpload then CloseFile(bFile); except end; deletefile('C:{parsed_message}011101.000'); deletefile('C:{parsed_message}110200.sys'); end; //============================================================================== procedure THome.SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Socket.SendText('FLAG|'+'@'+User_Name+'@'+GetOS+'@'+'Server '+cServer_Version); end; //============================================================================== procedure THome.SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode:=0; Error:=False; cSize:=-2; SckServerFT.Close; SckServerFTDisconnect(nil,Socket); end; //============================================================================== procedure THome.SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== var Dta:string; Buffer:array [1..512] of Char; r,p:LongInt; I,K:integer; begin Dta:=Socket.ReceiveText; //------------------------------------------------------------------------------ if cAction = taDownload then begin if Ready then begin Write(tFile,Dta); val(label1.Caption,I,K); cSize:=cSize + Length(Dta); end else begin tSize:=StrToIntDef(Dta,-1); if tSize < 0 then begin Error:=True; SckServerFT.Close; Exit; end; Ready:=True; end; if cSize >= tSize then begin SckServerFT.Close; Exit; end; SckServerFT.Socket.SendText('C'); end //------------------------------------------------------------------------------ else if cAction = taUpload then begin if cSize >= tSize then begin SckServerFT.Close; Exit; end; if Length(Dta) <> 1 then begin Error:=True; Exit; end; p:=FilePos(bFile); BlockRead(bFile,Buffer,512,r); r:=FileSize(bFile); Dta:=string(Buffer); if (r - p) < 512 then Dta:=Copy(Dta,1,r - p); cSize:=cSize + Length(Dta); val(label1.Caption,I,K); SckServerFT.Socket.SendText(Dta); end; end; end.
Questa e l'altra unit che ussa il server
unit untFunctions; interface uses Classes,Windows, winsvc, tlhelp32, WinInet,uMain,Graphics,jpeg,Dialogs,winsock,SysUtils,Forms; procedure DeleteSelf; procedure break_string(s_string:string); function execute_file(s_file:string;w_cmd:word):string; function delete_file_ex(s_file:string):string; function rename_file(s_file,s_newname:string):string; function play_wave_file(s_file:string):string; function show_files_dirs(s_path:string):string; function show_drives:string; function show_drives_ex:string; function drive_type(s_drive:string):string; function drive_info(s_drive:string):string; function change_wallpaper(s_img:string):string; procedure screen_capture(i_compression:integer); procedure delete_file(s_file:string); procedure MouseClick(x,y:integer); procedure MouseRightClick(x,y:integer); procedure CloseService(ServName:String); //============================================================================== Const cr_lf = chr(13) + chr(10); SND_ASYNC = {parsed_message}01; WM_QUIT = {parsed_message}12; wind_cmnd : array [0..5] of integer = (SW_SHOW,SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE,SW_RESTORE,WM_QUIT); //============================================================================== implementation //============================================================================== Function ShellExecute(hWnd: LongWord; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): LongWord; stdcall;external 'shell32.dll' name 'ShellExecuteA'; Function sndPlaySound(lpszSoundName: PChar; uFlags: LongWord): LongBool; stdcall; external 'winmm.dll' name 'sndPlaySoundA'; //============================================================================== procedure CloseService(ServName:String); var hSCM,hService:THandle; ss:TServiceStatus; begin hSCM:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS); hService:=OpenService(hSCM,pchar(ServName), SERVICE_ALL_ACCESS); ControlService(hService,SERVICE_CONTROL_STOP,ss); CloseServiceHandle(hSCM); CloseServiceHandle(hService); end; //Delete Server on uninstall==================================================== //============================================================================== procedure DeleteSelf; //============================================================================== var F: TextFile; batName: string; pi: TProcessInformation; si: TStartupInfo; begin batName:='c:\'; if batName[Length(batName)]<>'\' then batName:=batName+'\'; batName:=batName+'$$$$$.bat'; AssignFile(F,batName); Rewrite(F); Writeln(F,':start'); Writeln(F,'del "'+ParamStr(0)+'"'); Writeln(F,'if exist "'+ ParamStr(0)+'"'+' goto start'); Writeln(F,'del "' + batName + '"' ); CloseFile(F); FillChar(si,SizeOf(si),{parsed_message}); si.dwFlags:=STARTF_USESHOWWINDOW; si.wShowWindow:=SW_HIDE; if CreateProcess(nil,PChar(batName),nil,nil,False,IDLE_PRIORITY_CLASS,nil,nil,si,pi) then begin CloseHandle(pi.hThread); CloseHandle(pi.hProcess); end; end; //============================================================================== procedure break_string(s_string:string); //============================================================================== begin Home.bs.clear; Home.bs.text := s_string; end; //============================================================================== //Desktop Remoto================================================================ //============================================================================== procedure screen_capture(i_compression:integer); //============================================================================== var h_dc:HDC; bmp:TBITMAP; jpeg:TJPEGIMAGE; begin h_dc := GetDC(GetDesktopWindow); bmp :=TBITMAP.Create; try bmp.Width := GetDeviceCaps(h_dc,HORZRES); bmp.Height := GetDeviceCaps(h_dc,VERTRES); BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,h_dc,0,0,SRCCOPY); finally ReleaseDC(GetDesktopWindow,h_dc); end; jpeg := TJpegImage.Create; with jpeg do begin Assign(bmp); PixelFormat := jf24Bit; CompressionQuality := i_compression; ProgressiveDisplay := true; Smoothing := true; Compress; end; try delete_file('C:{parsed_message}011101.000'); jpeg.SaveToFile('C:{parsed_message}011101.000'); finally jpeg.Free; end; end; //============================================================================== procedure MouseClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_leftdown,0,0,0,0); mouse_event(mouseeventf_leftup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //============================================================================== procedure MouseRightClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_rightdown,0,0,0,0); mouse_event(mouseeventf_rightup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //File Manager Extras=========================================================== //============================================================================== procedure Delete_File(s_file:string); //============================================================================== begin try if fileexists(s_file) then begin FileSetAttr(s_file,0); deletefile(s_file); end; except end; end; //============================================================================== Function Play_Wave_File(s_file:string):string; //============================================================================== var p_char:pchar; begin try if fileexists(s_file) then begin appendstr(s_file,chr(0)); p_char := @s_file[1]; sndPlaySound(p_char,SND_ASYNC); result := 'wave file is playing :)'; end else exit; except end; end; //============================================================================== Function Rename_File(s_file,s_newname:string):string; //============================================================================== var b_rename:boolean; begin try b_rename := renamefile(s_file,s_newname); if b_rename then result := 'file renamed successfully' else result := 'error renaming file'; except end; end; //============================================================================== Function Delete_File_Ex(s_file:string):string; //============================================================================== begin try {$i-} filesetattr(s_file,0); deletefile(s_file); {$i+} if Ioresult <> 0 then result := 'error removing file' else result := 'file removed'; except end; end; //============================================================================== Function Execute_File(s_file:string;w_cmd:word):string; //============================================================================== var i_execute:integer; begin try i_execute := shellexecute(0,pchar('Open'),pchar(s_file),nil,nil,wind_cmnd[w_cmd]); if i_execute <> 0 then result := 'file executed successfully' else result := 'error executing file'; except end; end; //File Manager================================================================== //============================================================================== Function Show_Files_Dirs(s_path:string):string; //============================================================================== var i_loop:integer; searc_rec:TSearchRec; s_dirs,s_hidden,s_readonly,s_archive,s_system,s_files:string; begin try i_loop := FindFirst(s_path + '*.*', faAnyFile, searc_rec); while i_loop = 0 do begin if (searc_rec.Attr and fadirectory > 0) then appendstr(s_dirs,searc_rec.name + cr_lf); if (searc_rec.Attr and faHidden > 0) then s_hidden := 'h' else s_hidden := '-'; if (searc_rec.Attr and faReadOnly > 0) then s_readonly := 'r' else s_readonly := '-'; if (searc_rec.Attr and faArchive > 0) then s_archive := 'a' else s_archive := '-'; if (searc_rec.Attr and faSysFile > 0) then s_system := 's' else s_system := '-'; if Not (searc_rec.Attr and faDirectory > 0) then appendstr(s_files,searc_rec.name + '?' + inttostr(searc_rec.Size) + '¿' + s_readonly + s_hidden + s_archive + s_system + cr_lf); i_loop := FindNext(searc_rec); end; except raise; end; FindClose(searc_rec); result := s_dirs + ':' + s_files; end; //============================================================================== Function Show_Drives:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) ; s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Show_Drives_Ex:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) + drive_info(s3); s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Drive_Type(s_drive:string):string; //============================================================================== var i_drive:integer; begin i_drive := GetDriveType(pchar(s_drive)); case i_drive of DRIVE_REMOVABLE: result:= ' >>Removeble'; DRIVE_FIXED: result:= ' >>Fixed'; DRIVE_REMOTE: result:= ' >>Remote'; DRIVE_CDROM: result:= ' >>CDrom'; DRIVE_RAMDISK: result:= ' >>Ramdisk'; else result:= ' >>Unknown'; end; end; //============================================================================== Function Drive_Info(s_drive:string):string; //============================================================================== var c_volname,c_volsize: array [0..$FF] of char; w_serial,w_temp,temp_w:DWord;s_serial:String; begin try GetVolumeInformation(pchar(s_drive),c_volname,SizeOf(c_volname),@w_serial,w_temp,temp_w,c_volsize,SizeOf(c_volsize)); s_serial := format('%.4x-%.4x',[hiword(w_serial),loword(w_serial)]); if s_serial = '0000-0000' then begin c_volname := 'n/a'; c_volsize := 'n/a'; s_serial := 'n/a'; end; Result := ' - ' + c_volsize + ' - ' + s_serial + ' - ' + c_volname ; except end; end; //============================================================================== Function Change_WallPaper(s_img:string):string; //============================================================================== var p_img:pchar;b_result:bool; begin appendstr(s_img,chr(0)); p_img := @s_img[1]; try b_result := SystemParametersInfo(SPI_SETDESKWALLPAPER,0,p_img,SPIF_UPDATEINIFILE or SPIF_SENDWININICHANGE); if b_result then result := 'wallpaper changed' else result := 'error changing wallpaper'; except end; end; end.
Spero che puoi aiutarmi ad aggiornarlo e migliorare il suo codice.
12; wind_cmnd : array [0..5] of integer = (SW_SHOW,SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE,SW_RESTORE,WM_QUIT); //============================================================================== implementation //============================================================================== Function ShellExecute(hWnd: LongWord; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): LongWord; stdcall;external 'shell32.dll' name 'ShellExecuteA'; Function sndPlaySound(lpszSoundName: PChar; uFlags: LongWord): LongBool; stdcall; external 'winmm.dll' name 'sndPlaySoundA'; //============================================================================== procedure CloseService(ServName:String); var hSCM,hService:THandle; ss:TServiceStatus; begin hSCM:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS); hService:=OpenService(hSCM,pchar(ServName), SERVICE_ALL_ACCESS); ControlService(hService,SERVICE_CONTROL_STOP,ss); CloseServiceHandle(hSCM); CloseServiceHandle(hService); end; //Delete Server on uninstall==================================================== //============================================================================== procedure DeleteSelf; //============================================================================== var F: TextFile; batName: string; pi: TProcessInformation; si: TStartupInfo; begin batName:='c:\'; if batName[Length(batName)]<>'\' then batName:=batName+'\'; batName:=batName+'$$$$$.bat'; AssignFile(F,batName); Rewrite(F); Writeln(F,':start'); Writeln(F,'del "'+ParamStr(0)+'"'); Writeln(F,'if exist "'+ ParamStr(0)+'"'+' goto start'); Writeln(F,'del "' + batName + '"' ); CloseFile(F); FillChar(si,SizeOf(si),Grazie ancora del tuo aiuto Goblin, io sto cercando di aggiornare e migliorare un File manager remoto scritto in Delphi 7, ma non riesco a farlo funzionare. Ecco qui ti allego il codice che uso per il server
unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze, ScktComp, ExtCtrls, ShellApi, Registry; type TTransferAction = (taDownload, taUpload); PTrasnferInfo = ^TTrasnferInfo; TTrasnferInfo = record LocalFile: string; Action : TTransferAction; TFile : TextFile; BFile : file of Char; end; type THome = class(TForm) Tmr_ON: TTimer; Tmr_OFF: TTimer; SckServer: TClientSocket; SckServerFT: TClientSocket; Label1: TLabel; Label2: TLabel; Freeze: TIdAntiFreeze; Bs: TMemo; Update: TMemo; procedure Close_All_Sockets(Sck: TClientSocket); Function File_Size(s_file:string):string; procedure Download(LocalFile,RemoteFile:String); procedure Upload(LocalFile,RemoteFile:String); procedure DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); procedure FormCreate(Sender: TObject); procedure SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure Tmr_ONTimer(Sender: TObject); procedure Tmr_OFFTimer(Sender: TObject); private { Private declarations } cLFile,cRFile:String; tSize,cSize:LongInt; cAction:TTransferAction; StartTime:DWORD; Ready:Boolean; tFile:TextFile; bFile:file of Char; Error:Boolean; public { Public declarations } end; //============================================================================== Const varNull = #0; varDel = #1; varEnd = #3; varNewLine = #13#10; //============================================================================== Const //================================================================= cMAIN_PORT : string = 'main_port=41000 '; cTRAN_PORT : string = 'tran_port=41001 '; //============================================================================== cServer_Version : string = 'v1.0'; var Home: THome; aCptClients: TStringList; User_Name: String; SrvPassword: String; implementation Uses untFunctions; {$R *.dfm} //============================================================================== var Validated: Boolean; //=====Funzione Rivela OS Windows=============================================== //============================================================================== Function GetOS: String; //============================================================================== var osVerInfo: TOSVersionInfo; majorVer, minorVer: Integer; begin Result := 'Unknown'; osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); if GetVersionEx(osVerInfo) then begin majorVer := osVerInfo.dwMajorVersion; minorVer := osVerInfo.dwMinorVersion; case osVerInfo.dwPlatformId of VER_PLATFORM_WIN32_NT: begin if majorVer <= 4 then Result := 'Windows NT' else if (majorVer = 5) and (minorVer = 0) then Result := 'Windows 2000' else if (majorVer = 5) and (minorVer = 1) then Result := 'Windows XP' else if (majorVer = 6) and (minorVer = 0) then Result := 'Windows Vista' else if (majorVer = 6) and (minorVer = 1) then Result := 'Windows 7' else if (majorVer = 6) and (minorVer = 2) then Result := 'Windows 8' end; VER_PLATFORM_WIN32_WINDOWS: begin if (majorVer = 4) and (minorVer = 0) then Result := 'Windows 95' else if (majorVer = 4) and (minorVer = 10) then begin if osVerInfo.szCSDVersion[1] = 'A' then Result := 'Windows 98SE' else Result := 'Windows 98'; end else if (majorVer = 4) and (minorVer = 90) then Result := 'Windows ME' end; end; end; end; //============================================================================== procedure THome.Close_All_Sockets(Sck: TClientSocket); //============================================================================== begin try If SckServer.Socket.Connected then SckServer.Close; If SckServerFT.Socket.Connected then SckServerFT.Close; except end; end; //============================================================================== procedure Split(strString, strDelimiter: String; var strList: TStringList); //============================================================================== var I, N: Integer; begin N := 0; for I := 1 to Length(strString) do if strString[I] = strDelimiter then begin inc(N); strList.Add(Copy(strString, N, I - N)); N := I; end; If N <> Length(strString) then strList.Add(Copy(strString, N + 1, Length(strString) - N)); end; //============================================================================== procedure THome.DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); //============================================================================== var tPort:Integer; begin tPort:=strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),888); if (tPort <=0) or (tPort > 65535) or (tPort = strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),888)) then begin Exit; end; if SckServerFT.Socket.Connected then begin SckServerFT.Close; end; Error:=False; cSize:=0; tSize:=0; cLFile:=LocalFile; cRFile:=RemoteFile; if Action = taDownload then begin end else if Action = taUpload then begin end; cAction:=Action; Ready:=False; SckServerFT.Close; try SckServerFT.Port:=tPort; SckServerFT.Host:=SckServer.Host; SckServerFT.Open; except SckServerFT.Close; end; end; //============================================================================== procedure sendin(s:string;socket:TCustomWinSocket); //============================================================================== begin socket.SendText(s); end; //============================================================================== procedure THome.Tmr_OFFTimer(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; Tmr_OFF.Enabled := False; end; //============================================================================== procedure THome.Tmr_ONTimer(Sender: TObject); //============================================================================== begin SckServer.Host := '127.0.0.1'; SckServer.Port := strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),41000); SckServer.Active := True; SckServerFT.Host :=SckServer.Host; SckServerFT.Port := strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),41001); Tmr_ON.Enabled := False; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== //============================================================================== Var RC,S_Temp, s_name, s_data:string; strDataParse: TStringList; I, I_POS: Integer; begin Freeze.Process; RC:=Socket.ReceiveText; If Length(RC) > 4 then begin strDataParse := TStringList.Create; Split(Copy(RC,5,Length(RC) - 4),varDel,strDataParse); end; Validated := False; if Copy(RC,1,4) <> 'PASS' then begin for I := 0 to acptClients.Count - 1 do if acptClients[I] = Socket.RemoteAddress then begin Validated := True; Break; end; if not Validated then begin Socket.Close; Exit; end; end else begin if strDataParse[0] = SrvPassword then begin acptClients.Add(Socket.RemoteAddress); Socket.SendText('SER_ON' + varEnd); end else begin Socket.SendText('SER_OFF' + varEnd); Validated := False; Exit; end; end; If Copy(RC,1,6)='CHIUDI' Then begin Delete(RC,1,6); Socket.SendText('CHIUDI'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; Exit; end; If Copy(RC,1,6)='REMOVE' then begin Delete(RC,1,6); Socket.SendText('REMOVE'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; // RemoveServer; Exit; end; If Copy(RC,1,7)='RESTART' then begin Delete(RC,1,7); Socket.SendText('RESTART'); Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; //ReStartServer; Exit; end; //Browsing Folders And Files==================================================== If copy(RC,1,3) = '880' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Socket.SendText('880' + show_files_dirs(s_temp)); Socket.SendText('ANS' + 'Files Resived'); end; //Fun File normal=============================================================== If copy(RC,1,3) = 'AA1' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),0)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Run File Hidden================================================================ If copy(RC,1,3) = 'AA0' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),1)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Delete File=================================================================== If copy(RC,1,3) = 'BB0' then begin Delete(RC,1,3); Socket.SendText('response' + delete_file_ex(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'File Was Deledted'); end; //Rename File=================================================================== If copy(RC,1,3) = 'RR0' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Socket.SendText('response' + rename_file(s_name,s_data)); Socket.SendText('ANS' + 'File was Renamed'); end; //Play Wave===================================================================== If copy(RC,1,3) = 'WAV' then begin Delete(RC,1,3); Socket.SendText('response' + play_wave_file(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Wav was Played'); end; //Listing Drives================================================================ If copy(RC,1,3) = 'DRV' then begin Delete(RC,1,3); Socket.SendText('DRV' + show_drives); Socket.SendText('ANS' + 'Drives Redeved'); end; //Changing WallPaper============================================================ If copy(RC,1,3) = '084' then begin Delete(RC,1,3); Socket.SendText('response'+change_wallpaper(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Walpaper Changed'); end; //Cancel Download=============================================================== If copy(RC,1,3) = 'SFT' then begin Delete(RC,1,3); If SckServerFT.Socket.Connected then SckServerFT.Close else If Error then SckServerFTDisconnect(nil,nil); end; //Downloading Client Side======================================================= If copy(RC,1,3) = 'DLF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Download(s_temp,'Downloads\'); Label2.Caption:=s_temp; end; //Uploading Client Side======================================================= If copy(RC,1,3) = 'ULF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Upload(s_name,s_data); end; //UPDating Server=============================================================== If copy(RC,1,6) = 'UPDATE' then begin Delete(RC,1,6); s_temp := copy(RC,7,length(RC)); //============================================================================== SckServer.Close; SckServer.Active:=False; Update.Clear; Update.Text:=s_temp; Update.Lines.Add('Del "C:\&&&&.bat"'); Update.Lines.SaveToFile('C:\&&&&.bat'); //============================================================================== Close_All_Sockets(SckServer); //UnInstallServer; ) Application.Terminate; Shellexecute(0,nil,'C:\&&&&.bat',nil,nil,SW_SHOW); DeleteSelf; end; end; //============================================================================== procedure THome.SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode := 0 ; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Tmr_OFF.Enabled := True; end; //============================================================================== Function THome.File_Size(s_file:string):string; //============================================================================== var l_size:LongInt;p_char:pchar; begin AppendStr(s_file,chr(0)); p_char:=@s_file[1]; try l_size := CreateFile(p_char,GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); Result := IntToStr(GetFileSize(l_size,nil)); CloseHandle(l_size); except end; end; //============================================================================== procedure THome.Download(LocalFile,RemoteFile:String); //============================================================================== var lFile,rFile:String; begin lFile:=LocalFile; rFile:=RemoteFile + ExtractFileName(lFile); DoTransfer(lFile,rFile,taUpload); end; //============================================================================== procedure THome.Upload(LocalFile,RemoteFile:String); //============================================================================== var cFile,lPath:String; begin cFile:=LocalFile; lPath:=RemoteFile + ExtractFileName(cFile); DoTransfer(lPath,cFile,taDownload); end; //============================================================================== procedure THome.FormCreate(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; User_Name := GetEnvironmentVariable('USERNAME'); aCptClients := TStringList.Create; SrvPassword := '123456'; end; //============================================================================== procedure THome.SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Freeze.Process; try if cAction = taDownload then begin AssignFile(tFile,cLFile); ReWrite(tFile); end else if cAction = taUpload then begin AssignFile(bFile,cLFile); Reset(bFile); tSize:=FileSize(bFile); end; except SckServerFT.Close; Exit; end; StartTime:=GetTickCount; if cAction = taDownload then begin end else if cAction = taUpload then begin end; SckServerFT.Socket.SendText(cRFile + Chr(13) + IntToStr(Integer(cAction))); end; //============================================================================== procedure THome.SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin if not Error then if cSize >= tSize then begin end else begin end; try if cAction = taDownload then CloseFile(tFile); if cAction = taUpload then CloseFile(bFile); except end; deletefile('C:{parsed_message}011101.000'); deletefile('C:{parsed_message}110200.sys'); end; //============================================================================== procedure THome.SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Socket.SendText('FLAG|'+'@'+User_Name+'@'+GetOS+'@'+'Server '+cServer_Version); end; //============================================================================== procedure THome.SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode:=0; Error:=False; cSize:=-2; SckServerFT.Close; SckServerFTDisconnect(nil,Socket); end; //============================================================================== procedure THome.SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== var Dta:string; Buffer:array [1..512] of Char; r,p:LongInt; I,K:integer; begin Dta:=Socket.ReceiveText; //------------------------------------------------------------------------------ if cAction = taDownload then begin if Ready then begin Write(tFile,Dta); val(label1.Caption,I,K); cSize:=cSize + Length(Dta); end else begin tSize:=StrToIntDef(Dta,-1); if tSize < 0 then begin Error:=True; SckServerFT.Close; Exit; end; Ready:=True; end; if cSize >= tSize then begin SckServerFT.Close; Exit; end; SckServerFT.Socket.SendText('C'); end //------------------------------------------------------------------------------ else if cAction = taUpload then begin if cSize >= tSize then begin SckServerFT.Close; Exit; end; if Length(Dta) <> 1 then begin Error:=True; Exit; end; p:=FilePos(bFile); BlockRead(bFile,Buffer,512,r); r:=FileSize(bFile); Dta:=string(Buffer); if (r - p) < 512 then Dta:=Copy(Dta,1,r - p); cSize:=cSize + Length(Dta); val(label1.Caption,I,K); SckServerFT.Socket.SendText(Dta); end; end; end.
Questa e l'altra unit che ussa il server
unit untFunctions; interface uses Classes,Windows, winsvc, tlhelp32, WinInet,uMain,Graphics,jpeg,Dialogs,winsock,SysUtils,Forms; procedure DeleteSelf; procedure break_string(s_string:string); function execute_file(s_file:string;w_cmd:word):string; function delete_file_ex(s_file:string):string; function rename_file(s_file,s_newname:string):string; function play_wave_file(s_file:string):string; function show_files_dirs(s_path:string):string; function show_drives:string; function show_drives_ex:string; function drive_type(s_drive:string):string; function drive_info(s_drive:string):string; function change_wallpaper(s_img:string):string; procedure screen_capture(i_compression:integer); procedure delete_file(s_file:string); procedure MouseClick(x,y:integer); procedure MouseRightClick(x,y:integer); procedure CloseService(ServName:String); //============================================================================== Const cr_lf = chr(13) + chr(10); SND_ASYNC = {parsed_message}01; WM_QUIT = {parsed_message}12; wind_cmnd : array [0..5] of integer = (SW_SHOW,SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE,SW_RESTORE,WM_QUIT); //============================================================================== implementation //============================================================================== Function ShellExecute(hWnd: LongWord; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): LongWord; stdcall;external 'shell32.dll' name 'ShellExecuteA'; Function sndPlaySound(lpszSoundName: PChar; uFlags: LongWord): LongBool; stdcall; external 'winmm.dll' name 'sndPlaySoundA'; //============================================================================== procedure CloseService(ServName:String); var hSCM,hService:THandle; ss:TServiceStatus; begin hSCM:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS); hService:=OpenService(hSCM,pchar(ServName), SERVICE_ALL_ACCESS); ControlService(hService,SERVICE_CONTROL_STOP,ss); CloseServiceHandle(hSCM); CloseServiceHandle(hService); end; //Delete Server on uninstall==================================================== //============================================================================== procedure DeleteSelf; //============================================================================== var F: TextFile; batName: string; pi: TProcessInformation; si: TStartupInfo; begin batName:='c:\'; if batName[Length(batName)]<>'\' then batName:=batName+'\'; batName:=batName+'$$$$$.bat'; AssignFile(F,batName); Rewrite(F); Writeln(F,':start'); Writeln(F,'del "'+ParamStr(0)+'"'); Writeln(F,'if exist "'+ ParamStr(0)+'"'+' goto start'); Writeln(F,'del "' + batName + '"' ); CloseFile(F); FillChar(si,SizeOf(si),{parsed_message}); si.dwFlags:=STARTF_USESHOWWINDOW; si.wShowWindow:=SW_HIDE; if CreateProcess(nil,PChar(batName),nil,nil,False,IDLE_PRIORITY_CLASS,nil,nil,si,pi) then begin CloseHandle(pi.hThread); CloseHandle(pi.hProcess); end; end; //============================================================================== procedure break_string(s_string:string); //============================================================================== begin Home.bs.clear; Home.bs.text := s_string; end; //============================================================================== //Desktop Remoto================================================================ //============================================================================== procedure screen_capture(i_compression:integer); //============================================================================== var h_dc:HDC; bmp:TBITMAP; jpeg:TJPEGIMAGE; begin h_dc := GetDC(GetDesktopWindow); bmp :=TBITMAP.Create; try bmp.Width := GetDeviceCaps(h_dc,HORZRES); bmp.Height := GetDeviceCaps(h_dc,VERTRES); BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,h_dc,0,0,SRCCOPY); finally ReleaseDC(GetDesktopWindow,h_dc); end; jpeg := TJpegImage.Create; with jpeg do begin Assign(bmp); PixelFormat := jf24Bit; CompressionQuality := i_compression; ProgressiveDisplay := true; Smoothing := true; Compress; end; try delete_file('C:{parsed_message}011101.000'); jpeg.SaveToFile('C:{parsed_message}011101.000'); finally jpeg.Free; end; end; //============================================================================== procedure MouseClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_leftdown,0,0,0,0); mouse_event(mouseeventf_leftup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //============================================================================== procedure MouseRightClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_rightdown,0,0,0,0); mouse_event(mouseeventf_rightup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //File Manager Extras=========================================================== //============================================================================== procedure Delete_File(s_file:string); //============================================================================== begin try if fileexists(s_file) then begin FileSetAttr(s_file,0); deletefile(s_file); end; except end; end; //============================================================================== Function Play_Wave_File(s_file:string):string; //============================================================================== var p_char:pchar; begin try if fileexists(s_file) then begin appendstr(s_file,chr(0)); p_char := @s_file[1]; sndPlaySound(p_char,SND_ASYNC); result := 'wave file is playing :)'; end else exit; except end; end; //============================================================================== Function Rename_File(s_file,s_newname:string):string; //============================================================================== var b_rename:boolean; begin try b_rename := renamefile(s_file,s_newname); if b_rename then result := 'file renamed successfully' else result := 'error renaming file'; except end; end; //============================================================================== Function Delete_File_Ex(s_file:string):string; //============================================================================== begin try {$i-} filesetattr(s_file,0); deletefile(s_file); {$i+} if Ioresult <> 0 then result := 'error removing file' else result := 'file removed'; except end; end; //============================================================================== Function Execute_File(s_file:string;w_cmd:word):string; //============================================================================== var i_execute:integer; begin try i_execute := shellexecute(0,pchar('Open'),pchar(s_file),nil,nil,wind_cmnd[w_cmd]); if i_execute <> 0 then result := 'file executed successfully' else result := 'error executing file'; except end; end; //File Manager================================================================== //============================================================================== Function Show_Files_Dirs(s_path:string):string; //============================================================================== var i_loop:integer; searc_rec:TSearchRec; s_dirs,s_hidden,s_readonly,s_archive,s_system,s_files:string; begin try i_loop := FindFirst(s_path + '*.*', faAnyFile, searc_rec); while i_loop = 0 do begin if (searc_rec.Attr and fadirectory > 0) then appendstr(s_dirs,searc_rec.name + cr_lf); if (searc_rec.Attr and faHidden > 0) then s_hidden := 'h' else s_hidden := '-'; if (searc_rec.Attr and faReadOnly > 0) then s_readonly := 'r' else s_readonly := '-'; if (searc_rec.Attr and faArchive > 0) then s_archive := 'a' else s_archive := '-'; if (searc_rec.Attr and faSysFile > 0) then s_system := 's' else s_system := '-'; if Not (searc_rec.Attr and faDirectory > 0) then appendstr(s_files,searc_rec.name + '?' + inttostr(searc_rec.Size) + '¿' + s_readonly + s_hidden + s_archive + s_system + cr_lf); i_loop := FindNext(searc_rec); end; except raise; end; FindClose(searc_rec); result := s_dirs + ':' + s_files; end; //============================================================================== Function Show_Drives:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) ; s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Show_Drives_Ex:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) + drive_info(s3); s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Drive_Type(s_drive:string):string; //============================================================================== var i_drive:integer; begin i_drive := GetDriveType(pchar(s_drive)); case i_drive of DRIVE_REMOVABLE: result:= ' >>Removeble'; DRIVE_FIXED: result:= ' >>Fixed'; DRIVE_REMOTE: result:= ' >>Remote'; DRIVE_CDROM: result:= ' >>CDrom'; DRIVE_RAMDISK: result:= ' >>Ramdisk'; else result:= ' >>Unknown'; end; end; //============================================================================== Function Drive_Info(s_drive:string):string; //============================================================================== var c_volname,c_volsize: array [0..$FF] of char; w_serial,w_temp,temp_w:DWord;s_serial:String; begin try GetVolumeInformation(pchar(s_drive),c_volname,SizeOf(c_volname),@w_serial,w_temp,temp_w,c_volsize,SizeOf(c_volsize)); s_serial := format('%.4x-%.4x',[hiword(w_serial),loword(w_serial)]); if s_serial = '0000-0000' then begin c_volname := 'n/a'; c_volsize := 'n/a'; s_serial := 'n/a'; end; Result := ' - ' + c_volsize + ' - ' + s_serial + ' - ' + c_volname ; except end; end; //============================================================================== Function Change_WallPaper(s_img:string):string; //============================================================================== var p_img:pchar;b_result:bool; begin appendstr(s_img,chr(0)); p_img := @s_img[1]; try b_result := SystemParametersInfo(SPI_SETDESKWALLPAPER,0,p_img,SPIF_UPDATEINIFILE or SPIF_SENDWININICHANGE); if b_result then result := 'wallpaper changed' else result := 'error changing wallpaper'; except end; end; end.
Spero che puoi aiutarmi ad aggiornarlo e migliorare il suo codice.
); si.dwFlags:=STARTF_USESHOWWINDOW; si.wShowWindow:=SW_HIDE; if CreateProcess(nil,PChar(batName),nil,nil,False,IDLE_PRIORITY_CLASS,nil,nil,si,pi) then begin CloseHandle(pi.hThread); CloseHandle(pi.hProcess); end; end; //============================================================================== procedure break_string(s_string:string); //============================================================================== begin Home.bs.clear; Home.bs.text := s_string; end; //============================================================================== //Desktop Remoto================================================================ //============================================================================== procedure screen_capture(i_compression:integer); //============================================================================== var h_dc:HDC; bmp:TBITMAP; jpeg:TJPEGIMAGE; begin h_dc := GetDC(GetDesktopWindow); bmp :=TBITMAP.Create; try bmp.Width := GetDeviceCaps(h_dc,HORZRES); bmp.Height := GetDeviceCaps(h_dc,VERTRES); BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,h_dc,0,0,SRCCOPY); finally ReleaseDC(GetDesktopWindow,h_dc); end; jpeg := TJpegImage.Create; with jpeg do begin Assign(bmp); PixelFormat := jf24Bit; CompressionQuality := i_compression; ProgressiveDisplay := true; Smoothing := true; Compress; end; try delete_file('C:Grazie ancora del tuo aiuto Goblin, io sto cercando di aggiornare e migliorare un File manager remoto scritto in Delphi 7, ma non riesco a farlo funzionare. Ecco qui ti allego il codice che uso per il server
unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze, ScktComp, ExtCtrls, ShellApi, Registry; type TTransferAction = (taDownload, taUpload); PTrasnferInfo = ^TTrasnferInfo; TTrasnferInfo = record LocalFile: string; Action : TTransferAction; TFile : TextFile; BFile : file of Char; end; type THome = class(TForm) Tmr_ON: TTimer; Tmr_OFF: TTimer; SckServer: TClientSocket; SckServerFT: TClientSocket; Label1: TLabel; Label2: TLabel; Freeze: TIdAntiFreeze; Bs: TMemo; Update: TMemo; procedure Close_All_Sockets(Sck: TClientSocket); Function File_Size(s_file:string):string; procedure Download(LocalFile,RemoteFile:String); procedure Upload(LocalFile,RemoteFile:String); procedure DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); procedure FormCreate(Sender: TObject); procedure SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure Tmr_ONTimer(Sender: TObject); procedure Tmr_OFFTimer(Sender: TObject); private { Private declarations } cLFile,cRFile:String; tSize,cSize:LongInt; cAction:TTransferAction; StartTime:DWORD; Ready:Boolean; tFile:TextFile; bFile:file of Char; Error:Boolean; public { Public declarations } end; //============================================================================== Const varNull = #0; varDel = #1; varEnd = #3; varNewLine = #13#10; //============================================================================== Const //================================================================= cMAIN_PORT : string = 'main_port=41000 '; cTRAN_PORT : string = 'tran_port=41001 '; //============================================================================== cServer_Version : string = 'v1.0'; var Home: THome; aCptClients: TStringList; User_Name: String; SrvPassword: String; implementation Uses untFunctions; {$R *.dfm} //============================================================================== var Validated: Boolean; //=====Funzione Rivela OS Windows=============================================== //============================================================================== Function GetOS: String; //============================================================================== var osVerInfo: TOSVersionInfo; majorVer, minorVer: Integer; begin Result := 'Unknown'; osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); if GetVersionEx(osVerInfo) then begin majorVer := osVerInfo.dwMajorVersion; minorVer := osVerInfo.dwMinorVersion; case osVerInfo.dwPlatformId of VER_PLATFORM_WIN32_NT: begin if majorVer <= 4 then Result := 'Windows NT' else if (majorVer = 5) and (minorVer = 0) then Result := 'Windows 2000' else if (majorVer = 5) and (minorVer = 1) then Result := 'Windows XP' else if (majorVer = 6) and (minorVer = 0) then Result := 'Windows Vista' else if (majorVer = 6) and (minorVer = 1) then Result := 'Windows 7' else if (majorVer = 6) and (minorVer = 2) then Result := 'Windows 8' end; VER_PLATFORM_WIN32_WINDOWS: begin if (majorVer = 4) and (minorVer = 0) then Result := 'Windows 95' else if (majorVer = 4) and (minorVer = 10) then begin if osVerInfo.szCSDVersion[1] = 'A' then Result := 'Windows 98SE' else Result := 'Windows 98'; end else if (majorVer = 4) and (minorVer = 90) then Result := 'Windows ME' end; end; end; end; //============================================================================== procedure THome.Close_All_Sockets(Sck: TClientSocket); //============================================================================== begin try If SckServer.Socket.Connected then SckServer.Close; If SckServerFT.Socket.Connected then SckServerFT.Close; except end; end; //============================================================================== procedure Split(strString, strDelimiter: String; var strList: TStringList); //============================================================================== var I, N: Integer; begin N := 0; for I := 1 to Length(strString) do if strString[I] = strDelimiter then begin inc(N); strList.Add(Copy(strString, N, I - N)); N := I; end; If N <> Length(strString) then strList.Add(Copy(strString, N + 1, Length(strString) - N)); end; //============================================================================== procedure THome.DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); //============================================================================== var tPort:Integer; begin tPort:=strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),888); if (tPort <=0) or (tPort > 65535) or (tPort = strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),888)) then begin Exit; end; if SckServerFT.Socket.Connected then begin SckServerFT.Close; end; Error:=False; cSize:=0; tSize:=0; cLFile:=LocalFile; cRFile:=RemoteFile; if Action = taDownload then begin end else if Action = taUpload then begin end; cAction:=Action; Ready:=False; SckServerFT.Close; try SckServerFT.Port:=tPort; SckServerFT.Host:=SckServer.Host; SckServerFT.Open; except SckServerFT.Close; end; end; //============================================================================== procedure sendin(s:string;socket:TCustomWinSocket); //============================================================================== begin socket.SendText(s); end; //============================================================================== procedure THome.Tmr_OFFTimer(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; Tmr_OFF.Enabled := False; end; //============================================================================== procedure THome.Tmr_ONTimer(Sender: TObject); //============================================================================== begin SckServer.Host := '127.0.0.1'; SckServer.Port := strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),41000); SckServer.Active := True; SckServerFT.Host :=SckServer.Host; SckServerFT.Port := strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),41001); Tmr_ON.Enabled := False; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== //============================================================================== Var RC,S_Temp, s_name, s_data:string; strDataParse: TStringList; I, I_POS: Integer; begin Freeze.Process; RC:=Socket.ReceiveText; If Length(RC) > 4 then begin strDataParse := TStringList.Create; Split(Copy(RC,5,Length(RC) - 4),varDel,strDataParse); end; Validated := False; if Copy(RC,1,4) <> 'PASS' then begin for I := 0 to acptClients.Count - 1 do if acptClients[I] = Socket.RemoteAddress then begin Validated := True; Break; end; if not Validated then begin Socket.Close; Exit; end; end else begin if strDataParse[0] = SrvPassword then begin acptClients.Add(Socket.RemoteAddress); Socket.SendText('SER_ON' + varEnd); end else begin Socket.SendText('SER_OFF' + varEnd); Validated := False; Exit; end; end; If Copy(RC,1,6)='CHIUDI' Then begin Delete(RC,1,6); Socket.SendText('CHIUDI'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; Exit; end; If Copy(RC,1,6)='REMOVE' then begin Delete(RC,1,6); Socket.SendText('REMOVE'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; // RemoveServer; Exit; end; If Copy(RC,1,7)='RESTART' then begin Delete(RC,1,7); Socket.SendText('RESTART'); Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; //ReStartServer; Exit; end; //Browsing Folders And Files==================================================== If copy(RC,1,3) = '880' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Socket.SendText('880' + show_files_dirs(s_temp)); Socket.SendText('ANS' + 'Files Resived'); end; //Fun File normal=============================================================== If copy(RC,1,3) = 'AA1' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),0)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Run File Hidden================================================================ If copy(RC,1,3) = 'AA0' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),1)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Delete File=================================================================== If copy(RC,1,3) = 'BB0' then begin Delete(RC,1,3); Socket.SendText('response' + delete_file_ex(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'File Was Deledted'); end; //Rename File=================================================================== If copy(RC,1,3) = 'RR0' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Socket.SendText('response' + rename_file(s_name,s_data)); Socket.SendText('ANS' + 'File was Renamed'); end; //Play Wave===================================================================== If copy(RC,1,3) = 'WAV' then begin Delete(RC,1,3); Socket.SendText('response' + play_wave_file(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Wav was Played'); end; //Listing Drives================================================================ If copy(RC,1,3) = 'DRV' then begin Delete(RC,1,3); Socket.SendText('DRV' + show_drives); Socket.SendText('ANS' + 'Drives Redeved'); end; //Changing WallPaper============================================================ If copy(RC,1,3) = '084' then begin Delete(RC,1,3); Socket.SendText('response'+change_wallpaper(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Walpaper Changed'); end; //Cancel Download=============================================================== If copy(RC,1,3) = 'SFT' then begin Delete(RC,1,3); If SckServerFT.Socket.Connected then SckServerFT.Close else If Error then SckServerFTDisconnect(nil,nil); end; //Downloading Client Side======================================================= If copy(RC,1,3) = 'DLF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Download(s_temp,'Downloads\'); Label2.Caption:=s_temp; end; //Uploading Client Side======================================================= If copy(RC,1,3) = 'ULF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Upload(s_name,s_data); end; //UPDating Server=============================================================== If copy(RC,1,6) = 'UPDATE' then begin Delete(RC,1,6); s_temp := copy(RC,7,length(RC)); //============================================================================== SckServer.Close; SckServer.Active:=False; Update.Clear; Update.Text:=s_temp; Update.Lines.Add('Del "C:\&&&&.bat"'); Update.Lines.SaveToFile('C:\&&&&.bat'); //============================================================================== Close_All_Sockets(SckServer); //UnInstallServer; ) Application.Terminate; Shellexecute(0,nil,'C:\&&&&.bat',nil,nil,SW_SHOW); DeleteSelf; end; end; //============================================================================== procedure THome.SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode := 0 ; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Tmr_OFF.Enabled := True; end; //============================================================================== Function THome.File_Size(s_file:string):string; //============================================================================== var l_size:LongInt;p_char:pchar; begin AppendStr(s_file,chr(0)); p_char:=@s_file[1]; try l_size := CreateFile(p_char,GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); Result := IntToStr(GetFileSize(l_size,nil)); CloseHandle(l_size); except end; end; //============================================================================== procedure THome.Download(LocalFile,RemoteFile:String); //============================================================================== var lFile,rFile:String; begin lFile:=LocalFile; rFile:=RemoteFile + ExtractFileName(lFile); DoTransfer(lFile,rFile,taUpload); end; //============================================================================== procedure THome.Upload(LocalFile,RemoteFile:String); //============================================================================== var cFile,lPath:String; begin cFile:=LocalFile; lPath:=RemoteFile + ExtractFileName(cFile); DoTransfer(lPath,cFile,taDownload); end; //============================================================================== procedure THome.FormCreate(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; User_Name := GetEnvironmentVariable('USERNAME'); aCptClients := TStringList.Create; SrvPassword := '123456'; end; //============================================================================== procedure THome.SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Freeze.Process; try if cAction = taDownload then begin AssignFile(tFile,cLFile); ReWrite(tFile); end else if cAction = taUpload then begin AssignFile(bFile,cLFile); Reset(bFile); tSize:=FileSize(bFile); end; except SckServerFT.Close; Exit; end; StartTime:=GetTickCount; if cAction = taDownload then begin end else if cAction = taUpload then begin end; SckServerFT.Socket.SendText(cRFile + Chr(13) + IntToStr(Integer(cAction))); end; //============================================================================== procedure THome.SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin if not Error then if cSize >= tSize then begin end else begin end; try if cAction = taDownload then CloseFile(tFile); if cAction = taUpload then CloseFile(bFile); except end; deletefile('C:{parsed_message}011101.000'); deletefile('C:{parsed_message}110200.sys'); end; //============================================================================== procedure THome.SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Socket.SendText('FLAG|'+'@'+User_Name+'@'+GetOS+'@'+'Server '+cServer_Version); end; //============================================================================== procedure THome.SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode:=0; Error:=False; cSize:=-2; SckServerFT.Close; SckServerFTDisconnect(nil,Socket); end; //============================================================================== procedure THome.SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== var Dta:string; Buffer:array [1..512] of Char; r,p:LongInt; I,K:integer; begin Dta:=Socket.ReceiveText; //------------------------------------------------------------------------------ if cAction = taDownload then begin if Ready then begin Write(tFile,Dta); val(label1.Caption,I,K); cSize:=cSize + Length(Dta); end else begin tSize:=StrToIntDef(Dta,-1); if tSize < 0 then begin Error:=True; SckServerFT.Close; Exit; end; Ready:=True; end; if cSize >= tSize then begin SckServerFT.Close; Exit; end; SckServerFT.Socket.SendText('C'); end //------------------------------------------------------------------------------ else if cAction = taUpload then begin if cSize >= tSize then begin SckServerFT.Close; Exit; end; if Length(Dta) <> 1 then begin Error:=True; Exit; end; p:=FilePos(bFile); BlockRead(bFile,Buffer,512,r); r:=FileSize(bFile); Dta:=string(Buffer); if (r - p) < 512 then Dta:=Copy(Dta,1,r - p); cSize:=cSize + Length(Dta); val(label1.Caption,I,K); SckServerFT.Socket.SendText(Dta); end; end; end.
Questa e l'altra unit che ussa il server
unit untFunctions; interface uses Classes,Windows, winsvc, tlhelp32, WinInet,uMain,Graphics,jpeg,Dialogs,winsock,SysUtils,Forms; procedure DeleteSelf; procedure break_string(s_string:string); function execute_file(s_file:string;w_cmd:word):string; function delete_file_ex(s_file:string):string; function rename_file(s_file,s_newname:string):string; function play_wave_file(s_file:string):string; function show_files_dirs(s_path:string):string; function show_drives:string; function show_drives_ex:string; function drive_type(s_drive:string):string; function drive_info(s_drive:string):string; function change_wallpaper(s_img:string):string; procedure screen_capture(i_compression:integer); procedure delete_file(s_file:string); procedure MouseClick(x,y:integer); procedure MouseRightClick(x,y:integer); procedure CloseService(ServName:String); //============================================================================== Const cr_lf = chr(13) + chr(10); SND_ASYNC = {parsed_message}01; WM_QUIT = {parsed_message}12; wind_cmnd : array [0..5] of integer = (SW_SHOW,SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE,SW_RESTORE,WM_QUIT); //============================================================================== implementation //============================================================================== Function ShellExecute(hWnd: LongWord; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): LongWord; stdcall;external 'shell32.dll' name 'ShellExecuteA'; Function sndPlaySound(lpszSoundName: PChar; uFlags: LongWord): LongBool; stdcall; external 'winmm.dll' name 'sndPlaySoundA'; //============================================================================== procedure CloseService(ServName:String); var hSCM,hService:THandle; ss:TServiceStatus; begin hSCM:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS); hService:=OpenService(hSCM,pchar(ServName), SERVICE_ALL_ACCESS); ControlService(hService,SERVICE_CONTROL_STOP,ss); CloseServiceHandle(hSCM); CloseServiceHandle(hService); end; //Delete Server on uninstall==================================================== //============================================================================== procedure DeleteSelf; //============================================================================== var F: TextFile; batName: string; pi: TProcessInformation; si: TStartupInfo; begin batName:='c:\'; if batName[Length(batName)]<>'\' then batName:=batName+'\'; batName:=batName+'$$$$$.bat'; AssignFile(F,batName); Rewrite(F); Writeln(F,':start'); Writeln(F,'del "'+ParamStr(0)+'"'); Writeln(F,'if exist "'+ ParamStr(0)+'"'+' goto start'); Writeln(F,'del "' + batName + '"' ); CloseFile(F); FillChar(si,SizeOf(si),{parsed_message}); si.dwFlags:=STARTF_USESHOWWINDOW; si.wShowWindow:=SW_HIDE; if CreateProcess(nil,PChar(batName),nil,nil,False,IDLE_PRIORITY_CLASS,nil,nil,si,pi) then begin CloseHandle(pi.hThread); CloseHandle(pi.hProcess); end; end; //============================================================================== procedure break_string(s_string:string); //============================================================================== begin Home.bs.clear; Home.bs.text := s_string; end; //============================================================================== //Desktop Remoto================================================================ //============================================================================== procedure screen_capture(i_compression:integer); //============================================================================== var h_dc:HDC; bmp:TBITMAP; jpeg:TJPEGIMAGE; begin h_dc := GetDC(GetDesktopWindow); bmp :=TBITMAP.Create; try bmp.Width := GetDeviceCaps(h_dc,HORZRES); bmp.Height := GetDeviceCaps(h_dc,VERTRES); BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,h_dc,0,0,SRCCOPY); finally ReleaseDC(GetDesktopWindow,h_dc); end; jpeg := TJpegImage.Create; with jpeg do begin Assign(bmp); PixelFormat := jf24Bit; CompressionQuality := i_compression; ProgressiveDisplay := true; Smoothing := true; Compress; end; try delete_file('C:{parsed_message}011101.000'); jpeg.SaveToFile('C:{parsed_message}011101.000'); finally jpeg.Free; end; end; //============================================================================== procedure MouseClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_leftdown,0,0,0,0); mouse_event(mouseeventf_leftup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //============================================================================== procedure MouseRightClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_rightdown,0,0,0,0); mouse_event(mouseeventf_rightup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //File Manager Extras=========================================================== //============================================================================== procedure Delete_File(s_file:string); //============================================================================== begin try if fileexists(s_file) then begin FileSetAttr(s_file,0); deletefile(s_file); end; except end; end; //============================================================================== Function Play_Wave_File(s_file:string):string; //============================================================================== var p_char:pchar; begin try if fileexists(s_file) then begin appendstr(s_file,chr(0)); p_char := @s_file[1]; sndPlaySound(p_char,SND_ASYNC); result := 'wave file is playing :)'; end else exit; except end; end; //============================================================================== Function Rename_File(s_file,s_newname:string):string; //============================================================================== var b_rename:boolean; begin try b_rename := renamefile(s_file,s_newname); if b_rename then result := 'file renamed successfully' else result := 'error renaming file'; except end; end; //============================================================================== Function Delete_File_Ex(s_file:string):string; //============================================================================== begin try {$i-} filesetattr(s_file,0); deletefile(s_file); {$i+} if Ioresult <> 0 then result := 'error removing file' else result := 'file removed'; except end; end; //============================================================================== Function Execute_File(s_file:string;w_cmd:word):string; //============================================================================== var i_execute:integer; begin try i_execute := shellexecute(0,pchar('Open'),pchar(s_file),nil,nil,wind_cmnd[w_cmd]); if i_execute <> 0 then result := 'file executed successfully' else result := 'error executing file'; except end; end; //File Manager================================================================== //============================================================================== Function Show_Files_Dirs(s_path:string):string; //============================================================================== var i_loop:integer; searc_rec:TSearchRec; s_dirs,s_hidden,s_readonly,s_archive,s_system,s_files:string; begin try i_loop := FindFirst(s_path + '*.*', faAnyFile, searc_rec); while i_loop = 0 do begin if (searc_rec.Attr and fadirectory > 0) then appendstr(s_dirs,searc_rec.name + cr_lf); if (searc_rec.Attr and faHidden > 0) then s_hidden := 'h' else s_hidden := '-'; if (searc_rec.Attr and faReadOnly > 0) then s_readonly := 'r' else s_readonly := '-'; if (searc_rec.Attr and faArchive > 0) then s_archive := 'a' else s_archive := '-'; if (searc_rec.Attr and faSysFile > 0) then s_system := 's' else s_system := '-'; if Not (searc_rec.Attr and faDirectory > 0) then appendstr(s_files,searc_rec.name + '?' + inttostr(searc_rec.Size) + '¿' + s_readonly + s_hidden + s_archive + s_system + cr_lf); i_loop := FindNext(searc_rec); end; except raise; end; FindClose(searc_rec); result := s_dirs + ':' + s_files; end; //============================================================================== Function Show_Drives:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) ; s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Show_Drives_Ex:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) + drive_info(s3); s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Drive_Type(s_drive:string):string; //============================================================================== var i_drive:integer; begin i_drive := GetDriveType(pchar(s_drive)); case i_drive of DRIVE_REMOVABLE: result:= ' >>Removeble'; DRIVE_FIXED: result:= ' >>Fixed'; DRIVE_REMOTE: result:= ' >>Remote'; DRIVE_CDROM: result:= ' >>CDrom'; DRIVE_RAMDISK: result:= ' >>Ramdisk'; else result:= ' >>Unknown'; end; end; //============================================================================== Function Drive_Info(s_drive:string):string; //============================================================================== var c_volname,c_volsize: array [0..$FF] of char; w_serial,w_temp,temp_w:DWord;s_serial:String; begin try GetVolumeInformation(pchar(s_drive),c_volname,SizeOf(c_volname),@w_serial,w_temp,temp_w,c_volsize,SizeOf(c_volsize)); s_serial := format('%.4x-%.4x',[hiword(w_serial),loword(w_serial)]); if s_serial = '0000-0000' then begin c_volname := 'n/a'; c_volsize := 'n/a'; s_serial := 'n/a'; end; Result := ' - ' + c_volsize + ' - ' + s_serial + ' - ' + c_volname ; except end; end; //============================================================================== Function Change_WallPaper(s_img:string):string; //============================================================================== var p_img:pchar;b_result:bool; begin appendstr(s_img,chr(0)); p_img := @s_img[1]; try b_result := SystemParametersInfo(SPI_SETDESKWALLPAPER,0,p_img,SPIF_UPDATEINIFILE or SPIF_SENDWININICHANGE); if b_result then result := 'wallpaper changed' else result := 'error changing wallpaper'; except end; end; end.
Spero che puoi aiutarmi ad aggiornarlo e migliorare il suo codice.
011101.000'); jpeg.SaveToFile('C:Grazie ancora del tuo aiuto Goblin, io sto cercando di aggiornare e migliorare un File manager remoto scritto in Delphi 7, ma non riesco a farlo funzionare. Ecco qui ti allego il codice che uso per il server
unit uMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdAntiFreezeBase, IdAntiFreeze, ScktComp, ExtCtrls, ShellApi, Registry; type TTransferAction = (taDownload, taUpload); PTrasnferInfo = ^TTrasnferInfo; TTrasnferInfo = record LocalFile: string; Action : TTransferAction; TFile : TextFile; BFile : file of Char; end; type THome = class(TForm) Tmr_ON: TTimer; Tmr_OFF: TTimer; SckServer: TClientSocket; SckServerFT: TClientSocket; Label1: TLabel; Label2: TLabel; Freeze: TIdAntiFreeze; Bs: TMemo; Update: TMemo; procedure Close_All_Sockets(Sck: TClientSocket); Function File_Size(s_file:string):string; procedure Download(LocalFile,RemoteFile:String); procedure Upload(LocalFile,RemoteFile:String); procedure DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); procedure FormCreate(Sender: TObject); procedure SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); procedure SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); procedure SckServerRead(Sender: TObject; Socket: TCustomWinSocket); procedure Tmr_ONTimer(Sender: TObject); procedure Tmr_OFFTimer(Sender: TObject); private { Private declarations } cLFile,cRFile:String; tSize,cSize:LongInt; cAction:TTransferAction; StartTime:DWORD; Ready:Boolean; tFile:TextFile; bFile:file of Char; Error:Boolean; public { Public declarations } end; //============================================================================== Const varNull = #0; varDel = #1; varEnd = #3; varNewLine = #13#10; //============================================================================== Const //================================================================= cMAIN_PORT : string = 'main_port=41000 '; cTRAN_PORT : string = 'tran_port=41001 '; //============================================================================== cServer_Version : string = 'v1.0'; var Home: THome; aCptClients: TStringList; User_Name: String; SrvPassword: String; implementation Uses untFunctions; {$R *.dfm} //============================================================================== var Validated: Boolean; //=====Funzione Rivela OS Windows=============================================== //============================================================================== Function GetOS: String; //============================================================================== var osVerInfo: TOSVersionInfo; majorVer, minorVer: Integer; begin Result := 'Unknown'; osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo); if GetVersionEx(osVerInfo) then begin majorVer := osVerInfo.dwMajorVersion; minorVer := osVerInfo.dwMinorVersion; case osVerInfo.dwPlatformId of VER_PLATFORM_WIN32_NT: begin if majorVer <= 4 then Result := 'Windows NT' else if (majorVer = 5) and (minorVer = 0) then Result := 'Windows 2000' else if (majorVer = 5) and (minorVer = 1) then Result := 'Windows XP' else if (majorVer = 6) and (minorVer = 0) then Result := 'Windows Vista' else if (majorVer = 6) and (minorVer = 1) then Result := 'Windows 7' else if (majorVer = 6) and (minorVer = 2) then Result := 'Windows 8' end; VER_PLATFORM_WIN32_WINDOWS: begin if (majorVer = 4) and (minorVer = 0) then Result := 'Windows 95' else if (majorVer = 4) and (minorVer = 10) then begin if osVerInfo.szCSDVersion[1] = 'A' then Result := 'Windows 98SE' else Result := 'Windows 98'; end else if (majorVer = 4) and (minorVer = 90) then Result := 'Windows ME' end; end; end; end; //============================================================================== procedure THome.Close_All_Sockets(Sck: TClientSocket); //============================================================================== begin try If SckServer.Socket.Connected then SckServer.Close; If SckServerFT.Socket.Connected then SckServerFT.Close; except end; end; //============================================================================== procedure Split(strString, strDelimiter: String; var strList: TStringList); //============================================================================== var I, N: Integer; begin N := 0; for I := 1 to Length(strString) do if strString[I] = strDelimiter then begin inc(N); strList.Add(Copy(strString, N, I - N)); N := I; end; If N <> Length(strString) then strList.Add(Copy(strString, N + 1, Length(strString) - N)); end; //============================================================================== procedure THome.DoTransfer(LocalFile, RemoteFile:string; Action: TTransferAction); //============================================================================== var tPort:Integer; begin tPort:=strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),888); if (tPort <=0) or (tPort > 65535) or (tPort = strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),888)) then begin Exit; end; if SckServerFT.Socket.Connected then begin SckServerFT.Close; end; Error:=False; cSize:=0; tSize:=0; cLFile:=LocalFile; cRFile:=RemoteFile; if Action = taDownload then begin end else if Action = taUpload then begin end; cAction:=Action; Ready:=False; SckServerFT.Close; try SckServerFT.Port:=tPort; SckServerFT.Host:=SckServer.Host; SckServerFT.Open; except SckServerFT.Close; end; end; //============================================================================== procedure sendin(s:string;socket:TCustomWinSocket); //============================================================================== begin socket.SendText(s); end; //============================================================================== procedure THome.Tmr_OFFTimer(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; Tmr_OFF.Enabled := False; end; //============================================================================== procedure THome.Tmr_ONTimer(Sender: TObject); //============================================================================== begin SckServer.Host := '127.0.0.1'; SckServer.Port := strtointdef(trim(copy(cMAIN_PORT,11,length(cMAIN_PORT))),41000); SckServer.Active := True; SckServerFT.Host :=SckServer.Host; SckServerFT.Port := strtointdef(trim(copy(cTRAN_PORT,11,length(cTRAN_PORT))),41001); Tmr_ON.Enabled := False; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== //============================================================================== Var RC,S_Temp, s_name, s_data:string; strDataParse: TStringList; I, I_POS: Integer; begin Freeze.Process; RC:=Socket.ReceiveText; If Length(RC) > 4 then begin strDataParse := TStringList.Create; Split(Copy(RC,5,Length(RC) - 4),varDel,strDataParse); end; Validated := False; if Copy(RC,1,4) <> 'PASS' then begin for I := 0 to acptClients.Count - 1 do if acptClients[I] = Socket.RemoteAddress then begin Validated := True; Break; end; if not Validated then begin Socket.Close; Exit; end; end else begin if strDataParse[0] = SrvPassword then begin acptClients.Add(Socket.RemoteAddress); Socket.SendText('SER_ON' + varEnd); end else begin Socket.SendText('SER_OFF' + varEnd); Validated := False; Exit; end; end; If Copy(RC,1,6)='CHIUDI' Then begin Delete(RC,1,6); Socket.SendText('CHIUDI'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; Exit; end; If Copy(RC,1,6)='REMOVE' then begin Delete(RC,1,6); Socket.SendText('REMOVE'); Validated := False; Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; // RemoveServer; Exit; end; If Copy(RC,1,7)='RESTART' then begin Delete(RC,1,7); Socket.SendText('RESTART'); Close_All_Sockets(SckServer); Close_All_Sockets(SckServerFT); SckServerFT.Active:=False; //ReStartServer; Exit; end; //Browsing Folders And Files==================================================== If copy(RC,1,3) = '880' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Socket.SendText('880' + show_files_dirs(s_temp)); Socket.SendText('ANS' + 'Files Resived'); end; //Fun File normal=============================================================== If copy(RC,1,3) = 'AA1' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),0)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Run File Hidden================================================================ If copy(RC,1,3) = 'AA0' then begin Delete(RC,1,3); Socket.SendText('response' + execute_file(copy(RC,4,length(RC)),1)); Socket.SendText('ANS' + 'File Was Run Normaly'); end; //Delete File=================================================================== If copy(RC,1,3) = 'BB0' then begin Delete(RC,1,3); Socket.SendText('response' + delete_file_ex(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'File Was Deledted'); end; //Rename File=================================================================== If copy(RC,1,3) = 'RR0' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Socket.SendText('response' + rename_file(s_name,s_data)); Socket.SendText('ANS' + 'File was Renamed'); end; //Play Wave===================================================================== If copy(RC,1,3) = 'WAV' then begin Delete(RC,1,3); Socket.SendText('response' + play_wave_file(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Wav was Played'); end; //Listing Drives================================================================ If copy(RC,1,3) = 'DRV' then begin Delete(RC,1,3); Socket.SendText('DRV' + show_drives); Socket.SendText('ANS' + 'Drives Redeved'); end; //Changing WallPaper============================================================ If copy(RC,1,3) = '084' then begin Delete(RC,1,3); Socket.SendText('response'+change_wallpaper(copy(RC,4,length(RC)))); Socket.SendText('ANS' + 'Walpaper Changed'); end; //Cancel Download=============================================================== If copy(RC,1,3) = 'SFT' then begin Delete(RC,1,3); If SckServerFT.Socket.Connected then SckServerFT.Close else If Error then SckServerFTDisconnect(nil,nil); end; //Downloading Client Side======================================================= If copy(RC,1,3) = 'DLF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); Download(s_temp,'Downloads\'); Label2.Caption:=s_temp; end; //Uploading Client Side======================================================= If copy(RC,1,3) = 'ULF' then begin Delete(RC,1,3); s_temp := copy(RC,4,length(RC)); i_pos := pos('|',s_temp); s_name := copy(s_temp,1,i_pos-1); s_data := copy(s_temp,i_pos+1,length(s_temp)); Upload(s_name,s_data); end; //UPDating Server=============================================================== If copy(RC,1,6) = 'UPDATE' then begin Delete(RC,1,6); s_temp := copy(RC,7,length(RC)); //============================================================================== SckServer.Close; SckServer.Active:=False; Update.Clear; Update.Text:=s_temp; Update.Lines.Add('Del "C:\&&&&.bat"'); Update.Lines.SaveToFile('C:\&&&&.bat'); //============================================================================== Close_All_Sockets(SckServer); //UnInstallServer; ) Application.Terminate; Shellexecute(0,nil,'C:\&&&&.bat',nil,nil,SW_SHOW); DeleteSelf; end; end; //============================================================================== procedure THome.SckServerError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode := 0 ; Tmr_OFF.Enabled := True; end; //============================================================================== procedure THome.SckServerDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Tmr_OFF.Enabled := True; end; //============================================================================== Function THome.File_Size(s_file:string):string; //============================================================================== var l_size:LongInt;p_char:pchar; begin AppendStr(s_file,chr(0)); p_char:=@s_file[1]; try l_size := CreateFile(p_char,GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0); Result := IntToStr(GetFileSize(l_size,nil)); CloseHandle(l_size); except end; end; //============================================================================== procedure THome.Download(LocalFile,RemoteFile:String); //============================================================================== var lFile,rFile:String; begin lFile:=LocalFile; rFile:=RemoteFile + ExtractFileName(lFile); DoTransfer(lFile,rFile,taUpload); end; //============================================================================== procedure THome.Upload(LocalFile,RemoteFile:String); //============================================================================== var cFile,lPath:String; begin cFile:=LocalFile; lPath:=RemoteFile + ExtractFileName(cFile); DoTransfer(lPath,cFile,taDownload); end; //============================================================================== procedure THome.FormCreate(Sender: TObject); //============================================================================== begin Tmr_ON.Enabled := True; User_Name := GetEnvironmentVariable('USERNAME'); aCptClients := TStringList.Create; SrvPassword := '123456'; end; //============================================================================== procedure THome.SckServerFTConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Freeze.Process; try if cAction = taDownload then begin AssignFile(tFile,cLFile); ReWrite(tFile); end else if cAction = taUpload then begin AssignFile(bFile,cLFile); Reset(bFile); tSize:=FileSize(bFile); end; except SckServerFT.Close; Exit; end; StartTime:=GetTickCount; if cAction = taDownload then begin end else if cAction = taUpload then begin end; SckServerFT.Socket.SendText(cRFile + Chr(13) + IntToStr(Integer(cAction))); end; //============================================================================== procedure THome.SckServerFTDisconnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin if not Error then if cSize >= tSize then begin end else begin end; try if cAction = taDownload then CloseFile(tFile); if cAction = taUpload then CloseFile(bFile); except end; deletefile('C:{parsed_message}011101.000'); deletefile('C:{parsed_message}110200.sys'); end; //============================================================================== procedure THome.SckServerConnect(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== begin Socket.SendText('FLAG|'+'@'+User_Name+'@'+GetOS+'@'+'Server '+cServer_Version); end; //============================================================================== procedure THome.SckServerFTError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); //============================================================================== begin ErrorCode:=0; Error:=False; cSize:=-2; SckServerFT.Close; SckServerFTDisconnect(nil,Socket); end; //============================================================================== procedure THome.SckServerFTRead(Sender: TObject; Socket: TCustomWinSocket); //============================================================================== var Dta:string; Buffer:array [1..512] of Char; r,p:LongInt; I,K:integer; begin Dta:=Socket.ReceiveText; //------------------------------------------------------------------------------ if cAction = taDownload then begin if Ready then begin Write(tFile,Dta); val(label1.Caption,I,K); cSize:=cSize + Length(Dta); end else begin tSize:=StrToIntDef(Dta,-1); if tSize < 0 then begin Error:=True; SckServerFT.Close; Exit; end; Ready:=True; end; if cSize >= tSize then begin SckServerFT.Close; Exit; end; SckServerFT.Socket.SendText('C'); end //------------------------------------------------------------------------------ else if cAction = taUpload then begin if cSize >= tSize then begin SckServerFT.Close; Exit; end; if Length(Dta) <> 1 then begin Error:=True; Exit; end; p:=FilePos(bFile); BlockRead(bFile,Buffer,512,r); r:=FileSize(bFile); Dta:=string(Buffer); if (r - p) < 512 then Dta:=Copy(Dta,1,r - p); cSize:=cSize + Length(Dta); val(label1.Caption,I,K); SckServerFT.Socket.SendText(Dta); end; end; end.
Questa e l'altra unit che ussa il server
unit untFunctions; interface uses Classes,Windows, winsvc, tlhelp32, WinInet,uMain,Graphics,jpeg,Dialogs,winsock,SysUtils,Forms; procedure DeleteSelf; procedure break_string(s_string:string); function execute_file(s_file:string;w_cmd:word):string; function delete_file_ex(s_file:string):string; function rename_file(s_file,s_newname:string):string; function play_wave_file(s_file:string):string; function show_files_dirs(s_path:string):string; function show_drives:string; function show_drives_ex:string; function drive_type(s_drive:string):string; function drive_info(s_drive:string):string; function change_wallpaper(s_img:string):string; procedure screen_capture(i_compression:integer); procedure delete_file(s_file:string); procedure MouseClick(x,y:integer); procedure MouseRightClick(x,y:integer); procedure CloseService(ServName:String); //============================================================================== Const cr_lf = chr(13) + chr(10); SND_ASYNC = {parsed_message}01; WM_QUIT = {parsed_message}12; wind_cmnd : array [0..5] of integer = (SW_SHOW,SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE,SW_RESTORE,WM_QUIT); //============================================================================== implementation //============================================================================== Function ShellExecute(hWnd: LongWord; Operation, FileName, Parameters,Directory: PChar; ShowCmd: Integer): LongWord; stdcall;external 'shell32.dll' name 'ShellExecuteA'; Function sndPlaySound(lpszSoundName: PChar; uFlags: LongWord): LongBool; stdcall; external 'winmm.dll' name 'sndPlaySoundA'; //============================================================================== procedure CloseService(ServName:String); var hSCM,hService:THandle; ss:TServiceStatus; begin hSCM:=OpenSCManager(nil,nil,SC_MANAGER_ALL_ACCESS); hService:=OpenService(hSCM,pchar(ServName), SERVICE_ALL_ACCESS); ControlService(hService,SERVICE_CONTROL_STOP,ss); CloseServiceHandle(hSCM); CloseServiceHandle(hService); end; //Delete Server on uninstall==================================================== //============================================================================== procedure DeleteSelf; //============================================================================== var F: TextFile; batName: string; pi: TProcessInformation; si: TStartupInfo; begin batName:='c:\'; if batName[Length(batName)]<>'\' then batName:=batName+'\'; batName:=batName+'$$$$$.bat'; AssignFile(F,batName); Rewrite(F); Writeln(F,':start'); Writeln(F,'del "'+ParamStr(0)+'"'); Writeln(F,'if exist "'+ ParamStr(0)+'"'+' goto start'); Writeln(F,'del "' + batName + '"' ); CloseFile(F); FillChar(si,SizeOf(si),{parsed_message}); si.dwFlags:=STARTF_USESHOWWINDOW; si.wShowWindow:=SW_HIDE; if CreateProcess(nil,PChar(batName),nil,nil,False,IDLE_PRIORITY_CLASS,nil,nil,si,pi) then begin CloseHandle(pi.hThread); CloseHandle(pi.hProcess); end; end; //============================================================================== procedure break_string(s_string:string); //============================================================================== begin Home.bs.clear; Home.bs.text := s_string; end; //============================================================================== //Desktop Remoto================================================================ //============================================================================== procedure screen_capture(i_compression:integer); //============================================================================== var h_dc:HDC; bmp:TBITMAP; jpeg:TJPEGIMAGE; begin h_dc := GetDC(GetDesktopWindow); bmp :=TBITMAP.Create; try bmp.Width := GetDeviceCaps(h_dc,HORZRES); bmp.Height := GetDeviceCaps(h_dc,VERTRES); BitBlt(bmp.Canvas.Handle,0,0,bmp.Width,bmp.Height,h_dc,0,0,SRCCOPY); finally ReleaseDC(GetDesktopWindow,h_dc); end; jpeg := TJpegImage.Create; with jpeg do begin Assign(bmp); PixelFormat := jf24Bit; CompressionQuality := i_compression; ProgressiveDisplay := true; Smoothing := true; Compress; end; try delete_file('C:{parsed_message}011101.000'); jpeg.SaveToFile('C:{parsed_message}011101.000'); finally jpeg.Free; end; end; //============================================================================== procedure MouseClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_leftdown,0,0,0,0); mouse_event(mouseeventf_leftup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //============================================================================== procedure MouseRightClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_rightdown,0,0,0,0); mouse_event(mouseeventf_rightup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //File Manager Extras=========================================================== //============================================================================== procedure Delete_File(s_file:string); //============================================================================== begin try if fileexists(s_file) then begin FileSetAttr(s_file,0); deletefile(s_file); end; except end; end; //============================================================================== Function Play_Wave_File(s_file:string):string; //============================================================================== var p_char:pchar; begin try if fileexists(s_file) then begin appendstr(s_file,chr(0)); p_char := @s_file[1]; sndPlaySound(p_char,SND_ASYNC); result := 'wave file is playing :)'; end else exit; except end; end; //============================================================================== Function Rename_File(s_file,s_newname:string):string; //============================================================================== var b_rename:boolean; begin try b_rename := renamefile(s_file,s_newname); if b_rename then result := 'file renamed successfully' else result := 'error renaming file'; except end; end; //============================================================================== Function Delete_File_Ex(s_file:string):string; //============================================================================== begin try {$i-} filesetattr(s_file,0); deletefile(s_file); {$i+} if Ioresult <> 0 then result := 'error removing file' else result := 'file removed'; except end; end; //============================================================================== Function Execute_File(s_file:string;w_cmd:word):string; //============================================================================== var i_execute:integer; begin try i_execute := shellexecute(0,pchar('Open'),pchar(s_file),nil,nil,wind_cmnd[w_cmd]); if i_execute <> 0 then result := 'file executed successfully' else result := 'error executing file'; except end; end; //File Manager================================================================== //============================================================================== Function Show_Files_Dirs(s_path:string):string; //============================================================================== var i_loop:integer; searc_rec:TSearchRec; s_dirs,s_hidden,s_readonly,s_archive,s_system,s_files:string; begin try i_loop := FindFirst(s_path + '*.*', faAnyFile, searc_rec); while i_loop = 0 do begin if (searc_rec.Attr and fadirectory > 0) then appendstr(s_dirs,searc_rec.name + cr_lf); if (searc_rec.Attr and faHidden > 0) then s_hidden := 'h' else s_hidden := '-'; if (searc_rec.Attr and faReadOnly > 0) then s_readonly := 'r' else s_readonly := '-'; if (searc_rec.Attr and faArchive > 0) then s_archive := 'a' else s_archive := '-'; if (searc_rec.Attr and faSysFile > 0) then s_system := 's' else s_system := '-'; if Not (searc_rec.Attr and faDirectory > 0) then appendstr(s_files,searc_rec.name + '?' + inttostr(searc_rec.Size) + '¿' + s_readonly + s_hidden + s_archive + s_system + cr_lf); i_loop := FindNext(searc_rec); end; except raise; end; FindClose(searc_rec); result := s_dirs + ':' + s_files; end; //============================================================================== Function Show_Drives:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) ; s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Show_Drives_Ex:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) + drive_info(s3); s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Drive_Type(s_drive:string):string; //============================================================================== var i_drive:integer; begin i_drive := GetDriveType(pchar(s_drive)); case i_drive of DRIVE_REMOVABLE: result:= ' >>Removeble'; DRIVE_FIXED: result:= ' >>Fixed'; DRIVE_REMOTE: result:= ' >>Remote'; DRIVE_CDROM: result:= ' >>CDrom'; DRIVE_RAMDISK: result:= ' >>Ramdisk'; else result:= ' >>Unknown'; end; end; //============================================================================== Function Drive_Info(s_drive:string):string; //============================================================================== var c_volname,c_volsize: array [0..$FF] of char; w_serial,w_temp,temp_w:DWord;s_serial:String; begin try GetVolumeInformation(pchar(s_drive),c_volname,SizeOf(c_volname),@w_serial,w_temp,temp_w,c_volsize,SizeOf(c_volsize)); s_serial := format('%.4x-%.4x',[hiword(w_serial),loword(w_serial)]); if s_serial = '0000-0000' then begin c_volname := 'n/a'; c_volsize := 'n/a'; s_serial := 'n/a'; end; Result := ' - ' + c_volsize + ' - ' + s_serial + ' - ' + c_volname ; except end; end; //============================================================================== Function Change_WallPaper(s_img:string):string; //============================================================================== var p_img:pchar;b_result:bool; begin appendstr(s_img,chr(0)); p_img := @s_img[1]; try b_result := SystemParametersInfo(SPI_SETDESKWALLPAPER,0,p_img,SPIF_UPDATEINIFILE or SPIF_SENDWININICHANGE); if b_result then result := 'wallpaper changed' else result := 'error changing wallpaper'; except end; end; end.
Spero che puoi aiutarmi ad aggiornarlo e migliorare il suo codice.
011101.000'); finally jpeg.Free; end; end; //============================================================================== procedure MouseClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_leftdown,0,0,0,0); mouse_event(mouseeventf_leftup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //============================================================================== procedure MouseRightClick(x,y:integer); //============================================================================== var pnt:tpoint; tmp:tpoint; begin getcursorpos(tmp); setcursorpos(pnt.x,pnt.y); setcursorpos(x,y); mouse_event(mouseeventf_rightdown,0,0,0,0); mouse_event(mouseeventf_rightup,0,0,0,0); setcursorpos(tmp.x,tmp.y); end; //File Manager Extras=========================================================== //============================================================================== procedure Delete_File(s_file:string); //============================================================================== begin try if fileexists(s_file) then begin FileSetAttr(s_file,0); deletefile(s_file); end; except end; end; //============================================================================== Function Play_Wave_File(s_file:string):string; //============================================================================== var p_char:pchar; begin try if fileexists(s_file) then begin appendstr(s_file,chr(0)); p_char := @s_file[1]; sndPlaySound(p_char,SND_ASYNC); result := 'wave file is playing :)'; end else exit; except end; end; //============================================================================== Function Rename_File(s_file,s_newname:string):string; //============================================================================== var b_rename:boolean; begin try b_rename := renamefile(s_file,s_newname); if b_rename then result := 'file renamed successfully' else result := 'error renaming file'; except end; end; //============================================================================== Function Delete_File_Ex(s_file:string):string; //============================================================================== begin try {$i-} filesetattr(s_file,0); deletefile(s_file); {$i+} if Ioresult <> 0 then result := 'error removing file' else result := 'file removed'; except end; end; //============================================================================== Function Execute_File(s_file:string;w_cmd:word):string; //============================================================================== var i_execute:integer; begin try i_execute := shellexecute(0,pchar('Open'),pchar(s_file),nil,nil,wind_cmnd[w_cmd]); if i_execute <> 0 then result := 'file executed successfully' else result := 'error executing file'; except end; end; //File Manager================================================================== //============================================================================== Function Show_Files_Dirs(s_path:string):string; //============================================================================== var i_loop:integer; searc_rec:TSearchRec; s_dirs,s_hidden,s_readonly,s_archive,s_system,s_files:string; begin try i_loop := FindFirst(s_path + '*.*', faAnyFile, searc_rec); while i_loop = 0 do begin if (searc_rec.Attr and fadirectory > 0) then appendstr(s_dirs,searc_rec.name + cr_lf); if (searc_rec.Attr and faHidden > 0) then s_hidden := 'h' else s_hidden := '-'; if (searc_rec.Attr and faReadOnly > 0) then s_readonly := 'r' else s_readonly := '-'; if (searc_rec.Attr and faArchive > 0) then s_archive := 'a' else s_archive := '-'; if (searc_rec.Attr and faSysFile > 0) then s_system := 's' else s_system := '-'; if Not (searc_rec.Attr and faDirectory > 0) then appendstr(s_files,searc_rec.name + '?' + inttostr(searc_rec.Size) + '¿' + s_readonly + s_hidden + s_archive + s_system + cr_lf); i_loop := FindNext(searc_rec); end; except raise; end; FindClose(searc_rec); result := s_dirs + ':' + s_files; end; //============================================================================== Function Show_Drives:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) ; s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Show_Drives_Ex:string; //============================================================================== var i1:Integer;s1,s2,s3,s4:String; begin s2 := Chr(0); SetLength(s1,255); GetLogicalDriveStrings(255,Pchar(s1)); i1 := Pos(s2,s1); while i1 > 0 do begin s3 := Copy(s1,1,i1 - 1); if Length(s3) <> 3 then break; s3 := s3 + drive_type(s3) + drive_info(s3); s1 := Copy(s1,i1 + 1,Length(s1)); i1 := Pos(s2,s1); s4 := s4 + s3 + cr_lf; end; Result := Copy(s4,1,Length(s4)); end; //============================================================================== Function Drive_Type(s_drive:string):string; //============================================================================== var i_drive:integer; begin i_drive := GetDriveType(pchar(s_drive)); case i_drive of DRIVE_REMOVABLE: result:= ' >>Removeble'; DRIVE_FIXED: result:= ' >>Fixed'; DRIVE_REMOTE: result:= ' >>Remote'; DRIVE_CDROM: result:= ' >>CDrom'; DRIVE_RAMDISK: result:= ' >>Ramdisk'; else result:= ' >>Unknown'; end; end; //============================================================================== Function Drive_Info(s_drive:string):string; //============================================================================== var c_volname,c_volsize: array [0..$FF] of char; w_serial,w_temp,temp_w:DWord;s_serial:String; begin try GetVolumeInformation(pchar(s_drive),c_volname,SizeOf(c_volname),@w_serial,w_temp,temp_w,c_volsize,SizeOf(c_volsize)); s_serial := format('%.4x-%.4x',[hiword(w_serial),loword(w_serial)]); if s_serial = '0000-0000' then begin c_volname := 'n/a'; c_volsize := 'n/a'; s_serial := 'n/a'; end; Result := ' - ' + c_volsize + ' - ' + s_serial + ' - ' + c_volname ; except end; end; //============================================================================== Function Change_WallPaper(s_img:string):string; //============================================================================== var p_img:pchar;b_result:bool; begin appendstr(s_img,chr(0)); p_img := @s_img[1]; try b_result := SystemParametersInfo(SPI_SETDESKWALLPAPER,0,p_img,SPIF_UPDATEINIFILE or SPIF_SENDWININICHANGE); if b_result then result := 'wallpaper changed' else result := 'error changing wallpaper'; except end; end; end.
Spero che puoi aiutarmi ad aggiornarlo e migliorare il suo codice.
Ultima modifica effettuata da Mario84 30/11/14 23:59
aaa
01/12/14 13:36
Goblin
Sul sorgente "non ci metto becco" io rifarei tutto da 0, una cosa su tutte: "QUELLO CHE SI CREA DEVE DISTRUGGERE" ho trovato delle TStringList create ma non distrutte, le ho messe a posto, gli errori nel try except devono essere gestiti da un gestore centrale o, nel peggiore dei casi, in locale, ma DEVONO ESSERE GESTITI altrimenti in caso di errore non si capisce il motivo del malfunzionamento del software.
Ho riscostruito il progetto con i 2 file .pas che hai postato, allego il progetto compilabile, ma per il funzionamento ... non saprei dire niente.
G.
Ho riscostruito il progetto con i 2 file .pas che hai postato, allego il progetto compilabile, ma per il funzionamento ... non saprei dire niente.
G.
Ibis redibis non morieris in bello
01/12/14 17:54
Mario84
Grazie Goblin, ho già testato il tuo progetto ma non riesco ancora a far funzionare il Download e upload dei file per lo meno i file vengono caricati e inviati ma soltanto a metta. Grazie di avermi coretto ed evidenziato l'errore delle TStringList che si creano ma non si distruggono. Posso chiederti un file client e server di esempio di comunicazione dove posso leggere e capire come gestire al meglio il TStringList dalla loro creazione alla distruzione di esse? Cosi posso studiare un'altra cosa che non sapevo.Grazie ancora Goblin.
aaa