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

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

Marsh Posté le 22-02-2002 à 23:59:59    

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]

Reply

Marsh Posté le 22-02-2002 à 23:59:59   

Reply

Marsh Posté le 23-02-2002 à 00:59:53    

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

Reply

Marsh Posté le 23-02-2002 à 01:59:19    

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)

Reply

Marsh Posté le 23-02-2002 à 02:11:09    

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é!  --
Reply

Marsh Posté le 23-02-2002 à 13:12:53    

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]

Reply

Marsh Posté le 23-02-2002 à 13:37:53    

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);
}

Reply

Marsh Posté le 23-02-2002 à 15:00:58    

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

Reply

Marsh Posté le 23-02-2002 à 15:02:32    

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]

Reply

Marsh Posté le 23-02-2002 à 15:25:25    

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();  
 }

Reply

Marsh Posté le 23-02-2002 à 15:26:57    

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]

Reply

Marsh Posté le 23-02-2002 à 15:26:57   

Reply

Marsh Posté le 23-02-2002 à 15:35:54    

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é  
                        }
                 }
           }

Reply

Marsh Posté le 23-02-2002 à 17:19:38    

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]

Reply

Marsh Posté le 23-02-2002 à 18:29:45    

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

Reply

Marsh Posté le 23-02-2002 à 18:58:55    

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

Reply

Marsh Posté le 25-02-2002 à 01:07:26    

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

Reply

Marsh Posté le 25-02-2002 à 01:24:23    

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.

Reply

Marsh Posté le 25-02-2002 à 12:48:55    

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]

Reply

Marsh Posté le 25-02-2002 à 22:36:59    

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

Reply

Marsh Posté le 27-02-2002 à 15:28:17    

[:dirakocha]

Reply

Marsh Posté le 27-02-2002 à 15:46:00    

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
Reply

Marsh Posté le 04-05-2002 à 21:32:50    

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]

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed