Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
769 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [c++] tester si un programme est deja lancé? (résolu)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[c++] tester si un programme est deja lancé? (résolu)

n°103808
nico23
Posté le 22-02-2002 à 23:59:59  profilanswer
 

Ca fait deja plusieurs heures que je cherche comment faire pour tester si le programme a déjà été lancé une fois. Est ce que certaines personnes parmi savent comment faire(sous windows, le plus simple possible pour que je comprenne)?

 

[jfdsdjhfuetppo]--Message édité par nico23 le 04-05-2002 à 21:33:59--[/jfdsdjhfuetppo]

mood
Publicité
Posté le 22-02-2002 à 23:59:59  profilanswer
 

n°103816
chrisbk
-
Posté le 23-02-2002 à 00:59:53  profilanswer
 

si ton programme creer des fenetres tu dois pouvoir le faire en la cherchant avec FindWindow

n°103830
nico23
Posté le 23-02-2002 à 01:59:19  profilanswer
 

Ca va pas cette fonction, il me faut une commande dans laquelle je donne juste le nom du fichier.
J'ai essayé avec GetModuleHandle mais j'ai des erreurs à la compilation.
 
hmodule = GetModuleHandle("programme.exe" );
ma variable hmodule doit être de quelle type? (int ou HWND donne une erreur)

n°103834
gilou
Modérateur
Modzilla
Posté le 23-02-2002 à 02:11:09  profilanswer
 

Un coup de cuillere a Google avec "windows unique instance", et tu as toutes les infos necessaires:
http://support.microsoft.com/defau [...] US;q243953
A+,

 

[jfdsdjhfuetppo]--Message édité par gilou--[/jfdsdjhfuetppo]


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°103907
nico23
Posté le 23-02-2002 à 13:12:53  profilanswer
 

gilou a écrit a écrit :

Un coup de cuillere a Google avec "windows unique instance", et tu as toutes les infos necessaires:
http://support.microsoft.com/defau [...] US;q243953
A+,  




 
l'exemple du liens ne va pas, car je n'est que le nom du fichier exécutable (qui peut être lancé comme service) et je voudrais savoir s'il est dans la liste des processus.
 
les liens parlant de ca que j'ai trouve jusqu'à maintenant sont  pour visual basic ou delphi. :(

 

[jfdsdjhfuetppo]--Message édité par nico23--[/jfdsdjhfuetppo]

n°103922
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-02-2002 à 13:37:53  profilanswer
 

tu peux essayer avec CreateMutex, dans l'init de ton programme :
 
CreateMutex(NULL,true,"NOM_DU_PROCESSUS" );
if (GetLastError() == ERROR_ALREADY_EXISTS){
    // une instance existe déja
    return (false);
}

n°103963
taureau
Posté le 23-02-2002 à 15:00:58  profilanswer
 

une autre solution est d'utiliser les api windows AddAtom, FindAtom et DeleteAtom (voir l'aide en ligne pour leur utilisation)
 
tu définis une chaine perso pour ton programme genre _ma_chaine_perso_ et au lancement du programme tu testes avec FindAtom si elle est déjà définie si oui cela veux dire que ton programme est en mémoire, sinon tu la définis avec AddAtom
 
n'oublie pas à la fin de ton programme d'effacer ta chaine avec DeleteAtom
 
le petit bémol pour cette utilisation c'est que si ton programme plante en mémoire tu devras rebooter pour pouvoir relancer ton programme  :D

n°103964
nico23
Posté le 23-02-2002 à 15:02:32  profilanswer
 

Harkonnen a écrit a écrit :

tu peux essayer avec CreateMutex, dans l'init de ton programme :
 
