tester si un programme est deja lancé? (résolu) [c++] - C++ - Programmation
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
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)
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]
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]
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);
}
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
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]
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();
}
Marsh Posté le 23-02-2002 à 15:26:57
ca marche pas non plus.
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]
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é
}
}
}
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 ) .
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]
Marsh Posté le 23-02-2002 à 18:29:45
bah écoute pr le reste je sais pas
moi j'utilise Visual C++ 6.0 ..
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++)
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)
()
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.
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]
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)
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++.
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]
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]