Форум: "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