Liste des processus en VC++

Résolu/Fermé
yves_mag - 31 juil. 2007 à 09:35
 mrcrowly - 14 sept. 2007 à 18:45
Liste des processus en C++ (visual studio)

Je cherche comment obtenir la liste des processus (noms) pour m'assurer que ma DLL n'est pas instanciée par plusieurs applications appelantes.
Ca serait plus élégant que de faire un mutex avec un fichier.
(l'outil spy++ n'est pas accessible par programmation)(?)

3 réponses

Up, svp !!!!!
0
Comme personne ne m'a répondu, j'ai cherché moi-meme, j'ai trouvé une autre manière de faire.

Si j'ai bien compris, une copie de l'application est faite du disque dur vers la RAM, et le code ci-dessous va écrire dans cette copie en RAM.
Il semblerait que l'OS gère cette copie pour n'en avoir qu'une seule par fichier du diske dur.

Les directives de compil (pragma) permettent d'écrire une variable qui est alors globale à toutes les instances de l'executable.
A partir de là, c'est gagné, tant qu'on lance le meme nom de l'executable.

Dans mon cas ce code est dans une DLL et ça marche pour l'exe apelant qui est dans un autre language (visual basic).

Le code:
#include <windows.h>

#pragma data_seg("Shared")
LONG g_Counter = -1;
#pragma data_seg()

#pragma comment(linker, "/section:Shared,rws")

int WINAPI WinMain (HINSTANCE hinstExe,
HINSTANCE hinstPrev, LPTSTR pszCmdLine, int nCmdShow) {

BOOL fFirstInstance =
(InterlockedIncrement(&g_Counter) == 0);

if (!fFirstInstance) {
MessageBox(NULL,
__TEXT("Application is already running - ")
__TEXT("Terminating this instance."),
__TEXT("Multiple Instance"),
MB_OK | MB_ICONINFORMATION);
} else {
MessageBox(NULL,
__TEXT("This is the First Instance of the application.\n")
__TEXT("Press OK to close this application."),
__TEXT("Multiple Instance"),
MB_OK | MB_ICONINFORMATION);
}

InterlockedDecrement(&g_Counter);

return(0);
}

issu de : https://www.codeguru.com/cpp/w-p/system/misc/article.php/c5663/Detecting-Multiple-Instances-of-an-Application-in-VC.htm#more
0
et ça fonctionne étonnament bien, puisque si on tue le process avant de passer sur "InterlockedDecrement", la variable est remise à -1 quand meme.
.....peut etre qu'il y a un mutex qui est automatiquement débloqué à la mort du processus, va savoir...
0
Essaie lavec MSDN EnumProcesses(.....) et EnumProcessModules(....)
j'ai deja fait un programme qui permet de visualiser pour chaque processus les dll ouvertes
si ca t'interesse tu me fais signe.
Bonne chance.
0