2010-12-31 66 views

Respuesta

2

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

+0

GetModuleFileName no toma en consideración PID . Simplemente proporciona la ruta de acceso totalmente calificada para el archivo que contiene el módulo especificado. –

23

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

Sería interesante saber cómo obtener un PID en primer lugar, aunque esto no es solicitado por el OP. – Jaywalker

+0

@Jaywalker Una llamada wmi y la clase win32_process harán el truco – ROAR

+0

@Jaywalker: Puedes usar EnumProcesses (http://msdn.microsoft.com/en-us/library/ms682629.aspx) –

12

Puede obtener el nombre del proceso mediante el uso de la API de Win32 GetModuleBaseName después de tener el identificador de proceso. Puede obtener el control del proceso utilizando OpenProcess.

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

1

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