Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Delphi: Система, Windows API > PID моего процесса


Автор: vodovorot 15.12.09, 11:56
Здравствуйте.
Проблема в следующем есть запускаемый процесс, но в диспетчере задач, может быть несколько процессов с таким именем. Как мне определить PID нужного процесса, например зная размещение exe файла ?

Автор: P.O.D 15.12.09, 12:19
Вначале узнать handle, а потом GetWindowThreadProcessId.

Автор: arj99 15.12.09, 12:27
Taking a Snapshot and Viewing Processes
это вообще.

а в частности
Цитата vodovorot @
есть запускаемый процесс

как запускаете?
просто есть такой удобный способ запуска CreateProcess(), который сразу возвращает PID.

Автор: vodovorot 15.12.09, 13:01
Запускаю через ShellExecute(Handle,nil,Pchar('\files\myprogram.exe'),nil, nil, SW_RESTORE).
Цитата
просто есть такой удобный способ запуска CreateProcess(), который сразу возвращает PID.

Если не сложно можете привести пример использования ?
На MSDN не совсем понятно...

Автор: Riply 15.12.09, 13:09
Цитата vodovorot @
На MSDN не совсем понятно...

Что именно вызывает затруднения ?

Автор: arj99 15.12.09, 13:17
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function StartProccess(const ExecutableName: string): DWORD;
    var
      StartupInfo: TStartupInfo;
      ProccessInfo: TProcessInformation;
    begin
      Result := 0;
      FillChar(StartupInfo, sizeof(StartupInfo), 0);
      with StartupInfo do
      begin
        cb := sizeof(StartupInfo);
        wShowWindow := SW_RESTORE;
      end;
      FillChar(ProccessInfo, sizeof(ProccessInfo), 0);
      if (CreateProcess(PChar(ExecutableName), nil, nil, nil, false, 0, nil, nil,
          StartupInfo, ProccessInfo)) then
      begin
        Result := ProccessInfo.dwProcessId;
        CloseHandle(ProccessInfo.hProcess);
        CloseHandle(ProccessInfo.hThread);
      end;
    end;

Не тестировал, но как-то так...
Вернет 0 если запустить процесс не удалось либо его PID в случае успеха.
Кстати, отсюда же можно запомнить и дескриптор процесса, если нужен. Потом только не забыть закрыть по ненадобности.

Автор: Демо 15.12.09, 13:32
Цитата arj99 @
Потом только не забыть закрыть по ненадобности.


PID ведь не надо закрывать, только дескриптор. Или я ошибаюсь?

Автор: arj99 15.12.09, 13:34
Цитата arj99 @
Кстати, отсюда же можно запомнить и дескриптор процесса, если нужен.
Потом только не забыть закрыть его (дескриптор) по ненадобности.

Автор: Riply 15.12.09, 13:54
Цитата Демо @
PID ведь не надо закрывать, только дескриптор. Или я ошибаюсь?

PID всего навсего "указатель, индекс", чей надо искать Handle.
Они генерируются системой авоматически и могут, даже повторяться (если процесс с данным PID уже закрыт).
Соответственно, за нами следит (создает, уничтожает) сама система, и мы здесь как "не пришей кобыле хвост" :)

Автор: kero_xmemor 15.12.09, 14:07
GetCurrentProcessId

Автор: Демо 15.12.09, 16:52
Цитата vodovorot @
Как мне определить PID нужного процесса, например зная размещение exe файла ?


Если подходить с этой стороны, то нужно искать нужный процесс методом перебора CreateToolHelp32Snapshot.

А PID вообще зачем нужен-то?

Автор: Rouse_ 15.12.09, 21:06
Цитата Riply @
Они генерируются системой авоматически и могут, даже повторяться (если процесс с данным PID уже закрыт).

Увы, не могут в рамках текущего аптайма

Добавлено
Цитата Демо @
А PID вообще зачем нужен-то?

