Номера процессов (PID) запущенной программы и ее родителя

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Номера процессов (PID) запущенной программы и ее родителя

Сообщение PapaNT » 19.11.2015 18:10:52

Уважаемые форумчане, автоматизируя рабочие задачи, столкнулся с задачей как программе узнать свой PID и PID своего родителя (платформа Win32)...

Функции GetProcessID и GetThreadID, как ни странно, возвращают одинаковое значение N, а результатах работы программы tasklist (штатная команда Windows) я вижу совершенно иные значения PID для запущенной задачи :(
PapaNT
постоялец
 
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Re: Номера процессов (PID) запущенной программы и ее родител

Сообщение скалогрыз » 19.11.2015 19:07:30

Может ты не от админа запускаешь?
попробуй такой код:
Код: Выделить всё
{$mode delphi}{$H+}

uses
  Windows, jwatlhelp32;

function GetProcessID(AHandle: HANDLE): DWORD; stdcall; external 'kernel32.dll' name 'GetProcessId';
var
  h  : DWORD;
  res: TProcessEntry32W;
  ws : WideString;
  pid : DWORD;
begin
  pid:=GetCurrentProcessId;
  writeln('My PID:               ',pid);
  writeln('My PID by GetProcess: ',GetProcessID(GetCurrentProcess));

  h:=CreateToolhelp32Snapshot(TH32CS_SNAPALL, GetCurrentProcessId);
  FillChar(res, sizeof(res),0);
  res.dwSize:=sizeof(res);
  if Process32FirstW(h, res) then begin
    if (res.th32ProcessID<>pid) then
      repeat
      until (res.th32ProcessID=pid) or not Process32NextW(h, res);
    if res.th32ProcessID=pid then
      writeln('My Parent PID: ', res.th32ParentProcessID)
    else
      writeln('failed to find my parent!');
  end else
    writeln('failed to find my parent!');
  CloseHandle(h);

  writeln('Hit enter or open Task Manager to compare values!');
  readln;
end.
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Номера процессов (PID) запущенной программы и ее родител

Сообщение PapaNT » 23.11.2015 19:44:55

Огромное спасибо! :D
PapaNT
постоялец
 
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва

Re: Номера процессов (PID) запущенной программы и ее родител

Сообщение alex208210 » 23.11.2015 22:55:36

неправильно закрыт Toolhelp32Snapshot. Будет утечка памяти.
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Re: Номера процессов (PID) запущенной программы и ее родител

Сообщение скалогрыз » 23.11.2015 23:40:39

alex208210 писал(а):неправильно закрыт Toolhelp32Snapshot. Будет утечка памяти.

как правильно?
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Номера процессов (PID) запущенной программы и ее родител

Сообщение alex208210 » 24.11.2015 18:54:03

Toolhelp32Snapshot нужно закрывать CloseToolhelp32Snapshot(h);
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Re: Номера процессов (PID) запущенной программы и ее родител

Сообщение скалогрыз » 24.11.2015 22:18:42

alex208210 писал(а):Toolhelp32Snapshot нужно закрывать CloseToolhelp32Snapshot(h);

судя по всему CloseToolhelp32Snapshot есть только в Windows CE (Mobile).
Тогда как в WinAPI наборе такой функции нет. И согласно документации CreateToolhelp32Snapshot, её результат должен быть закрыт именно CloseHandle().

Проверка на практике (см приложение), доказывает это.
Вложения
close.png
close.png (7.09 КБ) Просмотров: 18948
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Номера процессов (PID) запущенной программы и ее родител

Сообщение alex208210 » 24.11.2015 22:25:04

проблему с утечкой памяти обнаружил именно в wince, на больших виндах не проверял, тогда точно утверждать не буду.
alex208210
постоялец
 
Сообщения: 207
Зарегистрирован: 12.05.2010 13:16:51

Re: Номера процессов (PID) запущенной программы и ее родител

Сообщение скалогрыз » 24.11.2015 23:06:12

alex208210 писал(а):проблему с утечкой памяти обнаружил именно в wince, на больших виндах не проверял, тогда точно утверждать не буду.


для кроссплатформенности, добавь такой вот заголовок:
Код: Выделить всё
function CloseToolhelp32Snapshot(AHandle: HANDLE): LongBool; stdcall; external 'kernel32.dll' name 'CloseHandle';

но $IFDEF-ы не забудь!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Номера процессов (PID) запущенной программы и ее родител

Сообщение PapaNT » 09.12.2015 10:13:44

Всем спасибо! Вопрос решен :)
В результате получилась прелестная утилита командной строки для вставления оной в батники с поддержкой многопоточности :)
PapaNT
постоялец
 
Сообщения: 167
Зарегистрирован: 11.09.2009 12:06:46
Откуда: Москва


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

Рейтинг@Mail.ru