[Résolu] Empêcher un exécutable de se lancer plus d'une fois

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Empêcher un exécutable de se lancer plus d'une fois

Message 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_
~~~~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
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Empêcher un exécutable de se lancer plus d'une fois

Message 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... :)
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Empêcher un exécutable de se lancer plus d'une fois

Message 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
Marc56
Messages : 2196
Inscription : sam. 08/févr./2014 15:19

Re: Empêcher un exécutable de se lancer plus d'une fois

Message 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)

:wink:
Avatar de l’utilisateur
Naheulf
Messages : 193
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: Empêcher un exécutable de se lancer plus d'une fois

Message 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.
Avatar de l’utilisateur
Zorro
Messages : 2186
Inscription : mar. 31/mai/2016 9:06

Re: Empêcher un exécutable de se lancer plus d'une fois

Message par Zorro »

pas con, le coup du port ... :)
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Empêcher un exécutable de se lancer plus d'une fois

Message 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
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 !
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: [Résolu] Empêcher un exécutable de se lancer plus d'une

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: [Résolu] Empêcher un exécutable de se lancer plus d'une

Message 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.
Avatar de l’utilisateur
Naheulf
Messages : 193
Inscription : dim. 10/mars/2013 22:22
Localisation : France

Re: [Résolu] Empêcher un exécutable de se lancer plus d'une

Message 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.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: [Résolu] Empêcher un exécutable de se lancer plus d'une

Message par Ollivier »

Je comprends pas. Je vous ai donné une solution sans port. Simple comme "bonjour"...
Répondre