На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> PID моего процесса , узнать PID моего процесса
    Здравствуйте.
    Проблема в следующем есть запускаемый процесс, но в диспетчере задач, может быть несколько процессов с таким именем. Как мне определить PID нужного процесса, например зная размещение exe файла ?
      Вначале узнать handle, а потом GetWindowThreadProcessId.
        Taking a Snapshot and Viewing Processes
        это вообще.

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

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

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

            Что именно вызывает затруднения ?
              ExpandedWrap disabled
                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 в случае успеха.
              Кстати, отсюда же можно запомнить и дескриптор процесса, если нужен. Потом только не забыть закрыть по ненадобности.
                Цитата arj99 @
                Потом только не забыть закрыть по ненадобности.


                PID ведь не надо закрывать, только дескриптор. Или я ошибаюсь?
                  Цитата arj99 @
                  Кстати, отсюда же можно запомнить и дескриптор процесса, если нужен.
                  Потом только не забыть закрыть его (дескриптор) по ненадобности.
                  Сообщение отредактировано: arj99 -
                    Цитата Демо @
                    PID ведь не надо закрывать, только дескриптор. Или я ошибаюсь?

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


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

                        А PID вообще зачем нужен-то?
                        Сообщение отредактировано: Демо -
                          Цитата Riply @
                          Они генерируются системой авоматически и могут, даже повторяться (если процесс с данным PID уже закрыт).

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

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

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

                            ___________


                            Я имел ввиду - автору-то зачем? Для удовлетворения любопытства?
                              если тебе свой пид надо то используй GetCurrentProcessID
                                Всем спасибо за помощь, особенно, arj99 разобрался с CreateProcess :)
                                Сообщение отредактировано: vodovorot -
                                  Цитата Rouse_ @
                                  Увы, не могут в рамках текущего аптайма

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

                                  *кричит "Маздай! Маздай!" и одевает шкуру пингвина*
                                    Цитата Mr.Delphist @
                                    Это что, то есть, если я породил 4 миллиарда короткоживущих процессов, то надо перегружать ось для продложения работы?


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

                                      Не надо утрировать. GetTickCount тоже выдает максимум 4 миллиарда мсек (~50 суток) непрерывной работы, а затем просто переходит на 0. Видимо и с PID тоже самое - искусственно ограничивать диапазон и повторять не имеет смысла, а если переполнится через несколько месяцев непрерывной работы, то и фиг с ним ;)
                                      Сообщение отредактировано: leo -
                                        leo, проверяется легко.
                                        В цикле стартуем краткосрочный процесс, запоминая его ID и не забывая все закрывать.
                                        Смотрим был уже такой или нет. IMHO, не так уж и много итераций понадобиться, дабы поймать повторение.
                                        P.S.
                                        Сама не пробовала, совсем времени нет сейчас :(
                                          Цитата Riply @
                                          Сама не пробовала, совсем времени нет сейчас

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


                                            "И опыт, сын ошибок трудных" (с) :)
                                            Сто лет назад ловила глюк при построении дерева процессов (XP SP1)
                                              Вопрос: Как этой функцией (в начале темы) узнать Handle окна запущенной программы и вывести вместе с её PID ?

                                              ExpandedWrap disabled
                                                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;


                                              В моём варианте использую её так:
                                              ExpandedWrap disabled
                                                if OpenDialog1.Execute then
                                                    begin
                                                      ProgID:= StartProccess(OpenDialog1.FileName);
                                                    end
                                              Сообщение отредактировано: Aqel -
                                                EnumWindows + GetWindowProcessID, но не забывать, что у любого процесса м.б. куча окон.
                                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                  0 пользователей:


                                                  Рейтинг@Mail.ru
                                                  [ Script execution time: 0,0534 ]   [ 17 queries used ]   [ Generated: 28.03.24, 13:06 GMT ]