2009-09-11 5 views
1

J'ai une application et je veux être en mesure de vérifier si (par exemple) deux instances de celui-ci ont utilisé les mêmes arguments à l'exécution. Pour le rendre plus clair:Win32 C/C++ vérification si deux instances du même programme utilisent les mêmes arguments

monapp 1 2

monapp 1 3

Ce n'est pas un problème de modèle de conception Singleton que je peux avoir plus d'une instance en cours d'exécution. Je pense à vérifier les processus en cours, mais il semble que je ne peux obtenir le nom du processus et cela ne m'aide pas.

L'écriture d'un fichier au démarrage, puis le fait que d'autres instances vérifient si ce fichier existe ne sont pas viables en raison d'une terminaison de programme anormale qui me laisserait en suspens.

Sous Linux, j'ai résolu ceci en vérifiant/proc/pid/cmdline et en analysant les informations.

Quelqu'un at-il une idée si je peux faire quelque chose de similaire sur Windows?

Vive

Répondre

0

Après quelques réflexions, j'ai décidé de faire les choses un peu plus simple ...

La mise en œuvre d'un mutex et vérifier son existence est. Comme j'avais besoin de vérifier si les instances commençaient avec les mêmes paramètres et non si la même application était démarrée, je devais juste décider du nom du mutex en cours d'exécution!

so ...

sprintf(cmdstr,"myapp_%i_%i",arg1,arg2); 

DWORD m_dwLastError; 
m_hMutex = CreateMutex(NULL, FALSE, cmdstr); 
m_dwLastError = GetLastError(); 

if(ERROR_ALREADY_EXISTS == m_dwLastError) 
{ 
    found_other = true; 
} 

et voilà! pas d'analyse, pas de WMI, pas de développement de fenêtres sdk ...

Salut à tous!

+0

RaymondC nous met en garde contre cette approche - voir http://blogs.msdn.com/oldnewthing/archive/2006/06/20/639479.aspx, http://blogs.msdn.com/oldnewthing/archive/ 2009/02/20/9435239.aspx, et http://blogs.msdn.com/oldnewthing/archive/2007/06/29/3594231.aspx –

0

Vous pouvez le faire via la classe de Win32_ProcessWMI.

+0

même si l'application a été démarrée à partir d'un lot? –

+0

Oui. Il regarde juste ce qui a commencé le processus. C'est ainsi que ProcessExplorer le fait, je pense. –

0

Vous souhaitez wmic.exe. Essayez quelque chose comme:

wmic.exe process list | findstr myapp.exe

tri Ensuite, il/parser/tout ce que vous devez faire.

0

wmic est vraiment un excellent outil à avoir.

Je fini par utiliser ce script au lieu de remplir mon code avec des appels WMI:

wmic process where "name='cmd.exe'" get CommandLine > list.txt 

fonctionne très bien!

acclamations et vous remercie Seth et Reed

Questions connexes