Page 3 sur 3
Re: Empêcher un exécutable de se lancer plus d'une fois
Publié : lun. 28/oct./2019 9:44
par Ar-S
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_
Re: Empêcher un exécutable de se lancer plus d'une fois
Publié : lun. 28/oct./2019 9:51
par Zorro
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...

Re: Empêcher un exécutable de se lancer plus d'une fois
Publié : lun. 28/oct./2019 10:32
par Zorro
voici peut etre une autre façon de faire ..
"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
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
Re: Empêcher un exécutable de se lancer plus d'une fois
Publié : lun. 28/oct./2019 11:59
par Marc56
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.
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
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)

Re: Empêcher un exécutable de se lancer plus d'une fois
Publié : lun. 28/oct./2019 13:08
par Naheulf
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
Publié : lun. 28/oct./2019 14:56
par Zorro
pas con, le coup du port ...

Re: Empêcher un exécutable de se lancer plus d'une fois
Publié : lun. 28/oct./2019 15:05
par Micoute
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
Re: [Résolu] Empêcher un exécutable de se lancer plus d'une
Publié : lun. 28/oct./2019 16:28
par GallyHC
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
Re: [Résolu] Empêcher un exécutable de se lancer plus d'une
Publié : lun. 28/oct./2019 16:41
par MLD
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.
Re: [Résolu] Empêcher un exécutable de se lancer plus d'une
Publié : lun. 28/oct./2019 16:52
par Naheulf
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
Publié : lun. 28/oct./2019 16:53
par Ollivier
Je comprends pas. Je vous ai donné une solution sans port. Simple comme "bonjour"...