Форум: "Начинающим";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
ВнизВыполнить консольную команду и вернуть результат? Найти похожие ветки
← →
markers © (2005-11-10 16:16) [0]Здраствуйте!!!
У меня следующий вопрос, нужно выполнить некую консольную команду (Например: ping, format, chkdsk) И получить (Желательно получать по появлению нового текста) результат работы данной команды/программы. И чтоб консольное окно было скрыто.
Пробовал запускать команду WinExec("ping ya.ru >test.txt")? А так же через CreateProcess..... Ноль имоций, фунт презрения.... Помогите плиз!
← →
Leonid Troyanovsky © (2005-11-10 16:26) [1]
> markers © (10.11.05 16:16)
> Пробовал запускать команду WinExec("ping ya.ru >test.txt")?
cmd /c ping ya.ry>test.txt
--
Regards, LVT.
← →
Digitman © (2005-11-10 16:37) [2]
> markers © (10.11.05 16:16)
> А так же через CreateProcess
изучать Anonymous Pipes .. до полного просветления ...
← →
markers © (2005-11-10 17:27) [3]Нашёл я кодик который делает, то что мне нужно.... Но почему-то например запускаешь через него ping ngs.ru Ping возвращает "При проверке связи не удалось обнаружить узел ngs.ru. Проверьте имя узла и повторите попытку.", Когда тут же проверяю тоже самое воожу и всё есть.... И например нет реакции на команду dir.... Код ниже:
procedure TForm1.ExecConsoleApp(CommandLine: AnsiString; Output: TStringList; Errors:
TStringList);
var
sa : TSECURITYATTRIBUTES;
si : TSTARTUPINFO;
pi : TPROCESSINFORMATION;
hPipeOutputRead : THANDLE;
hPipeOutputWrite : THANDLE;
hPipeErrorsRead : THANDLE;
hPipeErrorsWrite : THANDLE;
Res, bTest : Boolean;
env : array[0..100] of Char;
szBuffer : array[0..256] of Char;
dwNumberOfBytesRead: DWORD;
Stream : TMemoryStream;
begin
sa.nLength := sizeof(sa);
sa.bInheritHandle := True;
sa.lpSecurityDescriptor := nil;
CreatePipe(hPipeOutputRead, hPipeOutputWrite, @sa, 0);
CreatePipe(hPipeErrorsRead, hPipeErrorsWrite, @sa, 0);
ZeroMemory(@env, SizeOf(env));
ZeroMemory(@si, SizeOf(si));
ZeroMemory(@pi, SizeOf(pi));
si.cb := SizeOf(si);
si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
si.wShowWindow := SW_HIDE;
si.hStdInput := 0;
si.hStdOutput := hPipeOutputWrite;
si.hStdError := hPipeErrorsWrite;
{ Если вы хотите запустить процесс без параметров, заnil`те второй параметр
и используйте первый
}
Res := CreateProcess(nil, pchar(CommandLine), nil, nil, true,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS or CREATE_UNICODE_ENVIRONMENT, @env, nil, si, pi);
// Если не получилось - то выходим
if not Res then
begin
CloseHandle(hPipeOutputRead);
CloseHandle(hPipeOutputWrite);
CloseHandle(hPipeErrorsRead);
CloseHandle(hPipeErrorsWrite);
Exit;
end;
CloseHandle(hPipeOutputWrite);
CloseHandle(hPipeErrorsWrite);
//Читаем вывод
Stream := TMemoryStream.Create;
try
while true do
begin
bTest := ReadFile(hPipeOutputRead, szBuffer, 256, dwNumberOfBytesRead, nil);
if not bTest then
begin
break;
end;
Stream.Write(szBuffer, dwNumberOfBytesRead);
end;
Stream.Position := 0;
Output.LoadFromStream(Stream);
finally
Stream.Free;
end;
//Вывод о ошибках
Stream := TMemoryStream.Create;
try
while true do
begin
bTest := ReadFile(hPipeErrorsRead, szBuffer, 256, dwNumberOfBytesRead, nil);
if not bTest then
begin
break;
end;
Stream.Write(szBuffer, dwNumberOfBytesRead);
end;
Stream.Position := 0;
Errors.LoadFromStream(Stream);
finally
Stream.Free;
end;
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(hPipeOutputRead);
CloseHandle(hPipeErrorsRead);
end;
Не подскажите, в чём может быть причина? А кстати тоже пинг но только на реальный ап адрес даёт верный результат! Мож, каких прав под этой консолью новой не хватает?
← →
markers © (2005-11-10 17:27) [4]Удалено модератором
← →
Leonid Troyanovsky © (2005-11-11 09:08) [5]
> markers © (10.11.05 17:27) [4]
> то например запускаешь через него ping ngs.ru Ping возвращает
> "При проверке связи не удалось обнаружить узел ngs.ru. Проверьте
> имя узла и повторите попытку.", Когда тут же проверяю тоже
> самое воожу и всё есть.... И например нет реакции на команду
> dir....
Может он, дейс-но, не обнаружен. Т.е., "права консоли" здесь ни причем.
Ну, а dir - это команда интерпретатора cmd.exe.
--
Regards, LVT.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.014 c