Comment puis-je obtenir le nom du processus d'un PID utilisant C++ sous Windows?
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;
}
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 .
Si vous essayez d'obtenir le nom d'image exécutable d'un processus donné, consultez GetModuleFileName .
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
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();
}
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;
}