【问题标题】:get a process id from process name从进程名称中获取进程 ID
【发布时间】:2010-12-24 14:08:17
【问题描述】:

嗨 我正在尝试使用 C 语言中的 windows API 做一个项目。我项目中的一小部分是获取 lsass.exe 的进程 ID。

我已经尝试了下面的程序,但它不会工作。 我已阅读有关 CreateToolhelp32Snapshot、Process32First、Process32Next 函数的信息,任何人都可以帮助我解释如何在代码中使用它们。

所以请帮助我。 我是 Windows API 的初学者,所以如果有人能给我推荐一本好的电子书,我将不胜感激。

【问题讨论】:

    标签: c winapi process


    【解决方案1】:

    因为可能有多个进程名称正在运行,所以进程的映像名称和 PID 之间没有一对一的关联。正如 Burgos 所描述的那样,您必须使用 EnumProcesses 枚举进程并检查每个进程的基本模块名称。

    FWIW,.Net 通过提供 GetProcessesByName API 来解决这个问题,该 API 返回进程对象的集合。当然对你没多大用处:-(

    【讨论】:

    • 是的,你说得对,我的用处不大,但无论如何感谢您的帮助:)
    【解决方案2】:

    我不知道更简单的方法。这是通过查找每个正在运行的 PID 并将其名称与“lsass.exe”进行比较来实现的。

        // pid.cpp : Defines the entry point for the console application.
    
        #include "stdafx.h"
        #include <windows.h>
        #include <psapi.h>
    
        int PrintProcessNameAndID( DWORD processID, const char *name )
        {
            TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
    
            // Get a handle to the process.
    
            HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, processID );
    
            // Get the process name.
    
            if (NULL != hProcess )
            {
                HMODULE hMod;
                DWORD cbNeeded;
    
                if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
                     &cbNeeded) )
                {
                    GetModuleBaseName( hProcess, hMod, szProcessName, 
                                       sizeof(szProcessName)/sizeof(TCHAR) );
                }
            }
    
    
            if(strcmp(szProcessName, name) == 0) // right process
            {
                        CloseHandle(hProcess);
                return 1;
            }
    
            // Release the handle to the process.
    
            CloseHandle( hProcess );
            return 0;
         }
    
        int find(const char *name)
        {
        // Get the list of process identifiers.
    
            DWORD aProcesses[1024], cbNeeded, cProcesses;
            unsigned int i;
    
            if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
            {
                return 1;
            }
    
    
            // Calculate how many process identifiers were returned.
    
            cProcesses = cbNeeded / sizeof(DWORD);
    
            // Print the name and process identifier for each process.
    
            for ( i = 0; i < cProcesses; i++ )
            {
                if( aProcesses[i] != 0 )
                {
                    if(PrintProcessNameAndID( aProcesses[i], name ))
                    {
                        //found it
                        _tprintf("%d %s\n", aProcesses[i], name);
                    }
                   }
            }
     }
    
        int _tmain(int argc, _TCHAR* argv[])
        {
            find("lsass.exe");
            return 0;
        }
    

    【讨论】:

    • 嘿它不工作给出很多错误...无法理解请帮助.. :(
    【解决方案3】:

    有一个如何使用CreateToolhelp32SnapshotProcess32FirstProcess32Next 的示例(您必须添加错误句柄等,并在代码中包含tlhelp32.h)。顺便说一下,这个功能与 Windows NT 不兼容:

    BOOL GetProcessList(const char *processname, DWORD **processIds, int *numprocess)
    {
        HANDLE hProcessSnap;
        PROCESSENTRY32 pe32;
        DWORD *processIdsTmp;
    
        *processIds = NULL;
        *numprocess = 0;
        // Take a snapshot of all processes in the system.
        hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
        if( INVALID_HANDLE_VALUE == hProcessSnap ) return( FALSE );
    
        // Retrieve information about the first process,
        // and exit if unsuccessful
        if( !Process32First( hProcessSnap, &pe32 ) )
        {
            CloseHandle( hProcessSnap );          // clean the snapshot object
            return( FALSE );
        }
    
        do
        {
            if (0 == strcasecmp(processname, pe32.szExeFile))
            {
                processIdsTmp = realloc(*processIds, sizeof(DWORD) * ((*numprocess) + 1));
                if (NULL == processIdsTmp)
                {
                    free(*processIds);
                    *processIds = NULL;
                    *numprocess = 0;
                    CloseHandle( hProcessSnap );          // clean the snapshot object
                    return( FALSE );
                }
                *processIds = processIdsTmp;
                (*processIds)[(*numprocess)++] = pe32.th32ProcessID;
            }
        } while( Process32Next( hProcessSnap, &pe32 ) );
    
        CloseHandle( hProcessSnap );
        return( TRUE );     
    }
    

    here是一个完整的使用这个函数的例子。

    【讨论】:

      【解决方案4】:

      这是Luis G. Costantini R.代码的修改。

      它使用 MFC:

      #include "TlHelp32.h"
      
      BOOL GetProcessList(const TCHAR *processname, CArray<DWORD> &PIDs)
      {
          PROCESSENTRY32 pe32;
          pe32.dwSize = sizeof(PROCESSENTRY32);
      
          // Take a snapshot of all processes in the system.
          HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
          if (INVALID_HANDLE_VALUE == hProcessSnap) return FALSE;
      
          // Retrieve information about the first process,
          // and exit if unsuccessful
          if (!::Process32First(hProcessSnap, &pe32))
          {
              CloseHandle(hProcessSnap);          // clean the snapshot object
              return FALSE;
          }
      
          do
          {
              if (0 == _tcsicmp(processname, pe32.szExeFile))
              {
                  PIDs.Add(pe32.th32ProcessID);
              }
          }
          while (::Process32Next(hProcessSnap, &pe32));
      
          ::CloseHandle(hProcessSnap);
          return TRUE;
      }
      

      【讨论】:

        猜你喜欢
        • 2011-05-05
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        相关资源
        最近更新 更多