Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.02.2014, 14:53
Аватар для nerZEROn
nerZEROn nerZEROn вне форума
Прохожий
 
Регистрация: 23.12.2013
Сообщения: 9
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию CreateProcess. Запуск .msi и .bat файлов

Добрый день! Возможно ли через CreateProcess запустить .msi и .bat файлы? ShellExecute мне для этой цели не очень подходит, т.к. нужно дожидаться окончания выполнения запущенного файла.
Ответить с цитированием
  #2  
Старый 07.02.2014, 14:59
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

*.bat точно можно, я запускал вот так:
Код:
procedure RunConsoleApplicationTime(CmdLine,Params:String;OutStrings:TStrings;TimeOut:DWORD);
var
  securityattributes: TSecurityAttributes;
  startupinfo: TStartupInfo;
  processinformation: TProcessInformation;
  hPipeInputRead: THandle;
  hPipeInputWrite: THandle;
  hPipeOutputRead: THandle;
  hPipeOutputWrite: THandle;
  WaitResult:Cardinal;
  AnsiBuf: TAnsiBuf;
  CharBuf: TCharBuf;
  dummy: Cardinal;
  s:string;
begin
  securityattributes.nLength:=SizeOf(TSecurityAttributes);
  securityattributes.lpSecurityDescriptor:=nil;
  securityattributes.bInheritHandle:=True;
  CreatePipe(hPipeInputRead, hPipeInputWrite, @securityattributes, 0);
  CreatePipe(hPipeOutputRead, hPipeOutputWrite, @securityattributes, 0);
  ZeroMemory(@startupinfo, SizeOf(TStartupInfo));
  ZeroMemory(@processinformation, SizeOf(TProcessInformation));
  with startupinfo do
    begin
      cb:=SizeOf(TStartupInfo);
      dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow:=SW_HIDE;
      hStdInput:=hPipeInputRead;
      hStdOutput:=hPipeOutputWrite;
      hStdError:=hPipeOutputWrite;
    end;
  OutStrings.BeginUpdate;
  OutStrings.Append(CmdLine+' '+Params);
  OutStrings.EndUpdate;
  if CreateProcess(nil, PChar(CmdLine+' '+Params), nil, nil, True, CREATE_NEW_CONSOLE,
    nil, PChar(ExtractFileDir(CmdLine)), startupinfo, processinformation) then
    begin
      WaitResult:=WaitForSingleObject(processinformation.hProcess, TimeOut);
      if WaitResult=WAIT_TIMEOUT then
        begin
          if ReadFile(hPipeOutputRead, AnsiBuf, Length(AnsiBuf), dummy, nil) then
            begin
              AnsiBufToCharBuf(AnsiBuf, CharBuf, dummy);
              OutStrings.BeginUpdate;
              OutStrings.Text:=OutStrings.Text+Copy(CharBuf, 1, dummy);
              if Pos(#8,OutStrings.Text)>0 then  //<---------
                begin                            //<---------
                  s:=OutStrings.Text;            //<---------
                  Delete(s,Pos(#8,s)-3,4);       //<---------
                  OutStrings.Text:=s;            //<---------
                end;                             //<---------
              OutStrings.EndUpdate;
            end;
          OutStrings.Append('Выход по таймауту');
          TerminateProcess(processinformation.hProcess,0);
          Sleep(10000);
        end
      else
        begin
          if ReadFile(hPipeOutputRead, AnsiBuf, Length(AnsiBuf), dummy, nil) then
            begin
              AnsiBufToCharBuf(AnsiBuf, CharBuf, dummy);
              OutStrings.BeginUpdate;
              OutStrings.Text:=OutStrings.Text+Copy(CharBuf, 1, dummy);
              if Pos(#8,OutStrings.Text)>0 then  //<---------
                begin                            //<---------
                  s:=OutStrings.Text;            //<---------
                  Delete(s,Pos(#8,s)-3,4);       //<---------
                  OutStrings.Text:=s;            //<---------
                end;                             //<---------
              OutStrings.EndUpdate;
            end;
        end;
      CloseHandle(processinformation.hProcess);
    end
  else
    begin
      OutStrings.BeginUpdate;
      OutStrings.Append(SysErrorMessage(GetLastError));
      OutStrings.EndUpdate;
    end;
  CloseHandle(hPipeInputWrite);
  CloseHandle(hPipeInputRead);
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeOutputRead);
end;
лишнее повыбрасываешь
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 07.02.2014, 15:04
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

можно:

Код:
var
  si: STARTUPINFO;
  pi: PROCESS_INFORMATION;
begin
  ZeroMemory(@si, SizeOf(STARTUPINFO));
  si.cb:=SizeOf(STARTUPINFO);
  si.dwFlags:=STARTF_USESHOWWINDOW;
  si.wShowWindow:=SW_HIDE;
  if not CreateProcess(nil, 'cmd /c "полный путь\file.msi"', nil, nil, False, 0, nil, nil, si, pi) then RaiseLastOSError;
  WaitForSingleObject(pi.hProcess, INFINITE);
  CloseHandle(pi.hThread);
  CloseHandle(pi.hProcess);
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:10.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter