Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] CreateProcess и WaitForSingleObject (http://forum.oszone.net/showthread.php?t=227526)

che.ramzes 10-02-2012 16:42 1855681

CreateProcess и WaitForSingleObject
 
Помогите пожалуйста, не понятка каято
запускаю инсталятор програмы с помощью 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 1855695

попробуйте так

Код:

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


che.ramzes 11-02-2012 14:27 1856249

Цитата:

Цитата ferget
попробуйте так
Код:
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess); »

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

ferget 11-02-2012 17:58 1856396

можно убрать WaitForSingleObject, сделать функцию которая проверяет, что процесс уже завершился и затем CloseHandle

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

che.ramzes 15-02-2012 23:56 1859801

вопшем WaitForSingleObject какимто образо не дает програме установится полностю. Запускал через кучу дочерних процнсов но результат один - не хотат регистрироватся шришты.
Цитата:

Цитата ferget
можно убрать WaitForSingleObject, сделать функцию которая проверяет, что процесс уже завершился и затем CloseHandle »

Вот пошарил в нете и немного переделал, мож кому пригодится
это
Код:

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

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


Время: 15:07.

Время: 15:07.
© OSzone.net 2001-