2015-05-08 3 views
0

Как вы можете определить исполняемый файл, запускающий приложение с C++?Как узнать имя исполняемого файла, запускающее приложение?

Например: мое имя приложения (a.exe), и есть другое приложение с именем (b.exe). Как я могу узнать, когда был запущен a.exe с b.exe или нет?

+2

Check 'ARGV [0]', чтобы получить имя программы запущен. Вы не можете получить имя процесса родителя простым способом. –

+3

@ πάνταῥεῖ, в этом случае он хочет, чтобы родительский 'argv [0]'. AFAIK нет стандартного способа сделать это на языке (или, возможно, на любом языке). Итак, какая ОС это? Окна? –

+6

Как просмотреть родительский PID, см. [Этот вопрос] (http://stackoverflow.com/q/5321914/33499). И [этот вопрос] (http://stackoverflow.com/q/23593688/33499) как получить имя файла из PID. – wimh

ответ

1

Я нашел способ сделать это, спасибо Wimmel.

Для получения идентификатора процесса вы можете использовать GetParentProcessId(). И вам нужна эта функция:

ULONG_PTR GetParentProcessId() // By Napalm @ NetCore2K 
{ 
    ULONG_PTR pbi[6]; 
    ULONG ulSize = 0; 
    LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandle, ULONG ProcessInformationClass, 
    PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength); 
    *(FARPROC *)&NtQueryInformationProcess = 
    GetProcAddress(LoadLibraryA("NTDLL.DLL"), "NtQueryInformationProcess"); 
    if(NtQueryInformationProcess){ 
     if(NtQueryInformationProcess(GetCurrentProcess(), 0, &pbi, sizeof(pbi), &ulSize) >= 0 && ulSize == sizeof(pbi)) 
      return pbi[5]; 
    } 
    return (ULONG_PTR)-1; 
} 

, чтобы получить Имя процесса от процесса Id ProcessName(GetParentProcessId()).

И тогда вам будет нужна эта функция:

char* ProcessName(int ProcessId){ 
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    if(hSnapshot) { 
     PROCESSENTRY32 pe32; 
     pe32.dwSize = sizeof(PROCESSENTRY32); 
     if(Process32First(hSnapshot,&pe32)) { 
      do { 
       int th32ProcessID = pe32.th32ProcessID; 
       if (th32ProcessID == ProcessId) 
        return pe32.szExeFile; 
      } while(Process32Next(hSnapshot,&pe32)); 
     } 
     CloseHandle(hSnapshot); 
    } 
    return 0; 
} 
+2

Просто имейте в виду, что идентификаторы процессов перерабатываются, поэтому это не гарантируется на 100% точным. –

Смежные вопросы