Главная страница
    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.04 c
14-1082524697
Nikolay M.
2004-04-21 09:18
2004.05.09
"Корпоративные базы данных-2004" - кто идет?


1-1082717242
афвуд
2004-04-23 14:47
2004.05.09
Как установить дробный разделитель для чисел в своей проге?


4-1079637405
3APA3A
2004-03-18 22:16
2004.05.09
Найти процесс...


3-1081881095
mouse_web
2004-04-13 22:31
2004.05.09
Как использовать БД без BDE Administrator?


1-1082971123
BALU1111
2004-04-26 13:18
2004.05.09
Как запретить запуск дубликата программы?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский