Cómo obtener el nombre del proceso en C ++

¿Cómo obtengo el nombre del proceso de un PID usando C ++ en Windows?

Supongo que la función OpenProcess debería ayudar, dado que su proceso posee los derechos necesarios. Una vez que obtenga un control para el proceso, puede usar la función GetModuleFileNameEx para obtener la ruta completa (ruta al archivo .exe) del proceso.

#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; } 

Puede obtener el nombre del proceso utilizando la API de WIN32 GetModuleBaseName después de manejar el proceso. Puede manejar el proceso usando OpenProcess .

Para obtener el nombre del ejecutable también puede usar GetProcessImageFileName .

Si está tratando de obtener el nombre de la imagen ejecutable de un proceso determinado, eche un vistazo a GetModuleFileName .

Verifique las funciones de enrutamiento en la biblioteca de ayuda de la herramienta:

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

Buen ejemplo @ http://msdn.microsoft.com/en-us/library/ms682623(v=vs.85).aspx

Prueba esta función:

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

Todos los métodos anteriores requieren la carga de psapi.dll ( lea la sección de comentarios ) y la iteración a través de la instantánea del proceso es una opción que uno ni siquiera debería considerar para obtener un nombre del archivo ejecutable desde el punto de vista de la eficiencia.

El mejor enfoque, incluso de acuerdo con la recomendación de MSDN, es usar 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; }