Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Найти дочерний процесс


Александр69   (11.10.17 13:41

Прошу помочь. Много лет пользуюсь загрузчиком для оперы собственной разработки, но появилась проблема. Раньше запускал опера.exe  функцией CreateProcess, получал хендл дочернего процесса и его контролировал. Но теперь Опера нахимичила и получается что после запуска процесса опера.ехе похоже запускает дочерний процесс и сама убивается. В результате родителем дерева процессов Опера становится десктоп. Как мне гарантировано отследить это и остаться родительским процессом имея хендл процесса, которого я напрямую не создавал??
Просто желающие помочь скачайте с сайта оперы последнюю версию и запустите ее через CreateProcess и сами поймете, посмотрев дерево процессов. Последняя нормально запускаемая версия оперы - 44.0.2510.1449.


Игорь Шевченко ©   (12.10.17 10:28[1]

В Windows нет понятия родительский/дочерний процесс


Александр69   (12.10.17 13:53[2]

Охренеть ответ...и с каких это пор


Игорь Шевченко ©   (12.10.17 18:54[3]

https://www.e-reading.club/chapter.php/89563/22/Russinovich%2C_Solomon_-_1.Vnutrennee_ustroiistvo_Windows_%28gl._1-4%29.html

"Каждый процесс также указывает на свой родительский процесс (процесс-создатель). Однако, если родитель существует, эта информация не обновляется. Поэтому есть вероятность, что некий процесс указывает на уже несуществующего родителя. Это не создает никакой проблемы, поскольку никто не полагается на наличие такой информации"


Александр69   (12.10.17 20:33[4]

Из этого никак не следует что "В Windows нет понятия родительский/дочерний процесс", так как и в статье и в ваших аргументах используется именно эти термины. А если родитель пропал, это не значит что его не было. Короче это все чушь, если нет ответа по сути, просьба воздержаться от комментариев.


Игорь Шевченко ©   (12.10.17 21:14[5]


> Короче это все чушь


Тогда я процитирую Таненбаума: "В операционной системе Windows 2000 е поддерживается какой-либо иерархии процессов, например "родительский-дочерний". Все созданные процессы равны (не существует процессов, более равных, чем другие). Однако, поскольку один из 18 параметров, возвращаемых вызывающему процессу, представляет собой дескриптор нового процесса (что предоставляет контроль над новым процессом), существует негласная иерархия, заключающаяся в том, кто чьим дескриптором владеет. Хотя эти дескрипторы не могут напрямую передаваться другим процессам, у процесса есть способ создать дубликат дескриптора. Дубликат дескриптора может быть передан другому процессу и использоваться им, поэтому неявная иерархия процессов может просуществовать недолго."

Из всего процитированного ответ на исходный вопрос только один - нет такой возможности контролировать что-либо, созданное вызванным через CreateProcess процессом, в том числе и созданные им процессы.


Александр69   (13.10.17 06:53[6]

Это все теоризирование...меня интерисует практическая сторона вопроса, а именно как указано выше "представляет собой дескриптор нового процесса (что предоставляет контроль над новым процессом)". На практике , по крайней мере я, гарантировано могу завершить лишь дочерний процесс, а не тот, пид которого я знаю. То что иерархия не гарантируется меня мало интересует, смена родителя или создание дубриката дескриптора это как я понимаю сознательное действие программиста а не забавы операционки. Гравное чтобы опера этого не делала и все.


Leonid Troyanovsky ©   (13.10.17 08:23[7]


> Александр69   (13.10.17 06:53) [6]

> лишь дочерний процесс, а не тот, пид которого я знаю.

Открой для себя OpenProcess.

--
Regards, LVT.


Александр69   (13.10.17 09:27[8]

Вот вся это хрень не помогает:

function TerminateProgram(dwPID: DWORD; dwTimeout: DWORD): DWORD;
const
 TA_FAILED = 0;
 TA_SUCCESS_CLEAN = 1;
 TA_SUCCESS_KILL = 2;
 TA_SUCCESS_16 = 3;
var
 hProc: THandle;

 function TerminateProgramEnum(Window: HWND; lParam: LPARAM): Bool; stdcall;
 var
   dwID: DWORD;
 begin
   GetWindowThreadProcessId(Window, @dwID);
   if dwID = DWORD(lParam) then
     PostMessage(Window, WM_CLOSE, 0, 0);
   Result := True;
 end;
begin
 hProc := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, FALSE, dwPID);
 if (hProc <> 0) then
 try
   EnumWindows(@TerminateProgramEnum, dwPID);
   if WaitForSingleObject(hProc, dwTimeout) <> WAIT_OBJECT_0 then
   begin
     if TerminateProcess(hProc, 0) then
       Result := TA_SUCCESS_KILL
     else
       Result := TA_FAILED
   end
   else
     Result := TA_SUCCESS_CLEAN
 finally
   CloseHandle(hProc)
 end
esult := TA_FAILED
end;   else
   R

function KillTask(ExeFileName: string): integer;
const
 PROCESS_TERMINATE = $0001;
var
 ContinueLoop: BOOL;
 FSnapshotHandle: THandle;
 FProcessEntry32: TProcessEntry32;
begin
 result := 0;

 FSnapshotHandle := CreateToolhelp32Snapshot
   (TH32CS_SNAPPROCESS, 0);
 FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
 ContinueLoop := Process32First(FSnapshotHandle,
   FProcessEntry32);

 while integer(ContinueLoop) <> 0 do
 begin
   if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
     UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
     UpperCase(ExeFileName))) then
     result := TerminateProgram(FProcessEntry32.th32ProcessID, 0);
   ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
 end;

 CloseHandle(FSnapshotHandle);

 try
   WinExec(PANsiChar('TASKKILL /F /IM ' + ExeFileName), SW_HIDE);
 except
 end;

end;


Leonid Troyanovsky ©   (14.10.17 08:32[9]


> Александр69   (13.10.17 09:27) [8]

> Вот вся это хрень не помогает

Ужас.

А опера где?

--
Regards, LVT.


Rouse_ ©   (14.10.17 09:39[10]


> Игорь Шевченко ©   (12.10.17 10:28) [1]
> В Windows нет понятия родительский/дочерний процесс

И давно?


> Александр69

http://forum.sources.ru/index.php?s=d0c16bb2e0e552b03f6ad554d1d44880&showtopic=209024&view=findpost&p=17 53628


Rouse_ ©   (14.10.17 09:40[11]

Блин, кривая ссылка, чет у исходников поломалось все, короче седьмой пост:
http://forum.sources.ru/index.php?showtopic=209024


Rouse_ ©   (14.10.17 09:42[12]

Ну соответственно перебор процесов и по ним смотри родителя - так найдешь дочерний


Игорь Шевченко ©   (14.10.17 10:23[13]


> И давно?


С самого начала


Inovet ©   (14.10.17 11:13[14]

Розыч и ИШ, вопрос терминологии - есть или нет. У автора конкретная задача - он хочет чтобы Опера работала так, как он привык, а есть или нет в данный момент родительский процесс, не волнует. В общем как обычно: Я хочу, а вы все демамоги.


Александр69   (14.10.17 15:10[15]

Чет испорченый телефон...мне не надо искать родителя процесса- я и есть родитель. Мне надо чтобы дочерний процесс (опера)  оставался дочерним, для полного контроля. ВОТ И ВСЕ. Проблема в том в новых версиях оперы при запуске опера дочерний процесс как бы промежуточный, он порождает дерево процессов опера и убивается сам.


Inovet ©   (14.10.17 15:29[16]

> [15] Александр69   (14.10.17 15:10)

О чём тебе и говорят умные книжки - не надо надеяться на присутсвие родителя.

Может получится разрулить объектами синхронизации.


QAZ ©   (14.10.17 17:02[17]

ну все же просто, ё маё...
опера наверняка запускает этот свой второй процесс с конкретной командной строкой
соответственно меняешь свой opera.exe на opera.exe /x /y /chegototam:65 и все... живешь дальше как раньше, с непонятно для чего написаным запускатором
:)


Александр69   (14.10.17 17:30[18]

"соответственно меняешь свой opera.exe на opera.exe /x /y /chegototam:65 и все... живешь дальше как раньше, "
что имеется ввиду не понял


Александр69   (14.10.17 17:37[19]

"с непонятно для чего написаным запускатором" я конечно могу здесь подробно пояснить, оно вам это надо? Если вкратце - для работы с опера на рабочем компе, возможен доступ других лиц. Реализована работа оперы с профилем внутри автоматом подключаемого и отключаемого контейнера TrueCrypt. Есть таймаут бездействия и т.д. Можно спокойно синхронизироваться с домом. Не кому не навязываю, но мне так удобно много лет. Надо контролировать дочерний процесс и гарантировано прибивать.


QAZ ©   (14.10.17 18:09[20]


> что имеется ввиду не понял

что непонятного, это содержимое CreateProcess


Александр69   (14.10.17 20:23[21]

"что непонятного, это содержимое CreateProcess" Вы вообще о чем, какое отношение это имеет к проблеме. У меня большая к вам просьба, или почитайте вопрос и напрягитесь понять о чем речь, или воздержитесь от комментариев. Вот уже 20 постов, не имеющих отношения к теме. Если нет ни у кого решения, зачем писать что - то типа "да нафига это надо". У вас нет достаточной информации, вы не видели исходники, чтобы коверкать постановку вопроса. Если здесь есть профи а не балаболы то прошу помочь. Если нет то тема закрыта.


Игорь Шевченко ©   (14.10.17 20:58[22]


> Мне надо чтобы дочерний процесс (опера)  оставался дочерним,
>  для полного контроля. ВОТ И ВСЕ.


Попробуй запустить его как Job (я очень сильно не уверен, но вдруг)

https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms682409(v=vs.85).aspx
https://msdn.microsoft.com/ru-ru/library/windows/desktop/ms681949(v=vs.85).aspx


Leonid Troyanovsky ©   (15.10.17 08:39[23]


> Александр69   (14.10.17 20:23) [21]

> "что непонятного, это содержимое CreateProcess" Вы вообще
> о чем, какое отношение это имеет к проблеме. У меня большая
> к вам просьба, или почитайте вопрос и напрягитесь понять
> о чем речь, или воздержитесь от комментариев. Вот уже 20
> постов, не имеющих отношения к теме. Если нет ни у кого
> решения, зачем писать что - то типа "да нафига это надо".
>  У вас нет достаточной информации, вы не видели исходники,
>  чтобы коверкать постановку вопроса. Если здесь есть профи
> а не балаболы то прошу помочь. Если нет то тема закрыта.


А как тут можно помочь?

Вот, например, Гамлет не ограничился беседами с тенью  своего отца,
а производил некоторые осмысленные действия.

За 20 постов уважаемый топикстартер так и не рассказал, какие
параметры были у CreateProcess, и какие секретные манипуляции
осуществлялись с искомым хендлом.

Не был показан и уровень подготовки, достаточный для OpenProcess
хотя бы с целью терминирования.

Чем же тут поможешь?

--
Regards, LVT.


QAZ ©   (15.10.17 11:03[24]


> Александр69   (14.10.17 20:23) [21]

вообще печально когда "прогромист" не шарит вообще как работает система под которую он "прогромист" и от этого не может понять что ему пишут профи типа меня
вторую строку из [17] читаем до полного просветления


QAZ ©   (15.10.17 11:55[25]

ладно, так и быть сменю гнев на милость
вот так выглядит командная строка для запуска главного процеса без промежуточного
"C:\Program Files\Opera\48.0.2685.39\opera.exe" --ran-launcher
подчеркнутое заменить на свое


Inovet ©   (15.10.17 13:04[26]

> [25] QAZ ©   (15.10.17 11:55)

Ты демагог. Полный код давай.


QAZ ©   (15.10.17 13:13[27]


> Inovet ©   (15.10.17 13:04) [26]

он у него уже "много лет" есть :)
или мне за него нужно в CreateProcess вставить эту строку?


Александр69   (15.10.17 13:32[28]

Удалено модератором


версия для печати
Обсуждение закрыто


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо