-
Прошу помочь. Много лет пользуюсь загрузчиком для оперы собственной разработки, но появилась проблема. Раньше запускал опера.exe функцией CreateProcess, получал хендл дочернего процесса и его контролировал. Но теперь Опера нахимичила и получается что после запуска процесса опера.ехе похоже запускает дочерний процесс и сама убивается. В результате родителем дерева процессов Опера становится десктоп. Как мне гарантировано отследить это и остаться родительским процессом имея хендл процесса, которого я напрямую не создавал?? Просто желающие помочь скачайте с сайта оперы последнюю версию и запустите ее через CreateProcess и сами поймете, посмотрев дерево процессов. Последняя нормально запускаемая версия оперы - 44.0.2510.1449.
-
В Windows нет понятия родительский/дочерний процесс
-
Охренеть ответ...и с каких это пор
-
-
Из этого никак не следует что "В Windows нет понятия родительский/дочерний процесс", так как и в статье и в ваших аргументах используется именно эти термины. А если родитель пропал, это не значит что его не было. Короче это все чушь, если нет ответа по сути, просьба воздержаться от комментариев.
-
> Короче это все чушь
Тогда я процитирую Таненбаума: "В операционной системе Windows 2000 е поддерживается какой-либо иерархии процессов, например "родительский-дочерний". Все созданные процессы равны (не существует процессов, более равных, чем другие). Однако, поскольку один из 18 параметров, возвращаемых вызывающему процессу, представляет собой дескриптор нового процесса (что предоставляет контроль над новым процессом), существует негласная иерархия, заключающаяся в том, кто чьим дескриптором владеет. Хотя эти дескрипторы не могут напрямую передаваться другим процессам, у процесса есть способ создать дубликат дескриптора. Дубликат дескриптора может быть передан другому процессу и использоваться им, поэтому неявная иерархия процессов может просуществовать недолго."
Из всего процитированного ответ на исходный вопрос только один - нет такой возможности контролировать что-либо, созданное вызванным через CreateProcess процессом, в том числе и созданные им процессы.
-
Это все теоризирование...меня интерисует практическая сторона вопроса, а именно как указано выше "представляет собой дескриптор нового процесса (что предоставляет контроль над новым процессом)". На практике , по крайней мере я, гарантировано могу завершить лишь дочерний процесс, а не тот, пид которого я знаю. То что иерархия не гарантируется меня мало интересует, смена родителя или создание дубриката дескриптора это как я понимаю сознательное действие программиста а не забавы операционки. Гравное чтобы опера этого не делала и все.
-
> Александр69 (13.10.17 06:53) [6]
> лишь дочерний процесс, а не тот, пид которого я знаю.
Открой для себя OpenProcess.
-- Regards, LVT.
-
Вот вся это хрень не помогает:
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;
-
> Александр69 (13.10.17 09:27) [8]
> Вот вся это хрень не помогает
Ужас.
А опера где?
-- Regards, LVT.
-
-
-
Ну соответственно перебор процесов и по ним смотри родителя - так найдешь дочерний
-
> И давно?
С самого начала
-
Розыч и ИШ, вопрос терминологии - есть или нет. У автора конкретная задача - он хочет чтобы Опера работала так, как он привык, а есть или нет в данный момент родительский процесс, не волнует. В общем как обычно: Я хочу, а вы все демамоги.
-
Чет испорченый телефон...мне не надо искать родителя процесса- я и есть родитель. Мне надо чтобы дочерний процесс (опера) оставался дочерним, для полного контроля. ВОТ И ВСЕ. Проблема в том в новых версиях оперы при запуске опера дочерний процесс как бы промежуточный, он порождает дерево процессов опера и убивается сам.
-
> [15] Александр69 (14.10.17 15:10)
О чём тебе и говорят умные книжки - не надо надеяться на присутсвие родителя.
Может получится разрулить объектами синхронизации.
-
ну все же просто, ё маё... опера наверняка запускает этот свой второй процесс с конкретной командной строкой соответственно меняешь свой opera.exe на opera.exe /x /y /chegototam:65 и все... живешь дальше как раньше, с непонятно для чего написаным запускатором :)
-
"соответственно меняешь свой opera.exe на opera.exe /x /y /chegototam:65 и все... живешь дальше как раньше, " что имеется ввиду не понял
-
"с непонятно для чего написаным запускатором" я конечно могу здесь подробно пояснить, оно вам это надо? Если вкратце - для работы с опера на рабочем компе, возможен доступ других лиц. Реализована работа оперы с профилем внутри автоматом подключаемого и отключаемого контейнера TrueCrypt. Есть таймаут бездействия и т.д. Можно спокойно синхронизироваться с домом. Не кому не навязываю, но мне так удобно много лет. Надо контролировать дочерний процесс и гарантировано прибивать.
|