[Résolu] Empêcher un exécutable de se lancer plus d'une fois
Re: Empêcher un exécutable de se lancer plus d'une fois
Et comme on l'a dit plus haut, que se passe t il si ton crash ? Si l'ordi se prend une coupure de courant ?
Et bien tu vas vouloir relancer ton soft au redémarrage et ce ne sera pas possible.
Ou alors il va falloir faire un compromis avec ton champ date.. En vérifiant si date inscrite < 5min date du nouveau lancement par exemple. Mais ça reste bancale.
Tu as essayé avec le listing des process ? Process32Next_
Et bien tu vas vouloir relancer ton soft au redémarrage et ce ne sera pas possible.
Ou alors il va falloir faire un compromis avec ton champ date.. En vérifiant si date inscrite < 5min date du nouveau lancement par exemple. Mais ça reste bancale.
Tu as essayé avec le listing des process ? Process32Next_
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Re: Empêcher un exécutable de se lancer plus d'une fois
tant qu'a utiliser les APi ,la meilleurs solution c'est celle que j'ai posté.. point barre ....
éprouvé pendant des années...(ps: je viens de reediter pour mettre en procedure
apres pour les autres OS, je suppose qu'ils ont l'equivalent dans leur API respective...
éprouvé pendant des années...(ps: je viens de reediter pour mettre en procedure
apres pour les autres OS, je suppose qu'ils ont l'equivalent dans leur API respective...

Re: Empêcher un exécutable de se lancer plus d'une fois
voici peut etre une autre façon de faire ..
"plus simple"
sinon sans les Apis, j'avoue que je ne vois pas comment faire 
a moins peut etre d'utiliser un Timer, qui verifie en permanence la présence d'un fichier ou une valeur en table de registre
"plus simple"
Code : Tout sélectionner
;***********************************************
;Titre :*prg_deja_lance2
;Auteur : Dobro
;Date :28/10/2019
;Heure :11:19:33
;Version Purebasic : PureBasic 5.70 LTS (Windows - x86)
;Version de l'editeur :EPB PHOENIX V2.68
; Libairies necessaire : Aucune
;***********************************************
Declare test_deja_lance(ExeName$)
Application.s= "Mon application" ; nom de l'application a empecher de se lancer 2 fois
; test si deja lancé
test_deja_lance(Application.s)
If OpenWindow (0, 431, 186, 325, 214, Application.s,#PB_Window_SystemMenu)
Repeat
Event= WaitWindowEvent ()
Until Event = #PB_Event_CloseWindow
EndIf
; ******************* procedure Zone ************************
Procedure test_deja_lance(Application.s)
;by Dobro
Handle= FindWindow_( #Null ,Application.s)
if Handle <>0
debug Handle
Debug Application.s +" est lancé, on quitte"
End
EndProcedure

a moins peut etre d'utiliser un Timer, qui verifie en permanence la présence d'un fichier ou une valeur en table de registre
Re: Empêcher un exécutable de se lancer plus d'une fois
Sans API et basé sur l'idée de GallyHC (maintenir un fichier drapeau ouvert en écriture)
« ...Mais si on "lock" le fichier (on l'ouvre mais on ne le ferme pas), celui-ci ne peut être écrit par un autre instance d'un programme. Donc on test si on peut écrire dans ce fichier et si oui c'est que le programme et non actif normalement (PB et bien fait a ce sujet de mémoire, il ferme les fichiers même en cas de plantage et au pire on gère le plantage avec un "OnErrorCall"). »
J'ai encore un peu simplifié: créer deux fois le même fichier sans le refermer.Quand on ferme la première instance du programme, le fichier drapeau est supprimé automatiquement.
Lancez-le 2 fois (il refusera le deuxième)
Fermez le premier (et il acceptera)

« ...Mais si on "lock" le fichier (on l'ouvre mais on ne le ferme pas), celui-ci ne peut être écrit par un autre instance d'un programme. Donc on test si on peut écrire dans ce fichier et si oui c'est que le programme et non actif normalement (PB et bien fait a ce sujet de mémoire, il ferme les fichiers même en cas de plantage et au pire on gère le plantage avec un "OnErrorCall"). »
J'ai encore un peu simplifié: créer deux fois le même fichier sans le refermer.
Code : Tout sélectionner
If CreateFile(0, GetTemporaryDirectory() + "Flag.txt")
MessageRequester("OK Run", "I'm the First, and I will stay here :o)")
Else
MessageRequester("Oh", "Sorry, same program still open :o/")
EndIf
Lancez-le 2 fois (il refusera le deuxième)
Fermez le premier (et il acceptera)

Re: Empêcher un exécutable de se lancer plus d'une fois
Sur internet j’en ai aussi vu un qui proposait d’ouvrir un port prédéfini en local. Si le port est déjà ouvert c’est que le logiciel est déjà lancé. L’avantage c’est que le port est automatiquement fermé en cas de crash du programme ou de l’ordinateur. Les inconvénients sont que ça fait charger la bibliothèque réseau (plus lourd), sans jamais communiquer (ressemble à un virus donc plus susceptible de faire déclencher les anti-virus) et que le port peut être utilisé par une autre application qui n’a rien à voir.
Re: Empêcher un exécutable de se lancer plus d'une fois
pas con, le coup du port ... 

Re: Empêcher un exécutable de se lancer plus d'une fois
voici les procédures qui gérent l'ouverture et la fermeture du fichier témoin, j'ai volontairement simulé une coupure de courant et le programme a fonctionné du premier coup quand je l'ai relancé après la remise sous tension.
Code : Tout sélectionner
Procedure Programme_principal()
If OpenWindow(#Fenetre_Principale, 0, 0, 1045, 800, "Tendances glycémiques", #PB_Window_BorderLess|#PB_Window_ScreenCentered|#PB_Window_Invisible)
;Si le programme est déjà lancé
If CreateFile(#Fichier_Txt, Fichier_temoin) ;Créer le fichier témoin "Carnet de suivi.txt"
FileSeek(#Fichier_Txt, Lof(#Fichier_Txt))
WriteString(#Fichier_Txt, FormatDate("%dd/%mm/%yyyy %hh/%ii/%ss", Date())) ;servi plus tard
Else
MessageRequester("Attention", "Votre logiciel est déjà ouvert" + #LF$ + #LF$ +
"cette tentative va échouer", #PB_MessageRequester_Info)
Quitter()
EndIf
;Sinon on continue
Remplir_liste_vierge()
Programme_saisies()
EndIf
EndProcedure
Procedure Quitter() ;Fin du programme
Select EventType()
Case #PB_EventType_LeftClick
;Si le fichier témoin est ouvert
If OpenFile(#Fichier_Txt, Fichier_temoin)
;On le ferme
CloseFile(#Fichier_Txt)
EndIf
If FileSize(Fichier_temoin) ;Si le fichier témoin existe,
DeleteFile(Fichier_temoin) ;on l'efface pour pouvoir le réouvrir après la fermeture du programme
EndIf
CloseWindow(EventWindow()) ;pour pouvoir fermer la fenêtre en cours
If Not IsWindow(#Fenetre_Saisies) ;si le programme de saisie est terminé
End ; on quitte le programme
EndIf
EndSelect
EndProcedure
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Un homme doit être poli, mais il doit aussi être libre !
Re: [Résolu] Empêcher un exécutable de se lancer plus d'une
Bonjour,
Le problème avec l'ouverture d'un port réseau, c'est qu'il faut être sur qu'aucun programme ne l'utilise (actuellement ou même dans un futur plus ou moins proche).
Cordialement,
GallyHC
Le problème avec l'ouverture d'un port réseau, c'est qu'il faut être sur qu'aucun programme ne l'utilise (actuellement ou même dans un futur plus ou moins proche).
Cordialement,
GallyHC
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Re: [Résolu] Empêcher un exécutable de se lancer plus d'une
Bonjour a tous
Sans Api(s) .Il me semble que l'on peu mettre un drapeau en mémoire.Bien entendu en cas de rupture du réseau électrique la mémoire est effacée, et tout recommence.
la biblio Memory de PB doit suffire.
Désolé je n'est pas le temps en ce moment pour faire un bout de code, mais j'aurais cherché dans ce sens.
Sans Api(s) .Il me semble que l'on peu mettre un drapeau en mémoire.Bien entendu en cas de rupture du réseau électrique la mémoire est effacée, et tout recommence.
la biblio Memory de PB doit suffire.
Désolé je n'est pas le temps en ce moment pour faire un bout de code, mais j'aurais cherché dans ce sens.
Re: [Résolu] Empêcher un exécutable de se lancer plus d'une
Les espaces mémoires alloués aux processus sont districts. Il y a effectivement moyen de lire et d'écrire dans un espace mémoire partagé avec les fonctions peek() et poke() de la bibliothèque "Memory". Sauf que pour obtenir l'adresse de cet espace partagé... il faut passer pas les API de l'OS.
Re: [Résolu] Empêcher un exécutable de se lancer plus d'une
Je comprends pas. Je vous ai donné une solution sans port. Simple comme "bonjour"...