• Авторизация


Проблема с созданием процесса 15-11-2006 16:58 к комментариям - к полной версии - понравилось!


Хай, великий олл!
Проблема в следующем: моя программа должна запускать другую программу (обе - консольные приложения), после чего надо той, другой программе на стандартный вход передать некоторые параметры и, возможно, некий результат забрать с ее стандартного вывода. Как бы это сделать? В мсдн правильных параметров для CreateProcess я найти не смог... Может, плохо искал? :)

вверх^ к полной версии понравилось! в evernote
Комментарии (12):
mesca1ito 15-11-2006-17:07 удалить
rpcgen тебе поможет. там в мануалах подробно описано как создавать связку "клиент-сервер" для двух независимых утилит... оно есть во всех версиях BSD и в SysV.4+ и ее клонах.
Lightpower 15-11-2006-18:25 удалить
Просто вызывать вторую программу - посмори ShellExecute, параметры можно передать в командной строке Потом можно подождать выполнения и закрытия программы, используя WaitForSingleObject А вот забрать результат выполнения так просто нельзя (или я не знаю как). Как вариант - можно через файловый обмен Если нужно реально обмениваться данными с вызванной программой - используй Pipes или Sockets 2 IronClaw: раз уж Тузбубен ссылается на MSDN, то речь идет о винде, не согласен?
mesca1ito 15-11-2006-18:26 удалить
Lightpower, хех... что-то я провтыкал этот момент... )))
Valkin 15-11-2006-22:26 удалить
одним из параметров CreateProcess является LPSTARTUPINFO lpStartupInfo. У структуры STARTUPINFO есть такие поля: HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; Если структуру правильно заполнить, то можно получить все, что программа выводит в один из стандартных потоков вывода или записать что-то в ее входной поток. В качестве хэндлов могут быть файлы (созданные через CreateFile) или unnamed pipes. Вот здесь в MSDN есть пример.
Тузбубен 16-11-2006-07:26 удалить
да, естественно, речь о винде :) Valkin, я пробовал ей эти хэндлы передавать. Плюс, кроме прочего, мсдн велит инициализировать TRUE некоторые параметры CreateProcess. Но только то ли я не все, что нужно, проинициализировал, то ли еще что-то не сделал, но работать оно у меня отказалось :)
ZardoZ 16-11-2006-07:42 удалить
Вот пример - на Delphi, но какая разница. unit consoleoutput; interface uses Controls, Windows, SysUtils, Forms; function GetDosOutput(const CommandLine:string): string; implementation function GetDosOutput(const CommandLine:string): string; var SA: TSecurityAttributes; SI: TStartupInfo; PI: TProcessInformation; StdOutPipeRead, StdOutPipeWrite: THandle; WasOK: Boolean; Buffer: array[0..255] of Char; BytesRead: Cardinal; WorkDir, Line: String; begin Application.ProcessMessages; with SA do begin nLength := SizeOf(SA); bInheritHandle := True; lpSecurityDescriptor := nil; end; // создаём пайп для перенаправления стандартного вывода CreatePipe(StdOutPipeRead, // дескриптор чтения StdOutPipeWrite, // дескриптор записи @SA, // аттрибуты безопасности 0 // количество байт принятых для пайпа - 0 по умолчанию ); try // Создаём дочерний процесс, используя StdOutPipeWrite в качестве стандартного вывода, // а так же проверяем, чтобы он не показывался на экране. with SI do begin FillChar(SI, SizeOf(SI), 0); cb := SizeOf(SI); dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; wShowWindow := SW_HIDE; hStdInput := GetStdHandle(STD_INPUT_HANDLE); // стандартный ввод не перенаправляем hStdOutput := StdOutPipeWrite; hStdError := StdOutPipeWrite; end; // Запускаем компилятор из командной строки WorkDir := ExtractFilePath(CommandLine); WasOK := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil, PChar(WorkDir), SI, PI); // Теперь, когда дескриптор получен, для безопасности закрываем запись. // Нам не нужно, чтобы произошло случайное чтение или запись. CloseHandle(StdOutPipeWrite); // если процесс может быть создан, то дескриптор, это его вывод if not WasOK then raise Exception.Create('Could not execute command line!') else try // получаем весь вывод до тех пор, пока DOS-приложение не будет завершено Line := ''; repeat // читаем блок символов (могут содержать возвраты каретки и переводы строки) WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil); // есть ли что-нибудь ещё для чтения? if BytesRead > 0 then begin // завершаем буфер PChar-ом Buffer[BytesRead] := #0; // добавляем буфер в общий вывод Line := Line + Buffer; end; until not WasOK or (BytesRead = 0); // ждём, пока завершится консольное приложение WaitForSingleObject(PI.hProcess, INFINITE); finally // Закрываем все оставшиеся дескрипторы CloseHandle(PI.hThread); CloseHandle(PI.hProcess); end; finally result:=Line; CloseHandle(StdOutPipeRead); end; end; end. Взято из http://forum.sources.ru И вот еще вывод в Memo: http://www.delphikingdom.com/asp/viewitem.asp?catalogid=801
ZardoZ, бля, хрючево какое. Как вы на этом пишите?
ZardoZ 16-11-2006-12:05 удалить
Какая разница на чём писать - главное получить результат. В данном случае - на чём пример был на том и кинул - API универсальный интерфейс - разницы нет. Если вы о Delphi, то этот язык превосходит по скорости разработки простых Windows-приложений все другие языки.
Какая разница на чём писать - главное получить результат. Ну с этим пожалуй соглашусь. Просто сам язык выглядит ужасно (ну на мой вкус) Если вы о Delphi, то этот язык превосходит по скорости разработки простых Windows-приложений все другие языки. А мужики то не знали(С). А если серьезно, можно ли чем нибудь подтвердить, столь смелое заявление? Действительно интересно.
ZardoZ 17-11-2006-11:29 удалить
Вкусы у всех разные. Мне вот вообще всё равно как язык выглядит. Моё утверждение подтверждается практикой. Я знаю не один язык, поэтому могу сравнивать. Основные подтверждения (не забываем, что я говорил о простых Windows-приложениях): 1. Просто море очень удобных и функциональных компонентов и готовых классов. Явно больше, чем по всем другим языкам, т.к. на Delphi пишут все кому не лень, т.к. язык простой. Чаще не приходится изобретать то, что уже изобретено. 2. Удобная визуальная среда (Конечно не только дельфа этим может похвастаться). 3. Быстрый и "умный" компилятор. Быстрее любого другого. Это и в и-нете можно найти. Быстрее идет процесс отладки. 4. Отличная локализация места ошибки (сравните хотя бы с "C"). 5. Простая работа с внутренними структурам языка. В основном можно обойтись обычным присваиванием. 6. Логичный простой синтаксис. Даже студиков учат сначало паскалю. 7. Множество материалов в и-нете. 8. ну и др. факторы. Всё это вместе взятое намного ускоряет разработку простых приложений. Особенно первый пункт! Когда тебе говорят, что завтра уже надо, а ты понимаешь, что тут еще на 2 ночи кода писать... :) Вот вам и быстрая разработка. PS: а вы вообще когда-нибудь делали интерфейс на MVC, например? :) В Delphi всё намного быстрее, как впрочем и в билдере.
ZardoZ, ну понятно. Даже справедливо, пожалуй. MVC правда, они разные бывают.
ZardoZ 19-11-2006-11:29 удалить
Спасибо. Вот и пришли к консенсусу :)


Комментарии (12): вверх^

Вы сейчас не можете прокомментировать это сообщение.

Дневник Проблема с созданием процесса | community_coding - Сообщество программистов | Лента друзей community_coding / Полная версия Добавить в друзья Страницы: раньше»