21xrx.com
2024-11-05 14:39:39 Tuesday
登录
文章检索 我的文章 写文章
C++ 如何获取进程?
2023-07-02 10:40:26 深夜i     --     --
C++ 进程 获取

在操作系统中,进程是一种正在运行的程序实例。在许多情况下,我们需要以某种方式获取进程信息。在 C++ 中,有多种方法可以获取进程。

使用 Windows API

在 Windows 操作系统中,我们可以使用 Windows API 来获取进程。 Windows API 提供了一组函数,可以与进程交互。其中之一是 CreateToolhelp32Snapshot 函数,它可以创建一个进程快照。这个快照包含当前正在运行的所有进程的信息。我们可以使用 Process32First 和 Process32Next 函数来遍历这个快照,并获取每个进程的信息。以下是一个示例代码:


#include <Windows.h>

#include <TlHelp32.h>

#include <iostream>

int main()

{

  HANDLE hProcessSnap;

  PROCESSENTRY32 pe32;

  hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

  pe32.dwSize = sizeof(PROCESSENTRY32);

  if (!Process32First(hProcessSnap, &pe32))

  {

    std::cout << "Failed to get the first process.\n";

    return -1;

  }

  do

    std::wcout << L"Process name: " << pe32.szExeFile << std::endl;

    std::wcout << L"Process ID: " << pe32.th32ProcessID << std::endl;

    std::wcout << L"Parent process ID: " << pe32.th32ParentProcessID << std::endl;

   while (Process32Next(hProcessSnap, &pe32));

  CloseHandle(hProcessSnap);

  return 0;

}

使用 WMI

WMI(Windows Management Instrumentation)是 Windows 中的一种管理技术。它提供了一组 API,可以用于访问操作系统和应用程序的信息。在 C++ 中,我们可以使用 WMI 来获取进程信息。以下是一个示例代码:


#include <Windows.h>

#include <comdef.h>

#include <Wbemidl.h>

#include <iostream>

#pragma comment(lib, "wbemuuid.lib")

int main()

{

  HRESULT hres;

  // Initialize COM

  hres = CoInitializeEx(0, COINIT_MULTITHREADED);

  if (FAILED(hres))

  {

    std::cout << "Failed to initialize COM.\n";

    return -1;

  }

  // Initialize security

  hres = CoInitializeSecurity(

    0,

    -1,

    0,

    0,

    RPC_C_AUTHN_LEVEL_DEFAULT,

    RPC_C_IMP_LEVEL_IMPERSONATE,

    0,

    EOAC_NONE,

    0);

  if (FAILED(hres))

  {

    std::cout << "Failed to initialize security.\n";

    CoUninitialize();

    return -1;

  }

  // Initialize WMI

  IWbemLocator* pLoc = NULL;

  IWbemServices* pSvc = NULL;

  hres = CoCreateInstance(

    CLSID_WbemLocator,

    0,

    CLSCTX_INPROC_SERVER,

    IID_IWbemLocator,

    (LPVOID*)&pLoc);

  if (FAILED(hres))

  {

    std::cout << "Failed to create IWbemLocator object.\n";

    CoUninitialize();

    return -1;

  }

  hres = pLoc->ConnectServer(

    _bstr_t(L"ROOT\\CIMV2"),

    NULL,

    NULL,

    0,

    NULL,

    0,

    0,

    &pSvc);

  if (FAILED(hres))

  {

    std::cout << "Failed to connect to WMI.\n";

    pLoc->Release();

    CoUninitialize();

    return -1;

  }

  hres = CoSetProxyBlanket(

    pSvc,

    RPC_C_AUTHN_WINNT,

    RPC_C_AUTHZ_NONE,

    NULL,

    RPC_C_AUTHN_LEVEL_CALL,

    RPC_C_IMP_LEVEL_IMPERSONATE,

    NULL,

    EOAC_NONE);

  if (FAILED(hres))

  {

    std::cout << "Failed to set proxy blanket.\n";

    pSvc->Release();

    pLoc->Release();

    CoUninitialize();

    return -1;

  }

  // Execute WQL query

  IEnumWbemClassObject* pEnumerator = NULL;

  hres = pSvc->ExecQuery(

    _bstr_t(L"WQL"),

    _bstr_t(L"SELECT * FROM Win32_Process"),

    WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,

    NULL,

    &pEnumerator);

  if (FAILED(hres))

  {

    std::cout << "Failed to execute query.\n";

    pSvc->Release();

    pLoc->Release();

    CoUninitialize();

    return -1;

  }

  // Enumerate results

  IWbemClassObject* pClsObj = NULL;

  ULONG uReturn = 0;

  while (pEnumerator)

  {

    HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pClsObj, &uReturn);

    if (0 == uReturn)

      break;

    VARIANT vtProp;

    hr = pClsObj->Get(L"Name", 0, &vtProp, 0, 0);

    std::wcout << L"Process name: " << vtProp.bstrVal << std::endl;

    VariantClear(&vtProp);

    hr = pClsObj->Get(L"ProcessId", 0, &vtProp, 0, 0);

    std::wcout << L"Process ID: " << vtProp.uintVal << std::endl;

    VariantClear(&vtProp);

    pClsObj->Release();

  }

  // Cleanup

  pEnumerator->Release();

  pSvc->Release();

  pLoc->Release();

  CoUninitialize();

  return 0;

}

总结

无论使用哪种方法,获取进程信息都是十分重要的。在 C++ 中,使用 Windows API 或 WMI 可以方便地获取进程信息,这些信息对于编写高质量的程序非常有用。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复