CreateMutex(NULL,true,"NOM_DU_PROCESSUS" );
if (GetLastError() == ERROR_ALREADY_EXISTS){
    // une instance existe déja
    return (false);
}  




 
donc au lieu d'utiliser la fonction ShellExecute, j'utilise CreateMutex?
J'obtient l'erreur "path not found" (poutant j'ai fait juste un copier coller du chemin avec le nom du fichier)
(au départ j'ai ca: ShellExecute(0,"Open","\"C:\\Program Files\\Apache Group\\Apache\\Apache.exe\"",param,NULL,SW_MINIMIZE);
et je l'ai remplacer par: CreateMutex(NULL,true,"\"C:\\Program Files\\Apache Group\\Apache\\Apache.exe\"";)
on peut mettre le chemin complet du programme comme nom du processus ou il faut mettre juste le nom de l'éxecutable?
 
edit: c'est les \ qui vont pas!

 

[jfdsdjhfuetppo]--Message édité par nico23--[/jfdsdjhfuetppo]

n°103970
Kouye
Posté le 23-02-2002 à 15:25:25  profilanswer
 

moi j'ai fait comme cela :
 
dans mon initinstance :
 
 CreateMutex(NULL,TRUE,"ICQ SHortCutmutex" );
 
 if(GetLastError() != ERROR_ALREADY_EXISTS)
 {
           //// dérouelement normal de ton programme
 
             CShortICQDlg dlg;  
        m_pMainWnd = &dlg;
  dlg.DoModal();  
 }

n°103971
nico23
Posté le 23-02-2002 à 15:26:57  profilanswer
 

ca marche pas non plus. :cry:  
 
En fait à partir de mon programme je voudrais lancer, arrêter ou redémarrer Apache avec la possiblité de quitter mon programme sans l'arrêter. Donc quand je relance mon programme il faudrait que je détermine si Apache à dejà été lance ou non pour bloquer une nouvelle execution.
 
edit: C'est quoi un objet mutex?

 

[jfdsdjhfuetppo]--Message édité par nico23--[/jfdsdjhfuetppo]

mood
Publicité
Posté le 23-02-2002 à 15:26:57  profilanswer
 

n°103975
Kouye
Posté le 23-02-2002 à 15:35:54  profilanswer
 

haa ok ...
 
c'est donc pour appache que tu doit savor s'il est lancé ou non ..
 
bon faut sortir les grand moyens ..
 
moi j'ai fait cela pour un pti prog ..
j'ai utilisé une classe sur codeguru qui listai les process .. et donnait leur .exe ..
ce que j'ia fait j'ai listé tout les process en cherchant mon .exe ..  
si il trouve rie nc'est qu'il n'est pas lancé..  
 
 
la classe s'appelle CEnumWinModules
 
 
voila u nbout de mon programme si ça peut t'aider :
 CString AppExe, Title;
 CEnumWinModules wm, wm2;
// HANDLE hSnapShot;
 HWND  wnd, wnd2;
 int test;
// BOOL Btest;
 DWORD wpID, wpID2;
// char tmp[128];
 AppClose.MakeLower();
 
 
 wm.Process(0);
 wm2.Process(0);
 for (int i=0;i<wm.GetWindowCount();i++)
 { // ça liste tous les process
  ModuleName = wm.GetModuleName(i);
   
  if(ModuleName != "" )
  {  
   ModuleName.MakeLower();
   ModuleInfo = wm.GetClassName(i);
   test = ModuleName.Find(AppClose,0);
   if(test!= -1)
   {  
                           // le programme est lancé  
                        }
                 }
           }

n°104011
nico23
Posté le 23-02-2002 à 17:19:38  profilanswer
 

Merci
 
ben maintenant j'ai un autre problème pour essayer ca.
EnumWinModules.h utilise wdmdbg.h, tlhelp32.h et afxtempl.h que j'ai pas. :( (et psapi.h que j'ai trouvé avec psapi.lib)
et la page trouvé chez microsoft pour télécharger ces fichiers comporte une erreur donc je peux les télécharger (et je les trouve pas ailleurs :cry:) .
 
edit: j'utilise Dev-C++ 4 pour compiler. Est ce que psapi.lib va fonctionner avec (les fichiers fourni avec le programme sont en .a)?

 

[jfdsdjhfuetppo]--Message édité par nico23--[/jfdsdjhfuetppo]

n°104040
Kouye
Posté le 23-02-2002 à 18:29:45  profilanswer
 

bah écoute pr le reste je sais pas :(
moi j'utilise Visual C++ 6.0 ..

n°104043
nico23
Posté le 23-02-2002 à 18:58:55  profilanswer
 

et ils y sont ces fichiers avec visual C++ 6 (j'ai regardé et avec ma version il n'y sont pas)?
 
Sinon on peut pas utiliser les dll? (la je sais pas comment faire en C++)

n°104361
nico23
Posté le 25-02-2002 à 01:07:26  profilanswer
 

Bon pour résumé: j'ai peut être la solution mais maintenant il me manque certain fichier header (que je ne trouve pas: wdmdbg.h, tlhelp32.h et afxtempl.h avec les autres fichiers du même pour pouvoir les utiliser) pour EnumWinModules.h (récupérer sur codeguru)  
 ([:dirakocha])

n°104370
Kristoph
Posté le 25-02-2002 à 01:24:23  profilanswer
 

Pourquoi pas la méthode Unix habituelle ? Elle doit marché sous Windows aussi. Il doit etre possible de demander à Apache de creer un fichier apache.lock ou apache.pid quand il se lance. Si le fichier existe c'est que soit Apache est lancé, soit qu'il aété fermé de façon incorrecte.

n°104465
nico23
Posté le 25-02-2002 à 12:48:55  profilanswer
 

Merci pour l'astuce, je viens de regarder le fichier apache.pid existe bien (sans ajouter d'option).
Donc cela me resoud le problème pour apache.
Mais j'aimerais savoir comment faire si ce n'était pas apache?
Comment on déclare les focntions des DLL en C (pour essayer de résoudre mon problème avec les fichiers headers)?

 

[jfdsdjhfuetppo]--Message édité par nico23--[/jfdsdjhfuetppo]

n°104760
nico23
Posté le 25-02-2002 à 22:36:59  profilanswer
 

Est qu'il existe un équivalent du fichier afxtempl.h pour les  compilateurs autres que visual C++? (c'est le fichiers des template)

