Как получить имя процесса в C ++ - PullRequest
22 голосов
/ 31 декабря 2010

Как получить имя процесса из PID с помощью C ++ в Windows?

Ответы [ 6 ]

24 голосов
/ 31 декабря 2010

Полагаю, функция OpenProcess должна помочь, учитывая, что ваш процесс обладает необходимыми правами.Как только вы получите дескриптор процесса, вы можете использовать функцию GetModuleFileNameEx , чтобы получить полный путь (путь к файлу .exe) процесса.

#include "stdafx.h"
#include "windows.h"
#include "tchar.h"
#include "stdio.h"
#include "psapi.h"
// Important: Must include psapi.lib in additional dependencies section
// In VS2005... Project > Project Properties > Configuration Properties > Linker > Input > Additional Dependencies

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE Handle = OpenProcess(
        PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
        FALSE,
        8036 /* This is the PID, you can find one from windows task manager */
    );
    if (Handle) 
    {
        TCHAR Buffer[MAX_PATH];
        if (GetModuleFileNameEx(Handle, 0, Buffer, MAX_PATH))
        {
            // At this point, buffer contains the full path to the executable
        }
        else
        {
            // You better call GetLastError() here
        }
        CloseHandle(Handle);
    }
    return 0;
}
14 голосов
/ 31 декабря 2010

Вы можете получить имя процесса с помощью WIN32 API GetModuleBaseName после получения дескриптора процесса. Вы можете получить дескриптор процесса, используя OpenProcess .

Чтобы получить имя исполняемого файла, вы также можете использовать GetProcessImageFileName .

2 голосов
/ 31 декабря 2010

Если вы пытаетесь получить имя исполняемого образа данного процесса, взгляните на GetModuleFileName .

1 голос
/ 31 декабря 2010

Проверьте функции enumprocess в библиотеке справки инструмента:

http://msdn.microsoft.com/en-us/library/ms682629(v=vs.85).aspx

Хороший пример @ http://msdn.microsoft.com/en-us/library/ms682623(v=vs.85).aspx

0 голосов
/ 24 августа 2018

Все вышеперечисленные методы требуют загрузки psapi.dll ( Прочтите раздел замечаний ), и повторение снимка процесса - это опция, которую не следует даже рассматривать для получения имени исполняемого файла из соображений эффективности. точка зрения.

Наилучшим подходом, даже в соответствии с рекомендацией MSDN, является использование QueryFullProcessImageName .

std::string ProcessIdToName(DWORD processId)
{
    std::string ret;
    HANDLE handle = OpenProcess(
        PROCESS_QUERY_LIMITED_INFORMATION,
        FALSE,
        processId /* This is the PID, you can find one from windows task manager */
    );
    if (handle)
    {
        DWORD buffSize = 1024;
        CHAR buffer[1024];
        if (QueryFullProcessImageNameA(handle, 0, buffer, &buffSize))
        {
            ret = buffer;
        }
        else
        {
            printf("Error GetModuleBaseNameA : %lu", GetLastError());
        }
        CloseHandle(handle);
    }
    else
    {
        printf("Error OpenProcess : %lu", GetLastError());
    }
    return ret;
}
0 голосов
/ 25 февраля 2016

Попробуйте эту функцию:

std::wstring GetProcName(DWORD aPid)
{ 
 PROCESSENTRY32 processInfo;
    processInfo.dwSize = sizeof(processInfo);
    HANDLE processesSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
    if (processesSnapshot == INVALID_HANDLE_VALUE)
    {
      std::wcout  << "can't get a process snapshot ";
      return 0;
    }

    for(BOOL bok =Process32First(processesSnapshot, &processInfo);bok;  bok = Process32Next(processesSnapshot, &processInfo))
    {
        if( aPid == processInfo.th32ProcessID)
        {
            std::wcout << "found running process: " << processInfo.szExeFile;
            CloseHandle(processesSnapshot);
            return processInfo.szExeFile;
        }

    }
    std::wcout << "no process with given pid" << aPid;
    CloseHandle(processesSnapshot);
    return std::wstring();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...