|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
CreateProcess. Запуск .msi и .bat файлов
Добрый день! Возможно ли через CreateProcess запустить .msi и .bat файлы? ShellExecute мне для этой цели не очень подходит, т.к. нужно дожидаться окончания выполнения запущенного файла.
|
#2
|
||||
|
||||
*.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
|
||||
|
||||
можно:
Код:
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; Пишу программы за еду. __________________ |