Identifier un process pour discuter avec lui

Hello !

Je voulais savoir comment, sous windows, localiser une appli qui tourne, l’identifier comme etant celle que j’ai créée et avec laquelle je veux communiquer… comment fait-on?

J’avoue que j’ai pas encore reussi a trouver un article qui parle de ca ds la msdn.

http://www.codeproject.com/csharp/IsApplicationRunning.asp

En C# Process.GetProcessByName la plupart du temps ca suffira, sauf dans les cas zarbi decrit dans l’article. Et en C++, ben tu fais en natif ce qu’il fait en C# pour contourner son corner case dans l’article :stuck_out_tongue:

Attention ça ne marche pas sous Windows 64…

Il y a un truc pas mal sinon, c’est d’utiliser FindWindow.

C’est moins précis mais beaucoup plus portable, c’est pour le cas général. Attention tu peux juste déterminer que l’application tourne ce qui ne répond pas à ta question, j’en ai bien conscience (même problème avec la technique de Glop, qui, si elle te retourne un processs ID bien pratique pour faire un OpenProcess ne te permet pas de savoir quelle instance d’application est “la bonne”).

Dans ton cas spécifique tu dis vouloir identifier ton application qui tourne et communiquer avec elle, pour cela je te recommande de créer un objet de synchronisation, par exemple un mutex avec CreateMutex, au démarrage de ton application et de vérifier son existence. Tu fais d’une pierre deux coups car tu pourras utiliser cet objet pour synchroniser les communications entre tes deux processus :

Dans ton application principale :

[code]HANDLE hMutex = ::CreateMutex(NULL, FALSE, _T(“mymutexomg”));
if (hMutex)
return 0; // wtf ?!

::CloseHandle(hMutex);
hMutex = NULL;[/code]

Dans ton application souhaitant y accéder :

[code]HANDLE hClientMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, _T(“mymutexomg”));
if (!hClientMutex)
return 0;// non présent

::CloseHandle(hClientMutex);
hClientMutex = NULL;[/code]

Ensuite il te suffira d’accéder à la ressource partagée pour communiquer avec ton programme. Tu peux utiliser directement CreateNamedPipe d’ailleurs, ça t’économise le mutex.

Si ton application est multi-instances il va falloir que tu réfléchisses un système de communication un peu plus élaboré avec un processus maître et des processus esclaves.