-Подписка по e-mail

 

 -Поиск по дневнику

Поиск сообщений в community_coding

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.12.2004
Записей:
Комментариев:
Написано: 536


Проблема с созданием процесса

+ в цитатник

Cообщение скрыто для удобства комментирования.
Прочитать сообщение


mesca1ito   обратиться по имени Среда, 15 Ноября 2006 г. 17:07 (ссылка)
rpcgen тебе поможет. там в мануалах подробно описано как создавать связку "клиент-сервер" для двух независимых утилит...
оно есть во всех версиях BSD и в SysV.4+ и ее клонах.
Ответить С цитатой В цитатник
Lightpower   обратиться по имени Среда, 15 Ноября 2006 г. 18:25 (ссылка)
Просто вызывать вторую программу - посмори ShellExecute, параметры можно передать в командной строке
Потом можно подождать выполнения и закрытия программы, используя WaitForSingleObject
А вот забрать результат выполнения так просто нельзя (или я не знаю как). Как вариант - можно через файловый обмен

Если нужно реально обмениваться данными с вызванной программой - используй Pipes или Sockets

2 IronClaw: раз уж Тузбубен ссылается на MSDN, то речь идет о винде, не согласен?
Ответить С цитатой В цитатник
mesca1ito   обратиться по имени Среда, 15 Ноября 2006 г. 18:26 (ссылка)
Lightpower, хех... что-то я провтыкал этот момент... )))
Ответить С цитатой В цитатник
Valkin   обратиться по имени Среда, 15 Ноября 2006 г. 22:26 (ссылка)
одним из параметров CreateProcess является LPSTARTUPINFO lpStartupInfo. У структуры STARTUPINFO есть такие поля:
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
Если структуру правильно заполнить, то можно получить все, что программа выводит в один из стандартных потоков вывода или записать что-то в ее входной поток. В качестве хэндлов могут быть файлы (созданные через CreateFile) или unnamed pipes. Вот здесь в MSDN есть пример.
Ответить С цитатой В цитатник
Тузбубен   обратиться по имени Четверг, 16 Ноября 2006 г. 07:26 (ссылка)
да, естественно, речь о винде :)
Valkin, я пробовал ей эти хэндлы передавать. Плюс, кроме прочего, мсдн велит инициализировать TRUE некоторые параметры CreateProcess. Но только то ли я не все, что нужно, проинициализировал, то ли еще что-то не сделал, но работать оно у меня отказалось :)
Ответить С цитатой В цитатник
ZardoZ   обратиться по имени Как захватить весь вывод в консоли? Четверг, 16 Ноября 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
Ответить С цитатой В цитатник
Мухомор_ru   обратиться по имени Четверг, 16 Ноября 2006 г. 10:53 (ссылка)
ZardoZ, бля, хрючево какое. Как вы на этом пишите?
Ответить С цитатой В цитатник
ZardoZ   обратиться по имени Четверг, 16 Ноября 2006 г. 12:05 (ссылка)
Какая разница на чём писать - главное получить результат.
В данном случае - на чём пример был на том и кинул - API универсальный интерфейс - разницы нет.

Если вы о Delphi, то этот язык превосходит по скорости разработки простых Windows-приложений все другие языки.
Ответить С цитатой В цитатник
Мухомор_ru   обратиться по имени Четверг, 16 Ноября 2006 г. 14:11 (ссылка)

Какая разница на чём писать - главное получить результат.

Ну с этим пожалуй соглашусь. Просто сам язык выглядит ужасно (ну на мой вкус)

Если вы о Delphi, то этот язык превосходит по скорости разработки простых Windows-приложений все другие языки.

А мужики то не знали(С). А если серьезно, можно ли чем нибудь подтвердить, столь смелое заявление? Действительно интересно.
Ответить С цитатой В цитатник
ZardoZ   обратиться по имени Пятница, 17 Ноября 2006 г. 11:29 (ссылка)
Вкусы у всех разные. Мне вот вообще всё равно как язык выглядит.

Моё утверждение подтверждается практикой. Я знаю не один язык, поэтому могу сравнивать.
Основные подтверждения (не забываем, что я говорил о простых Windows-приложениях):
1. Просто море очень удобных и функциональных компонентов и готовых классов. Явно больше, чем по всем другим языкам, т.к. на Delphi пишут все кому не лень, т.к. язык простой. Чаще не приходится изобретать то, что уже изобретено.
2. Удобная визуальная среда (Конечно не только дельфа этим может похвастаться).
3. Быстрый и "умный" компилятор. Быстрее любого другого. Это и в и-нете можно найти. Быстрее идет процесс отладки.
4. Отличная локализация места ошибки (сравните хотя бы с "C").
5. Простая работа с внутренними структурам языка. В основном можно обойтись обычным присваиванием.
6. Логичный простой синтаксис. Даже студиков учат сначало паскалю.
7. Множество материалов в и-нете.
8. ну и др. факторы.

Всё это вместе взятое намного ускоряет разработку простых приложений. Особенно первый пункт! Когда тебе говорят, что завтра уже надо, а ты понимаешь, что тут еще на 2 ночи кода писать... :) Вот вам и быстрая разработка.

PS: а вы вообще когда-нибудь делали интерфейс на MVC, например? :) В Delphi всё намного быстрее, как впрочем и в билдере.
Ответить С цитатой В цитатник
Мухомор_ru   обратиться по имени Суббота, 18 Ноября 2006 г. 01:33 (ссылка)
ZardoZ, ну понятно. Даже справедливо, пожалуй.

MVC правда, они разные бывают.
Ответить С цитатой В цитатник
ZardoZ   обратиться по имени Воскресенье, 19 Ноября 2006 г. 11:29 (ссылка)
Спасибо. Вот и пришли к консенсусу :)
Ответить С цитатой В цитатник
Комментировать К дневнику Страницы: [1] [Новые]
 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку