Prozess-Handle nach Namen in C abrufen
In C kann es vorkommen, dass Sie einen Prozess anhand seines Namens manipulieren müssen. Beispielsweise möchten Sie möglicherweise einen Prozess namens „example.exe“ beenden, ohne auf Fensterhandles angewiesen zu sein. Diese Frage befasst sich mit diesem speziellen Szenario und stellt eine Lösung vor.
Um das Prozesshandle anhand seines Namens abzurufen, können wir die Windows-API-Funktionen CreateToolhelp32Snapshot und Process32Next nutzen. Hier ist ein Codeausschnitt, der diesen Ansatz demonstriert:
#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; }
Diese Lösung durchläuft alle laufenden Prozesse und vergleicht ihre ausführbaren Namen mit „example.exe“. Sobald eine Übereinstimmung gefunden wird, wird ein Handle für diesen Prozess abgerufen und kann zum Ausführen von Vorgängen wie der Beendigung (über TerminateProcess) verwendet werden.
Hinweis: Wenn Sie PROCESS_ALL_ACCESS in OpenProcess verwenden möchten , müssen Sie möglicherweise die Berechtigungen Ihres Prozesses erhöhen, indem Sie die Berechtigung SE_DEBUG_NAME aktivieren. Der Code dafür ist unten dargestellt:
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); }
Das obige ist der detaillierte Inhalt vonWie kann ich ein Prozesshandle nach Namen in C abrufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!