Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.184.237] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте.
Проблема в следующем есть запускаемый процесс, но в диспетчере задач, может быть несколько процессов с таким именем. Как мне определить PID нужного процесса, например зная размещение exe файла ? |
Сообщ.
#2
,
|
|
|
Вначале узнать handle, а потом GetWindowThreadProcessId.
|
Сообщ.
#3
,
|
|
|
Taking a Snapshot and Viewing Processes
это вообще. а в частности Цитата vodovorot @ есть запускаемый процесс как запускаете? просто есть такой удобный способ запуска CreateProcess(), который сразу возвращает PID. |
Сообщ.
#4
,
|
|
|
Запускаю через ShellExecute(Handle,nil,Pchar('\files\myprogram.exe'),nil, nil, SW_RESTORE).
Цитата просто есть такой удобный способ запуска CreateProcess(), который сразу возвращает PID. Если не сложно можете привести пример использования ? На MSDN не совсем понятно... |
Сообщ.
#5
,
|
|
|
Цитата vodovorot @ На MSDN не совсем понятно... Что именно вызывает затруднения ? |
Сообщ.
#6
,
|
|
|
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 в случае успеха. Кстати, отсюда же можно запомнить и дескриптор процесса, если нужен. Потом только не забыть закрыть по ненадобности. |
Сообщ.
#7
,
|
|
|
Цитата arj99 @ Потом только не забыть закрыть по ненадобности. PID ведь не надо закрывать, только дескриптор. Или я ошибаюсь? |
Сообщ.
#8
,
|
|
|
Цитата arj99 @ Потом только не забыть закрыть его (дескриптор) по ненадобности. Кстати, отсюда же можно запомнить и дескриптор процесса, если нужен. |
Сообщ.
#9
,
|
|
|
Цитата Демо @ PID ведь не надо закрывать, только дескриптор. Или я ошибаюсь? PID всего навсего "указатель, индекс", чей надо искать Handle. Они генерируются системой авоматически и могут, даже повторяться (если процесс с данным PID уже закрыт). Соответственно, за нами следит (создает, уничтожает) сама система, и мы здесь как "не пришей кобыле хвост" |
Сообщ.
#10
,
|
|
|
GetCurrentProcessId
|
Сообщ.
#11
,
|
|
|
Цитата vodovorot @ Как мне определить PID нужного процесса, например зная размещение exe файла ? Если подходить с этой стороны, то нужно искать нужный процесс методом перебора CreateToolHelp32Snapshot. А PID вообще зачем нужен-то? |
Сообщ.
#12
,
|
|
|
Цитата Riply @ Они генерируются системой авоматически и могут, даже повторяться (если процесс с данным PID уже закрыт). Увы, не могут в рамках текущего аптайма Добавлено Цитата Демо @ А PID вообще зачем нужен-то? Вещь в себе - уникальный идентификатор процесса. (Ну это в MS так договорились) |
Сообщ.
#13
,
|
|
|
Цитата Rouse_ @ Вещь в себе - уникальный идентификатор процесса. (Ну это в MS так договорились) ___________ Я имел ввиду - автору-то зачем? Для удовлетворения любопытства? |
Сообщ.
#14
,
|
|
|
если тебе свой пид надо то используй GetCurrentProcessID
|
Сообщ.
#15
,
|
|
|
Всем спасибо за помощь, особенно, arj99 разобрался с CreateProcess
|
Сообщ.
#16
,
|
|
|
Цитата Rouse_ @ Увы, не могут в рамках текущего аптайма Это что, то есть, если я породил 4 миллиарда короткоживущих процессов, то надо перегружать ось для продложения работы? *кричит "Маздай! Маздай!" и одевает шкуру пингвина* |
Сообщ.
#17
,
|
|
|
Цитата Mr.Delphist @ Это что, то есть, если я породил 4 миллиарда короткоживущих процессов, то надо перегружать ось для продложения работы? Эсперимент надо провести;) |
Сообщ.
#18
,
|
|
|
Цитата Mr.Delphist @ Это что, то есть, если я породил 4 миллиарда короткоживущих процессов, то надо перегружать ось для продложения работы? Не надо утрировать. GetTickCount тоже выдает максимум 4 миллиарда мсек (~50 суток) непрерывной работы, а затем просто переходит на 0. Видимо и с PID тоже самое - искусственно ограничивать диапазон и повторять не имеет смысла, а если переполнится через несколько месяцев непрерывной работы, то и фиг с ним |
Сообщ.
#19
,
|
|
|
leo, проверяется легко.
В цикле стартуем краткосрочный процесс, запоминая его ID и не забывая все закрывать. Смотрим был уже такой или нет. IMHO, не так уж и много итераций понадобиться, дабы поймать повторение. P.S. Сама не пробовала, совсем времени нет сейчас |
Сообщ.
#20
,
|
|
|
Цитата Riply @ Сама не пробовала, совсем времени нет сейчас А откуда тогда уверенность, что "не так уж и много итераций понадобиться" ? |
Сообщ.
#21
,
|
|
|
Цитата leo @ А откуда тогда уверенность, что "не так уж и много итераций понадобиться" ? "И опыт, сын ошибок трудных" (с) Сто лет назад ловила глюк при построении дерева процессов (XP SP1) |
Сообщ.
#22
,
|
|
|
Вопрос: Как этой функцией (в начале темы) узнать Handle окна запущенной программы и вывести вместе с её PID ?
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; В моём варианте использую её так: if OpenDialog1.Execute then begin ProgID:= StartProccess(OpenDialog1.FileName); end |
Сообщ.
#23
,
|
|
|
EnumWindows + GetWindowProcessID, но не забывать, что у любого процесса м.б. куча окон.
|