Récupération du processus géré par son nom en C
En C , vous pouvez rencontrer des situations où vous devez manipuler un processus en fonction de son nom. Par exemple, vous souhaiterez peut-être mettre fin à un processus appelé « exemple.exe » sans vous fier aux handles de fenêtre. Cette question approfondit ce scénario spécifique et présente une solution.
Pour récupérer le descripteur de processus par son nom, nous pouvons exploiter les fonctions de l'API Windows CreateToolhelp32Snapshot et Process32Next. Voici un extrait de code qui illustre cette approche :
#include <cstdio> #include <windows.h> #include <tlhelp32.h> int main() { // Create a snapshot of running processes HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // Iterate over the processes PROCESSENTRY32 entry; entry.dwSize = sizeof(PROCESSENTRY32); if (Process32First(snapshot, &entry) == TRUE) { while (Process32Next(snapshot, &entry) == TRUE) { // Check if this is the process we want if (strcmp(entry.szExeFile, "example.exe") == 0) { // Open a handle to the process HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID); // Perform desired operations on the process CloseHandle(hProcess); // Close the handle } } } CloseHandle(snapshot); // Close the snapshot handle return 0; }
Cette solution parcourra tous les processus en cours d'exécution et comparera leurs noms d'exécutables avec "example.exe". Une fois qu'une correspondance est trouvée, un handle vers ce processus est obtenu et peut être utilisé pour effectuer des opérations telles que la résiliation (via TerminateProcess).
Remarque : Si vous prévoyez d'utiliser PROCESS_ALL_ACCESS dans OpenProcess , vous devrez peut-être élever les privilèges de votre processus en activant le privilège SE_DEBUG_NAME. Le code pour ce faire est affiché ci-dessous :
void EnableDebugPriv() { // Enable debug privilege HANDLE hToken; LUID luid; TOKEN_PRIVILEGES tkp; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = luid; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL); CloseHandle(hToken); }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!