¿Cómo puedo recuperar la ruta totalmente calificada de un proceso desde su PID utilizando C++ en Windows?C++ Windows - Cómo obtener la ruta del proceso desde su PID
Respuesta
Llame al OpenProcess
para conocer el proceso asociado con su PID. Una vez que tenga un control para el proceso, llame al GetModuleFileNameEx
para obtener su ruta de acceso totalmente calificada. No olvide llamar al CloseHandle
cuando haya terminado de usar el identificador de proceso.
Aquí hay un ejemplo de programa que realiza las llamadas requeridas (reemplace 1234 con su PID):
#include <windows.h>
#include <psapi.h> // For access to GetModuleFileNameEx
#include <tchar.h>
#include <iostream>
using namespace std;
#ifdef _UNICODE
#define tcout wcout
#define tcerr wcerr
#else
#define tcout cout
#define tcerr cerr
#endif
int _tmain(int argc, TCHAR * argv[])
{
HANDLE processHandle = NULL;
TCHAR filename[MAX_PATH];
processHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, 1234);
if (processHandle != NULL) {
if (GetModuleFileNameEx(processHandle, NULL, filename, MAX_PATH) == 0) {
tcerr << "Failed to get module filename." << endl;
} else {
tcout << "Module filename is: " << filename << endl;
}
CloseHandle(processHandle);
} else {
tcerr << "Failed to open process." << endl;
}
return 0;
}
algunas notas para la solución de Emerick Rogul:
No se olvide de añadir 'psapi.lib' al enlazador (dependencias adicionales).
También ha cambiado PROCESS_ALL_ACCESS
-PROCESS_QUERY_INFORMATION | PROCESS_VM_READ
porque tengo:
Error al proceso de abrir.
Si es compilado como una aplicación de 32 bits no será capaz de obtener el nombre de los procesos de 64 bits ("No se pudo obtener el nombre de archivo del módulo.")
¿Ha intentado QueryFullProcessImageName
?
No tuve mucha suerte con GetModuleFileNameEx y QueryFullProcessImageName solo está disponible en Vista o superior. Sin embargo, pude obtener la ruta para un proceso usando GetProcessImageFilename. Devuelve la ruta del núcleo de Windows, pero puede usar QueryDosDevice para comparar la ruta del dispositivo devuelta por GetProcessImageFilename
con su ruta de acceso adecuada.
Esta página muestra cómo normalizar una ruta de ventanas núcleo obtenido al GetProcessImageFilename
(ver NormalizeNTPath
función):
http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/c48bcfb3-5326-479b-8c95-81dc742292ab/
Ver http://stackoverflow.com/questions/696306/run-time-check-failure-0-loading-queryfullprocessimagename-from-kernel32 -dll # 696365 sobre cómo definir la llamada a la API ** QueryFullProcessImageName ** incluso si su SDK no lo admite. –
veces GetModuleFileNameEx
devuelve el código de error 299 (no sé por qué)
El único método que funciona para todas las versiones de Windows, incluyendo XP está en Nathan Moinvaziri respuesta:
marca la url proporcionada:
Quizás coincida con mi comentario, de un proceso de 32 bits me temo que podría no obtener la ruta de un proceso de 64 bits. Tuve que usar ** QueryFullProcessImageName ** en lugar de ** GetModuleFileNameEx ** –
- 1. obtener pid del proceso hijo
- 2. ¿Cómo obtener PID desde la función PHP exec() en Windows?
- 3. ms C++ get pid del proceso actual
- 4. Obtener nombre del proceso por PID
- 5. obtener el nombre del proceso desde el proceso id (win32)
- 6. PID del último proceso en ejecución en Windows
- 7. ¿Cómo obtener el PID del proceso recién iniciado desde un archivo por lotes?
- 8. ¿Cómo obtener el PID infantil en C?
- 9. Acceso denegado al obtener la ruta del proceso
- 10. ¿Cómo obtener el estado del proceso usando pid?
- 11. Archivo por lotes de Windows: ¿PID del último proceso?
- 12. obtener la ruta completa de un PID usando Delphi
- 13. Cómo obtener el nombre del proceso en C++
- 14. ¿Cómo obtener el PID de un proceso dando el nombre del proceso en Mac OS X?
- 15. Obtener pid del proceso que ha activado alguna señal
- 16. ¿Cómo obtener la ruta del script por lotes en Windows?
- 17. ¿Cómo obtener la ruta del PHP BIN desde PHP?
- 18. Obtener el nombre del proceso de pid o manejar
- 19. cómo obtener el identificador del proceso desde la identificación del proceso?
- 20. Cómo obtener el PID de un proceso en una tubería
- 21. pid del proceso actualmente en ejecución
- 22. ¿Cómo obtener la ruta del archivo desde el URI?
- 23. ¿Cómo obtener la ruta absoluta del archivo desde la ruta base y relativa que contiene ".."?
- 24. ¿Cómo ver una cola de mensaje de proceso especificada si se conoce el PID del proceso?
- 25. ¿Cómo obtener el ID del proceso del nombre del proceso?
- 26. obtener ruta desde la url
- 27. ¿Cómo puedo obtener el PID del proceso principal de mi aplicación?
- 28. ¿Cómo obtener la ruta del servidor de la ruta física?
- 29. ¿Cómo, en Perl 5, puedo obtener el pid del proceso que me envió una señal?
- 30. Obtenga el estado del proceso por pid en Ruby
la mayoría de los módulos de recurrir a un fracaso en conseguir la ruta del archivo :( – jondinham
¿Funciona cuando se llama desde un environemet de 32 bits para obtener PID de un proceso de 64 bits? Me enfrento al problema y tuve que usar ** QueryFullProcessImageName ** en lugar de ** GetModuleFileNameEx ** –