n°105610
nico23
Posté le 27-02-2002 à 15:28:17  profilanswer
 

[:dirakocha]

n°105618
Tetragramm​aton IHVH
dieu unique =&gt; pensée unique
Posté le 27-02-2002 à 15:46:00  profilanswer
 

nico23 a écrit a écrit :

Est qu'il existe un équivalent du fichier afxtempl.h pour les  compilateurs autres que visual C++? (c'est le fichiers des template)  




 
Afxtempl.h contient les templates des conteneurs tels CArray<>, CMap<> etc... qui sont spécifiques aux MFC donc à VC++.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
n°134745
nico23
Posté le 04-05-2002 à 21:32:50  profilanswer
 

Bon après d'autre recherche et un peu de temps, j'ai résolu mon problème  :)  
Voici la fonction que j'ai créé (au cas ou certains seraient intéressé aussi)
 
BOOL find(char *process_name)
{ bool q=false;
PROCESSENTRY32 uProcess;  //structure PROCESSENTRY32 définit dans tlhelp32.h
HANDLE hSnapshot = (HANDLE) CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
if((int)hSnapshot!=-1)
{//pas d'erreur : liste les processus
uProcess.dwSize =  sizeof(uProcess);  //voir msdn
BOOL r=Process32First(hSnapshot, &uProcess);
do
{  //compare les 15 premiers caractères du nom chercher au du processus renvoyé par la fonction process32first ou process32next
//uProcess.szExeFile: nom du processus trouvé
if(strncasecmp(process_name,uProcess.szExeFile,15)==0) q= true;
r = Process32Next(hSnapshot, &uProcess);
}  while(r&(!q)); //fin du parcours de la liste des proccessus terminé ou proccessus trouvé
}
CloseHandle(hSnapshot);
return q;
}
 
(pour ceux qui utilisent dev-c++ il faut déclaré les fonctions en utilisant kernel32.dll)
fonctionne normallement avec win95 et +, win nt et + (win 2k: testé)

 

[jfdsdjhfuetppo]--Message édité par nico23 le 04-05-2002 à 21:33:34--[/jfdsdjhfuetppo]

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [c++] tester si un programme est deja lancé? (résolu)

 

Sujets relatifs
est ce dur de mettre un programme au demarage de windowS?Prog lancé au démarrage, il ne veut pas me créer un FILE stream ...
Lancer plusieurs softs avec un ".bat" [RESOLU ]Peut-on tester l'existence d'un checkbox dans un formulaire ?
[C++] Probleme avec un petit programmeVenez tester mon forum programmé par mes soins
Venez tester mon OSphp, tester la longueur d'un numéro ????
Comment faire un programme qui Mute ? 
Plus de sujets relatifs à : [c++] tester si un programme est deja lancé? (résolu)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR