![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Открытие родительского процеса. [D5, Win95/98, WinME, NT4, Win2k, WinXP]
Erik © (2004-03-22 11:57:00)У меня создан модуль автообновления, который для перезаписи основной программы использует, дополнительный процес. При запуска этому процесу в командной строке передается ID родителя. После дочерний поцес ждет завершения водителя и после этого, копирует нужный exe. Все работало хорошо до появления в нашй фирме XP. Видать она по другому работает с SecurityAttributes? Как это сделать правильно на всех платформах?
Код запуска ребенка:
ProcessID := GetCurrentProcessID;
ZeroMemory(@SI, SizeOf(SI));
SI.cb := SizeOf(SI);
SI.dwFlags := STARTF_USESHOWWINDOW;
SI.wShowWindow := SW_HIDE;
//--- решит ли этот блок проблему на всех платхормах?
SecAtrib.nLength := SizeOf(SecAtrib);
SecAtrib.bInheritHandle := True;
SecAtrib.lpSecurityDescriptor := 0; //@pSD
//---
CmdParam := FExtractor + ' ' + IntToStr(ProcessID) + ' ' + fArhiv;
CreateProcess(nil, PChar(CmdParam), @SecAtrib, @SecAtrib, False,
CREATE_DEFAULT_ERROR_MODE, nil, PChar(ExtractFilePath(ParamStr(0))), SI, PI)
Код ожидания завершения родителя:
ProcessID := StrToInt64(ParamStr(1));
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID); //
LastErr := GetLastError;
PNormal := LastErr = 0;
if not PNormal then
Report('Error opening process. Code:' + IntToStr(GetLastError));
LastErr := WaitForSingleObject(ProcessHandle, INFINITE); //
GetExitCodeProcess(ProcessHandle, ExitCode);
......
P.S
Может есть возможность както по другому узнать родителя? Непередавая ID через командную строку?
Erik (2004-03-22 15:52:00) [1]Могу сказать, что сейчас на 2000
Error opening process. Code:87
Erik (2004-03-22 13:40:00) [2]Что происходит на XP непонятно, в лог ничего ненаписал Exception невыдал. Наиболее рабочий вариант CreateProcess(nil, PChar(CmdParam), nil, nil, False, ...)
Работает на 95, 98, 2000.
Что с правами непорядок это и ежу понятно.
Юрий Зотов (2004-03-22 12:55:00) [3]Похоже, у порожденного процесса недостаточно прав (то есть, родительский должен выставить флаги доступа к себе). А что говорит GetLastError?
Erik (2004-03-22 12:30:00) [4]Так у меня так и было! Я в любом случае закрываю PI
if CreateProcess(nil, PChar(CmdParam), @SecAtrib, @SecAtrib, False,
CREATE_DEFAULT_ERROR_MODE, nil, PChar(ExtractFilePath(ParamStr(0))), SI, PI) then
begin
Win32Check(CloseHandle(PI.hThread));
Win32Check(CloseHandle(PI.hProcess));
end
else
begin
raise Exception.Create('Error run extractor:'
+IntToStr(GetLastError));
end;
Неработает в XP открытие процеса! OpenProcess(PROCESS_ALL_ACCESS, false, ProcessID)
Юрий Зотов (2004-03-22 12:24:00) [5]Не нужно запускать процесс, как дочерний. Сделайте наоборот - все PSecurityAttributes равны nil и сразу после CreateProcess вызывайте CloseHandle для PI.hThread и PI.hProcess, полностью отцепляясь от порожденного процесса. CREATE_DEFAULT_ERROR_MODE тоже лишнее, пишите ноль (все будет правильно по умолчанию).
Erik (2004-03-22 12:16:00) [6]Появилась дополнительная информация, если добавить SecAtrib от Extractor вобще незапускается! :(
Отлаживать мне очень неудобно, приходится бегать на другой компютер с XP. Кто делал подобное поделитесь.