2009-12-19 8 views

Respuesta

25

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; 
} 
+1

la mayoría de los módulos de recurrir a un fracaso en conseguir la ruta del archivo :( – jondinham

+1

¿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 ** –

1

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.")

1

¿Ha intentado QueryFullProcessImageName?

0

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/

+2

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. –

0

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:

Windows API to Get a Full Process Path

+0

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 ** –

Cuestiones relacionadas