Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh mendapatkan semula Pengendalian Proses mengikut Nama dalam C?

Bagaimanakah saya boleh mendapatkan semula Pengendalian Proses mengikut Nama dalam C?

Susan Sarandon
Susan Sarandonasal
2024-11-20 18:25:15576semak imbas

How Can I Retrieve a Process Handle by Name in C  ?

Mengambil semula Proses Pengendalian mengikut Nama dalam C

Dalam C , anda mungkin menghadapi situasi di mana anda perlu memanipulasi proses berdasarkan namanya. Sebagai contoh, anda mungkin ingin menamatkan proses yang dikenali sebagai "example.exe" tanpa bergantung pada pemegang tetingkap. Soalan ini menyelidiki senario khusus ini dan membentangkan penyelesaian.

Untuk mendapatkan semula pengendalian proses mengikut namanya, kami boleh memanfaatkan fungsi API Windows CreateToolhelp32Snapshot dan Process32Next. Berikut ialah coretan kod yang menunjukkan pendekatan ini:

#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;
}

Penyelesaian ini akan berulang melalui semua proses yang dijalankan dan membandingkan nama boleh lakunya dengan "example.exe". Setelah padanan ditemui, pemegang kepada proses itu diperoleh dan boleh digunakan untuk melaksanakan operasi seperti penamatan (melalui TerminateProcess).

Nota: Jika anda bercadang untuk menggunakan PROCESS_ALL_ACCESS dalam OpenProcess , anda mungkin perlu meningkatkan keistimewaan proses anda dengan mendayakan keistimewaan SE_DEBUG_NAME. Kod untuk melakukan ini ditunjukkan di bawah:

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);
}

Atas ialah kandungan terperinci Bagaimanakah saya boleh mendapatkan semula Pengendalian Proses mengikut Nama dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn