Liste des processus en VC++
Résolu
yves_mag
-
mrcrowly -
mrcrowly -
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)(?)
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)(?)
A voir également:
- Liste des processus en VC++
- Liste déroulante excel - Guide
- Vc runtime - Guide
- Liste déroulante en cascade - Guide
- Liste code ascii - Guide
- Liste des appareils connectés - Guide
3 réponses
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
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