Discussione Malware Uso del ShowMessage (Delphi XE)

mrcamarium

Utente Bronze
7 Gennaio 2022
68
16
1
26
Salve sto ceracndo di usare la funzione ShowMessage in remoto, ho cosi scritto il codice ma quando invio un msg non succede nulla.
Codice:
procedure TForm1.serverExecute(AThread: TIdContext);
var listaclient:tlist; i:integer;
    messaggioprelevato:string;
begin
 messaggioprelevato:=AThread.Connection.IOHandler.ReadLn;
 memo1.lines.add(messaggioprelevato);
 Listaclient := Server.Contexts.LockList;;
 try
  for i:=0 to connessi-1 do
   try
   TIdContext(Listaclient.Items[i]).Connection.IOHandler.WriteLn(messaggioprelevato);
   showmessage (messaggioprelevato);
   except
   end;
 finally
 end;
 Server.Contexts.UnlockList;
end;
 

JunkCoder

Moderatore
5 Giugno 2020
1,024
19
860
428
La logica del codice è un po' confusa. Questo codice sta nel client o nel server?
Quello che leggo:
  • Riceve messaggio dal socket
  • Lo scrive in una memo
  • Lo invia a tutta la lista dei client (?)
  • Chiama ShowMessage per ogni client a cui l'ha inviato
Se è il server da chi dovrebbe ricevere questo messaggio, e perché lo rimanda a tutti? Se è il client dovrebbe avere una connessione solo con il server, perché reinvia il messaggio ricevuto ad altri (con cui non dovrebbe essere connesso)?

A parte questo se il messaggio appare nella memo ma non viene mostrato mi viene da pensare che la WriteLn lanci un eccezione e salti il messaggio oppure che la listaclient è vuota. Infine la ShowMessage è bloccante finché non viene premuto OK, il che significa che la lista o comunque il thread resta bloccato fino ad allora.

Se questo è un client prova a fare:
Codice:
 messaggioprelevato:=AThread.Connection.IOHandler.ReadLn;
 memo1.lines.add(messaggioprelevato);
 showmessage (messaggioprelevato);

Ricordando appunto che non potrai ricevere nuovi messaggi finché non chiudi la messagebox e se passa troppo tempo l'endpoint lo considererà un timeout e chiuderà la connessione unilateralmente.
 

mrcamarium

Utente Bronze
7 Gennaio 2022
68
16
1
26
La logica del codice è un po' confusa. Questo codice sta nel client o nel server?
Quello che leggo:
  • Riceve messaggio dal socket
  • Lo scrive in una memo
  • Lo invia a tutta la lista dei client (?)
  • Chiama ShowMessage per ogni client a cui l'ha inviato
Se è il server da chi dovrebbe ricevere questo messaggio, e perché lo rimanda a tutti? Se è il client dovrebbe avere una connessione solo con il server, perché reinvia il messaggio ricevuto ad altri (con cui non dovrebbe essere connesso)?

A parte questo se il messaggio appare nella memo ma non viene mostrato mi viene da pensare che la WriteLn lanci un eccezione e salti il messaggio oppure che la listaclient è vuota. Infine la ShowMessage è bloccante finché non viene premuto OK, il che significa che la lista o comunque il thread resta bloccato fino ad allora.

Se questo è un client prova a fare:
Codice:
 messaggioprelevato:=AThread.Connection.IOHandler.ReadLn;
 memo1.lines.add(messaggioprelevato);
 showmessage (messaggioprelevato);

Ricordando appunto che non potrai ricevere nuovi messaggi finché non chiudi la messagebox e se passa troppo tempo l'endpoint lo considererà un timeout e chiuderà la connessione unilateralmente.
Questo è il server. Mettendo il showmessage sotto il memo1 fuinziona. questo codice lo devo ancora semplificare, ad esempio il memo non mi serve più.
Messaggio unito automaticamente:

Codice:
procedure TForm1.serverExecute(AThread: TIdContext);
var listaclient:tlist; i:integer;
    messaggioprelevato:string;
begin
 messaggioprelevato:=AThread.Connection.IOHandler.ReadLn;
 showmessage (messaggioprelevato);
 Listaclient := Server.Contexts.LockList;;
 try
  for i:=0 to connessi-1 do
   try
   TIdContext(Listaclient.Items[i]).Connection.IOHandler.WriteLn(messaggioprelevato);
   except
   end;
 finally
 end;
 Server.Contexts.UnlockList;
end;
Ecco il codice del server funzionante. Adesso devo solo modificare la voce sulla finestra showmessage con la parola info.