Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 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. Кто делал подобное поделитесь.


 
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 тоже лишнее, пишите ноль (все будет правильно по умолчанию).


 
Юрий Зотов ©   (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)


 
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?


 
Юрий Зотов ©   (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 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


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

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



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

Форум: "WinAPI";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.039 c
14-1082031385
p0tia
2004-04-15 16:16
2004.05.09
Переменная time


1-1082678989
Бегун
2004-04-23 04:09
2004.05.09
TListBox


14-1081939214
Лысый
2004-04-14 14:40
2004.05.09
Количество точек


3-1081763481
romeo
2004-04-12 13:51
2004.05.09
BDE, сволочь, вообще не хочет работать по локальной сети


8-1076589620
able
2004-02-12 15:40
2004.05.09
TImage сильно мерцает...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский