Войти

Показать полную графическую версию : [решено] CreateProcess и WaitForSingleObject


che.ramzes
10-02-2012, 16:42
Помогите пожалуйста, не понятка каято
запускаю инсталятор програмы с помощью CreateProcess и дожидаюсь с помощью WaitForSingleObject
procedure TForm1.Button2Click(Sender: TObject);
var si: TStartupInfo; pi: TProcessInformation;
begin
ZeroMemory(@si,sizeof(si));
si.cb := SizeOf(si);
CreateProcess('H:\Install\Face\ChangeLogonSetup.exe', nil ,nil,
nil,false, 0, nil,nil,si,pi);
CloseHandle(pi.hThread);
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
end.

програма запускается нормально. Но в конце установки она регистрирует шрифты в реестре и на етом замирает
Вырубаю Project1.exe в диспетчере задач - шрифты тут же зарегистрировались, все конец установки.
Пробовал прописовать без WaitForSingleObject - все OK.
Пробовал путь писать в параметр Name потом commandline безразницы.
Ятак понимаю WaitForSingleObject не дает поге зарегать шрифты вот она и зависает.
Что можно сделать?

ferget
10-02-2012, 16:58
попробуйте так


WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);

che.ramzes
11-02-2012, 14:27
попробуйте так
Код:
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess); »

Я так с самого начала пробовал - не получается тоже. на одном сайте вычитал что лишний handle можно закрыть потому так и написал.

ferget
11-02-2012, 17:58
можно убрать WaitForSingleObject, сделать функцию которая проверяет, что процесс уже завершился и затем CloseHandle

или посмотреть в отладчике, что происходит когда программа регистрирует шрифты в реестре и разобраться почему это мешает WaitForSingleObject

che.ramzes
15-02-2012, 23:56
вопшем WaitForSingleObject какимто образо не дает програме установится полностю. Запускал через кучу дочерних процнсов но результат один - не хотат регистрироватся шришты.
можно убрать WaitForSingleObject, сделать функцию которая проверяет, что процесс уже завершился и затем CloseHandle »
Вот пошарил в нете и немного переделал, мож кому пригодится
это

var
....
ExitCode: Cardinal;
begin
...
while (GetExitCodeProcess(PI.hProcess, ExitCode)) and (ExitCode = STILL_ACTIVE) do
begin
Application.ProcessMessages;
Sleep(1);
end;

тема решена, но все же осталось много вопросов???




© OSzone.net 2001-2012