Вещь в себе - уникальный идентификатор процесса. (Ну это в MS так договорились)

Автор: Демо 15.12.09, 22:32
Цитата Rouse_ @
Вещь в себе - уникальный идентификатор процесса. (Ну это в MS так договорились)

___________


Я имел ввиду - автору-то зачем? Для удовлетворения любопытства?

Автор: transserg 16.12.09, 04:56
если тебе свой пид надо то используй GetCurrentProcessID

Автор: vodovorot 16.12.09, 17:39
Всем спасибо за помощь, особенно, arj99 разобрался с CreateProcess :)

Автор: Mr.Delphist 21.12.09, 17:50
Цитата Rouse_ @
Увы, не могут в рамках текущего аптайма

Это что, то есть, если я породил 4 миллиарда короткоживущих процессов, то надо перегружать ось для продложения работы? :blink:

*кричит "Маздай! Маздай!" и одевает шкуру пингвина*

Автор: Демо 21.12.09, 18:22
Цитата Mr.Delphist @
Это что, то есть, если я породил 4 миллиарда короткоживущих процессов, то надо перегружать ось для продложения работы?


Эсперимент надо провести;)

Автор: leo 22.12.09, 08:33
Цитата Mr.Delphist @
Это что, то есть, если я породил 4 миллиарда короткоживущих процессов, то надо перегружать ось для продложения работы?

Не надо утрировать. GetTickCount тоже выдает максимум 4 миллиарда мсек (~50 суток) непрерывной работы, а затем просто переходит на 0. Видимо и с PID тоже самое - искусственно ограничивать диапазон и повторять не имеет смысла, а если переполнится через несколько месяцев непрерывной работы, то и фиг с ним ;)

Автор: Riply 22.12.09, 10:53
leo, проверяется легко.
В цикле стартуем краткосрочный процесс, запоминая его ID и не забывая все закрывать.
Смотрим был уже такой или нет. IMHO, не так уж и много итераций понадобиться, дабы поймать повторение.
P.S.
Сама не пробовала, совсем времени нет сейчас :(

Автор: leo 22.12.09, 12:13
Цитата Riply @
Сама не пробовала, совсем времени нет сейчас

А откуда тогда уверенность, что "не так уж и много итераций понадобиться" ?

Автор: Riply 22.12.09, 12:37
Цитата leo @
А откуда тогда уверенность, что "не так уж и много итераций понадобиться" ?


"И опыт, сын ошибок трудных" (с) :)
Сто лет назад ловила глюк при построении дерева процессов (XP SP1)

Автор: Aqel 16.02.17, 05:44
Вопрос: Как этой функцией (в начале темы) узнать Handle окна запущенной программы и вывести вместе с её PID ?

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    function StartProccess(const ExecutableName: string): DWORD;
    var
      StartupInfo: TStartupInfo;
      ProccessInfo: TProcessInformation;
    begin
      Result:= 0;
      FillChar(StartupInfo, sizeof(StartupInfo), 0);
      with StartupInfo do
      begin
        cb:= sizeof(StartupInfo);
        wShowWindow:= SW_RESTORE;
      end;
      FillChar(ProccessInfo, sizeof(ProccessInfo), 0);
      if (CreateProcess(PChar(ExecutableName), nil, nil, nil, false, 0, nil, nil, StartupInfo, ProccessInfo)) then
      begin
        Result:= ProccessInfo.dwProcessId;
        CloseHandle(ProccessInfo.hProcess);
        CloseHandle(ProccessInfo.hThread);
      end;
    end;


В моём варианте использую её так:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if OpenDialog1.Execute then
        begin
          ProgID:= StartProccess(OpenDialog1.FileName);
        end

Автор: Fr0sT 27.02.17, 07:08
EnumWindows + GetWindowProcessID, но не забывать, что у любого процесса м.б. куча окон.

Автор: Filka 27.02.17, 09:06
Get the Main Window, Get EXE Name
Исходники на C++
На русском (стр. 40)

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)