Salut
Comment je peux faire pour creer un programme qui delete lui meme quand je clique sur un bouton ?
Merci d'avance.....
Salut
Comment je peux faire pour creer un programme qui delete lui meme quand je clique sur un bouton ?
Merci d'avance.....
Bonjour,
Sous windows ?
Oui !
bien alors sous windows tu ne peux pas supprimer ujn exécutable qui est monté en mémoire.
Donc il faut faire appel à une application extérieure.
- Soit une DLL
- Soit un Batch
- Soit faire un exe
à qui on fournit le nom de l'application à supprimer.
puis on quitte la dite application.
En plus simple et moins efficace :
Renommer l'exécutable afin de simuler sa destruction, cela permettra de le changer et de répertoire et d'extension.
a+
pas qu'est ce que je veux , pas de fermer l'application mais de effacer de mon disk dur......Envoyé par slimjoe
Merci aussi
ok c'est un peu clair mais je sais pas par example quand on uninstalle un logiciel , il efface tout les fichiers aussi le programme lui meme et le repertoire ...........Envoyé par Yurck
C'est différent si c'est ce que tu veux faire alors tu devrais utiliser un logiciel d'installation style Installshield.Envoyé par aliwassem
Salut,
Comme l'a dit Yurck, tu peux faire un fichier batch en quittant l'application, celui-ci s'exécutant au prochain redémarrage de windows.
L'intérêt d'un tel fichier c'est que lui peut s'auto supprimer après!
C'est une solution parmis d'autres à explorer ...
Existe aussi Inno Setup mais je sais pas si il le gère ca ...
Non ton batch n'attends pas pour se lancer cela gâche l'intérêt du jeu.
Il faut créer le process qui lance le batch et ensuite terminer l'application.
a+
maintenat peut etre je commance de comprendreEnvoyé par Yurck
quand je veux de deleter l'application soit lui meme creer un batch et l'executer et fermer l'apllication , et apres un temp il va effacer l'application..........
je vais essaye ca
merci
une application ne peut s'effacer d'elle-meme parce qu'elle est chargee en memoire comme le dit Yurck !Envoyé par aliwassem
Sinon avec l'API win32 DeleteFile().
Mais il faut que le programme soit ferme c'est donc le serpent qui se mord la queue
Avec un autre programme ou fichier batch
merci ca qu'est ce que je l'arrive avec les reponse precedent , un batch , mais est ce que qq peut me dire comment je peut pour creer un fichier batch ou , ou je peux trouver des information sur les fichier batch.......Envoyé par Mat.M
Merci encore
Bonjour,
Un batch c'est un fichier qui contient des commandes DOS (tu trouveras de l'aide dans l'aide windows).
Tu trouveras dans la FAQ des méthode de creation de fichier.
A la volée :
a+
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Var MonfichierBatch : TStringList; begin MonfichierBatch := TStringList.create; MonfichierBatch.Add('del '+ application.exeName); MonfichierBatch.SaveToFile(application.exeName+.'bat'); // la double extension ce n'est pas génant. Shellexecute('cmd ' + application.exeName+.'bat'); // regarde dans l'aide le shellexecute application.terminate; end;
Merci beucoup ca marche avec moi tres bien mais avec le suivantEnvoyé par Yurck
Merci aussi
Code : Sélectionner tout - Visualiser dans une fenêtre à part Shellexecute(0,'open' ,PChar(application.exeName+'.bat'),nil,nil,SW_SHOWMINIMIZED);
Pour ceux que ça interesse, on peut utiliser le meme principe quand un programme se met a jour lui meme :
* renommage de l'exe
* telechargement nouvelle version (tidhttp, voir FAQ delphi)
* on quitte l'appli lancée et on relance la nouvelle qui au démarrage supprime le fichier renommé. On peut meme faire un kill si l'exe est lancé plusieurs fois (voir faq il me semble pour le kill de processus)
PS : Si le code précédent ne marche pas, pensez aux permissions du répertoire (lecture seule ou droits si le fichier est sur un réseau)
Si cela peut donner des idées à certains, c'est le dpr d'un de mes projets, et j'ai pondu ça pour le fun ...
c'est pour l'auto mise à jour en réseau local, ... je dois pondre une version pour FTP, seul soucis c'est la gestion des versions via FTP, je n'ai pas encore trouvé la meilleure façon de faire ... cela génère un bat, qui renomme l'exe en cours d'éxecution (pour archive, cela n'est pas obligatoire), l'efface pour garantir sa suppression, copie le nouvel exe, le lance, et le bat s'auto supprime !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 program NotifyXChat; uses Windows, Classes, Forms, SysUtils, IniFiles, ShellAPI, Unique_Instance, uNotifyTaskBarXChat in 'uNotifyTaskBarXChat.pas' {NotifyTaskBarXChatForm}, uVersionUtils in 'uVersionUtils.pas', uStringUtils in 'uStringUtils.pas'; {$R *.res} function GetLastVersion(): Boolean; var DirMaj, ExeMaj: string; VersionLocale, VersionMaj: string; TmpIniFile: TIniFile; BatOp: TStringList; DosStr: array of Char; begin Result := False; TmpIniFile:= TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini')); try DirMaj := TmpIniFile.ReadString('PATH', 'MAJPATH', XCHAT_MAJPATH); ExeMaj := IncludeTrailingPathDelimiter(DirMaj)+ExtractFileName(Application.ExeName); finally TmpIniFile.Free(); end; if GetFileVersion(Application.ExeName, VersionLocale) and GetFileVersion(ExeMaj, VersionMaj) then begin Result := CompareVersion(VersionMaj, VersionLocale) > 0; if Result then begin BatOp := TStringList.Create(); try //BatOp.Add('@ECHO OFF'); BatOp.Add(':LoopRename'); BatOp.Add(Format('RENAME "%s" "%s"', [Application.ExeName, ExtractFileName(ChangeFileExt(Application.ExeName, '.'+VersionLocale))])); BatOp.Add(Format('IF NOT EXIST "%s" GOTO LoopRename', [ChangeFileExt(Application.ExeName, '.'+VersionLocale)])); BatOp.Add(':LoopDelete'); BatOp.Add(Format('DEL "%s"', [Application.ExeName])); BatOp.Add(Format('IF EXIST "%s" GOTO LoopDelete', [Application.ExeName])); BatOp.Add(':LoopCopy'); BatOp.Add(Format('COPY "%s" "%s"', [ExeMaj, Application.ExeName])); BatOp.Add(Format('IF NOT EXIST "%s" GOTO LoopCopy', [Application.ExeName])); BatOp.Add(Application.ExeName); BatOp.Add(Format('DEL %s\MAJArchive.bat', [ExtractFileDir(Application.ExeName)])); SetLength(DosStr, Length(BatOp.Text)+1); if CharToOem(PChar(BatOp.Text), @DosStr[0]) then BatOp.Text := StrPas(@DosStr[0]); BatOp.SaveToFile('MAJArchive.bat'); ShellExecute(0, 'open', PChar('MAJArchive.bat'), nil, PChar(ExtractFileDir(Application.ExeName)), SW_SHOW); finally BatOp.Free(); end; end; end; end; begin Application.Initialize; Application.Title := 'Notify XChat'; if GetLastVersion() then Exit; if not UniqueInstance('Notify XChat') then begin TNotifyTaskBarXChatForm.Popup(); Exit; end; ShowWindow(Application.Handle, SW_Hide); Application.ShowMainForm:= False; Application.CreateForm(TNotifyTaskBarXChatForm, NotifyTaskBarXChatForm); Application.Run; end.
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !![]()
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Oui, mais avec la version ftp (ou http), il te faudra gérer un dialogue de progression du téléchargement, voir, une compression du nouvel exe.
Le tout est facilement externalisable dans une unité externe (ou un composant ?) en utilisant la partie "initialization" de cette dernière.
Partager