Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Открытие родительского процеса.   Найти похожие ветки 

 
Erik ©   (2004-03-22 11:57) [0]

У меня создан модуль автообновления, который для перезаписи основной программы использует, дополнительный процес. При запуска этому процесу в командной строке передается 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 12:16) [1]

Появилась дополнительная информация, если добавить SecAtrib от Extractor вобще незапускается! :(
 Отлаживать мне очень неудобно, приходится бегать на другой компютер с XP. Кто делал подобное поделитесь.


 
Юрий Зотов ©   (2004-03-22 12:24) [2]

Не нужно запускать процесс, как дочерний. Сделайте наоборот - все PSecurityAttributes равны nil и сразу после CreateProcess вызывайте CloseHandle для PI.hThread и PI.hProcess, полностью отцепляясь от порожденного процесса. CREATE_DEFAULT_ERROR_MODE тоже лишнее, пишите ноль (все будет правильно по умолчанию).


 
Erik ©   (2004-03-22 12:30) [3]

Так у меня так и было! Я в любом случае закрываю 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:55) [4]

Похоже, у порожденного процесса недостаточно прав (то есть, родительский должен выставить флаги доступа к себе). А что говорит GetLastError?


 
Erik ©   (2004-03-22 13:40) [5]

Что происходит на XP непонятно, в лог ничего ненаписал Exception невыдал. Наиболее рабочий вариант CreateProcess(nil, PChar(CmdParam), nil, nil, False, ...)
Работает на 95, 98, 2000.
Что с правами непорядок это и ежу понятно.


 
Erik ©   (2004-03-22 15:52) [6]

Могу сказать, что сейчас на 2000
Error opening process. Code:87



Страницы: 1 вся ветка

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.036 c
1-1080202303
MakNik
2004-03-25 11:11
2004.04.11
Декомпиляция проекта


7-1079454959
Iks
2004-03-16 19:35
2004.04.11
Как из биоса достать инфу о температуре компа


14-1079693529
Abros
2004-03-19 13:52
2004.04.11
Чем выше температура проца или видухи те больше косяков в играх?


1-1080146765
В л а д и м и р
2004-03-24 19:46
2004.04.11
MessageDlg: перенос строк сообщения


4-1075960605
Shi
2004-02-05 08:56
2004.04.11
Создан ли класс?