web-dev-qa-db-fra.com

Comment obtenir le nom du processus en C++

Comment puis-je obtenir le nom du processus d'un PID utilisant C++ sous Windows?

20
Muhammad

Je suppose que la fonction OpenProcess devrait aider, étant donné que votre processus possède les droits nécessaires. Une fois que vous avez obtenu un descripteur du processus, vous pouvez utiliser la fonction GetModuleFileNameEx pour obtenir le chemin complet (chemin du fichier .exe) du processus.

#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;
}
23
Salman A

Vous pouvez obtenir le nom du processus à l'aide de l'API Win32 GetModuleBaseName après avoir reçu le descripteur de processus Vous pouvez obtenir le descripteur de processus en utilisant OpenProcess .

Pour obtenir le nom du fichier exécutable, vous pouvez également utiliser GetProcessImageFileName .

13
Brian R. Bondy

Si vous essayez d'obtenir le nom d'image exécutable d'un processus donné, consultez GetModuleFileName .

2
Nicolas Repiquet

Découvrez les fonctions enumprocess dans la bibliothèque d'aide de l'outil:

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

Bon exemple @ http://msdn.Microsoft.com/en-us/library/ms682623(v=vs.85).aspx

2
amirpc

Essayez cette fonction:

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();
}
1
Iulian Rotaru

Toutes les méthodes ci-dessus nécessitent le chargement de psapi.dll ( Lisez la section des remarques ) et une itération dans le cliché de processus est une option à ne pas prendre en compte pour obtenir un nom du fichier exécutable du point de vue de l'efficacité.

La meilleure approche, même selon les recommandations de MSDN, consiste à utiliser 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
T.s. Arun