Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > несколько процессов последовательно


Автор: Black_Joker 2.6.2005, 17:15
Подскажите, как можно запустить несколько процессов последовательно

Мне нужно открыть pdf-файл. Если просмотрщик не установлен, то установить и запустить pdf.

Я сделал, но не уверен в корректности.


Код

if FindExecutable('prezent.pdf', nil, str) < 32 then
begin
 shellExecute(Handle, 'open', 'acrobat.exe', nil, nil, SW_Restore);
 while FindExecutable('prezent.pdf', nil, str) < 32 do;
end;
shellExecute(Handle, nil, 'prezent.pdf', nil, nil, SW_Showmaximized);

Автор: poor_yorik 2.6.2005, 18:03
Не уверен что данная строка будет устанавливать просмотрщик Adobe
shellExecute(Handle, 'open', 'acrobat.exe', nil, nil, SW_Restore);Она просто запустит программу Adobe Acrobat, но если просмотрщик pdf не настроен, то
строка shellExecute(Handle, nil, 'prezent.pdf', nil, nil, SW_Showmaximized); пахать не будет.
И совсем не понятно для чего предназначена строка
while FindExecutable('prezent.pdf', nil, str) < 32 do;
Прога же просто зависнет. Надо хотя бЫ вставить
while FindExecutable('prezent.pdf', nil, str) < 32 do Application.ProcessMessages; smile

Автор: Black_Joker 3.6.2005, 09:21
while FindExecutable('prezent.pdf', nil, str) < 32 do; - пауза.
Пока в системе не появится програма ассоциированняа с prezent.pdf

Автор: poor_yorik 3.6.2005, 18:02
Black Joker пойми, программа не будет обращаться к системе, пока не выполнит пустой цикл. Я пытался у себя это сделать. Там где не было просмотрщика, но был Acrobat, произошло зацикливание.

Автор: Marriage 6.6.2005, 16:50
Цитата
Waits for the thread to terminate and then returns the value of the ReturnValue property.

function WaitFor: LongWord;

Description

Call WaitFor to obtain the value of ReturnValue when the thread finishes executing. WaitFor doesn't return until the thread terminates, so the thread must exit either by finishing the Execute method or by exiting when the Terminated property is True.
(Взято их HELPа для Delphi)


Это поможет ???

Автор: Black_Joker 8.6.2005, 08:46
мне нужно
1. запустить новый процесс (инсталяху) и запомнить ее идентификатор
2. узнать когда процесс закончен (закончен / прерван)
3. открыть документ (pdf).


Как это сделать? smile

Автор: _hunter 8.6.2005, 10:35
1. CreateProcess() и смотрим PROCESS_INFORMATION
2. WaitForSingleObject()
3. не понял

Автор: Black_Joker 9.6.2005, 09:50
Пример можно?

Автор: _hunter 9.6.2005, 11:01
пример -- ищем по форуму. темы и о запуске приложения и о ожидании его завершения уже не раз поднимались

Автор: Girder 9.6.2005, 13:31
Код

uses ShellApi;

function InstAdobe(const Name:string):boolean;
var StartUpInfo:TStartupInfo;
    ProcessInfo:TProcessInformation;
    s:string;
begin
 Result:=false;
 FillChar(StartUpInfo,SizeOf(TStartUpInfo),0);
 StartUpInfo.cb:=SizeOf(TStartUpInfo);
 StartUpInfo.dwFlags:=STARTF_USESHOWWINDOW;
 StartUpInfo.wShowWindow:=SW_SHOW;
 s:=trim(Name);
 if CreateProcess(nil,PChar(s),nil,nil,false,NORMAL_PRIORITY_CLASS,nil,nil,StartUpInfo,ProcessInfo) then
  begin
   WaitForSingleObject(ProcessInfo.hProcess,INFINITE);
   Result:=true;
   CloseHandle(ProcessInfo.hThread);
   CloseHandle(ProcessInfo.hProcess);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if ShellExecute(handle,'open','E:\dd.pdf',nil,nil,SW_SHOWNORMAL)=SE_ERR_NOASSOC then
  if InstAdobe('e:\install.exe') then ShellExecute(handle,'open','E:\dd.pdf',nil,nil,SW_SHOWNORMAL);
end;

Автор: Black_Joker 10.6.2005, 09:31
Бльшое спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)