Newsgroup: it.comp.lang.delphi
Titolo: Consiglio sulla protezione

Ho la necessità di proteggere la mia applicazione in modo tale che 
possa essere eseguita una sola volta. 
Dopo essermi informato via Internet sulle possibili soluzioni,ho 
scoperto che fondamentalmente ve ne sono due:
- creare un file batch con il comando di cancellazione verso la mia
applicazione e quindi lanciarlo
- modificare il file eseguibile stesso in modo tale da bloccarlo quando
lo si rilancia una seconda volta
Avete altre idee su come risolvere questo problema?
Grazie, ciao
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

possa essere eseguita una sola volta. 
ciao
vi è un metodo molto più semplice ...
puoi usare la funzione FindWindow
che si scorre la lista delle finestre aperte 
(non è una questione di visibilità ma di istanza esistente)
e non solo quelle della tua applicazione ...
la funzione ritorna l'handle della finestra oppure 0
quindi se la tua form principale si chiama TFormPricipale
il codice sarà pressappoco così
begin
  if FindWindow('TFormPricipale',nil)=0 then
  beign
    Application.Initialize;
    Application.CreateForm(TFormPricipale,FormPricipale);
    Application.run;
  end;
end;
okkio che se la form è aperta a DesignTime
il FindWindow non è 0 ma ha l'handle della
form aperta a design da delphi ;)
	Ciao
	MassimoB
 

 possa essere eseguita una sola volta.
E' vero, ci sono un bel pò di soluzioni per far questo....
Dai un occhi a quello che segue. è semplice ed efficente...
Viene settato un mutex così, quando viene eseguita un'altra istanza
dell'applicazione viene generato un errore;
program ProvaMutex;
uses
  Forms,
  windows,
  dialogs,
  etc....,
  etc...;
{$R *.RES}
var hMutex: THandle;
begin
  hMutex:= createMutex(nil, true, 'ProvaMutex');
  if getLastError = ERROR_ALREADY_EXISTS then begin
     showmessage(' already running');
     HALT;
  end;
  Application.Initialize;
  .....
 ......
Application.Run;
  if hMutex <> 0 then closeHandle(hMutex);
end.
Questa potrebbe essere una soluzione,
  Ciao
  A.S.

Ciao,
potresti anche fare cosi':
1) l'istallazione istalla anche una falsa dll sotto la directory system (es. miadll.dll -
ovviamente il nome dovrebbe essere un po' piu' decente)
2) Il tuo programma controlla che la dll sia presente: se si la cancella e continua
l'esecuzione, altrimenti si chiude
Per proteggere ancora meglio in fase di istallazione controlli che il tuo programma sia
già stato istallato: se si abortisci l'istallazione, altrimenti procedi regolarmente
Ps. ovviamente questa è una tecnica semplice semplice ma funziona nel 90% dei casi
Bye,
David (
www.utilityweb.net
)

end.
nulla togliendo al codice scritto da Alessandro
si potrebbe lavorare anche in questa maniera con i Mutex
fermo restando il codice scritto da Alessandro prima di questa istruzione
hMutex:= createMutex(nil, FALSE, 'ProvaMutex');
If WaitForSingleObject(hMutex,0)<>Wait_TimeOut Then
begin
  //avvii l'applicazione
end else
begin
  //dai l'errore
end;
questo perchč voglio far vedere a Nicola Lugato 
che ho letto il suo tuttorial ;) postato su questo ng.
	Ciao
	MassimoB
 

 wrote in message
news:1VKua.104289$
DT4.3...@twister1.libero.it
Mi sono spiegato male    :(
La mia necessità non è creare un'applicazione monotask bensì creare 
un'applicazione che la si lancia una volta e basta! 
L'eseguibile della mia applicazione va quindi, dopo essere stato
eseguito, rimosso o ancor meglio "corrotto"!
Devo creare una specie di procedure "autodistruzione"  :)
Scusate se non sono stato chiaro.
Grazie


 wrote in message
news:b9fu0c$qk$
1...@rex.ip-plus.net
Non mi sono spiegato bene. Se hai pazienza ho riscritto il mio
problema in risposta a MassimoB.
Grazie comunque


Devo creare una specie di procedure "autodistruzione"  :)
ah, ok ...
non saprei non ho mai avuto questa necessità
di OneShot ... mi creerebbe dei problemi di 
lavoro assurdi con i miei clienti ... neanche ci voglio pensare 
;) ... ovviamente tu avrai le tue buone ragioni ...
	Ciao
	MassimoB
 

 Grazie, ciao
Prego.
-- 
Ciao, Anto', [35, 143, AQ] 
MB C SC 220 CDI Magma Red

possa essere eseguita una sola volta. 
Professionale, affidabile, opensource: TurboPower OnGuard.
http://sourceforge.net/projects/tponguard/
Guarda il componente TOgUsageCode.
-- 
Morde. 
morde[at]programmer[.]net

 eseguito, rimosso o ancor meglio "corrotto"!
Esistono diversi modi, più o meno eleganti per fa quello che chiedi.
La via più "grezza" è quella del file batch che provvede all' eliminazione.
C'è chi usa l'iniezione di codice in altri processi in modo che resti in
attesa che il processo termini per poi eliminarlo. La soluzione più elegante
è quella proposta da Nebbet che dovrebbe far uso dello stack come memoria
temporanea per il codice ed eseguirlo quando l' immagine del processo non è
più in memoria.
--
- Carlo -

 possa essere eseguita una sola volta. 
Dovresti spiegare meglio quello che vuoi fare, detto cosi' e' generico.
Ad esempio, se lo scopo e' quello di installare una patch, che so, 
modificare qualcosa ecc che deve essere fatto una volta sola, io 
utilizzo una chiave nel registro di sistema. Il programma verifica che 
non sia settata, fa quello che deve fare e poi la setta. Cosi' la 
prossima volta la trova settata e non fa piu' nulla, se vuoi avvisa.
Ma tutto dipende da quello che devi fare ... ad esempio se il programma 
ricarica un credito, allora non fare come ti ho detto io :)))
Ciao.Alberto.
-- 
Alberto Rubinelli - A2 SISTEMI               posted with Gravity 2.60b
Via Costantino Perazzi 22 - 28100 NOVARA (NO) - ITALY     ICQ 49872318
E-Mail : 
alb...@retrocomputing.net
  Tel. 0321 640149 
Web    : 
www.retrocomputing.net
      Fax  0321 391669 BBS  0321 392320