Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Открытие родительского процеса. [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. Кто делал подобное поделитесь.


Наверх

Титульная страница Поиск, карта сайта Написать письмо