Форум: "KOL";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
ВнизПеренаправление параметров вывода. Найти похожие ветки
← →
Михаил (2004-03-19 16:31) [0]Доброе время суток!
Подскажите пожалуйста.
Я запускаю cmd.exe
из своей программы как заставить мою программу получать результат ее работы Т.е.,допустим, я запускаю командную строку и хочу выполнить команду dir C:\ и получить результат в свою программу.
Заранее благодарю.
← →
RA © (2004-03-19 19:32) [1]Вот, однажды встретил такую реализацию Dos2Win v1.00 (aka
TDosMemo) by Manuel Bua:
procedure Dos2Win(CmdLine:String; OutMemo:TMemo);
const BUFSIZE = 2000;
var SecAttr : TSecurityAttributes;
hReadPipe,
hWritePipe : THandle;
StartupInfo: TStartUpInfo;
ProcessInfo: TProcessInformation;
Buffer : Pchar;
WaitReason,
BytesRead : DWord;
begin
with SecAttr do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
// Creazione della pipe
if Createpipe (hReadPipe, hWritePipe, @SecAttr, 0) then
begin
Buffer := AllocMem(BUFSIZE + 1); // Allochiamo un buffer di dimensioni BUFSIZE+1
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.hStdOutput := hWritePipe;
StartupInfo.hStdInput := hReadPipe;
StartupInfo.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_HIDE;
if CreateProcess(nil,
PChar(CmdLine),
@SecAttr,
@SecAttr,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
StartupInfo,
ProcessInfo) then
begin
// Attendiamo la fine dell"esecuzione del processo
repeat
WaitReason := WaitForSingleObject( ProcessInfo.hProcess,100);
Application.ProcessMessages;
until (WaitReason <> WAIT_TIMEOUT);
// Leggiamo la pipe
Repeat
BytesRead := 0;
// Leggiamo "BUFSIZE" bytes dalla pipe
ReadFile(hReadPipe, Buffer[0], BUFSIZE, BytesRead, nil);
// Convertiamo in una stringa "\0 terminated"
Buffer[BytesRead]:= #0;
// Convertiamo i caratteri da DOS ad ANSI
OemToAnsi(Buffer,Buffer);
// Scriviamo nell" "OutMemo" l"output ricevuto tramite pipe
OutMemo.Text := OutMemo.text + String(Buffer);
until (BytesRead < BUFSIZE);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Dos2Win("test.bat", Memo1);
end;
Можешь переделать под свои нужды, т.к. эта штука явно под VCL.
Я пользовался, работает.
← →
Gandalf © (2004-03-20 09:21) [2]В UGH реализвано нечно похожее... уже под KOL
← →
Михаил (2004-03-20 21:15) [3]Спасибо RA ! Вот еще какой вопрос:
Если вводить команду типа cmd /c dir C:\
то все нормально код работает и выдает результат,
а если ввести допустим cmd /c time то программа повисает и видимо ждет когда я введу новое время и нажму Enter, а так как
к я ничего ввести уже не могу, то все повисает! Подскажите пожалуйста решение, а то там комментарии походу на испанском.
← →
Михаил (2004-03-20 21:17) [4]Gandalf что такое UGH расскажите поподробней.
Если можно примерчик.
← →
<Falcon> (2004-03-22 14:35) [5]UGH - программа для компрессии исполняемых файлов, есть на этом сайте с исходниками.Вернее это оболочка для UPX-packer. Очень неплохая вещь. Сжимает файл примерно в 5 раз, правда в чуток загребает памяти.
← →
Gandalf © (2004-03-22 18:21) [6]В народном проекте лежит и сорцами. http://kol.mastak.ru
← →
RA © (2004-03-22 20:11) [7]Надо же и в правду коментарии на испанском. А я и не замечал.
Попробуй вводить новое время сразу в командной строке
(по-моему в команде time допустим такой параметр - надо только посмореть). А если нужно только время вывести и сямо время не менять, то возможно в команде time и такой параметр имеется.
← →
mdw © (2004-03-23 11:01) [8]Ну, ну. Что же, обсуждение параметров команды time, очень интересная тема:))))).
← →
Михаил (2004-03-23 16:36) [9]Суть не в параметрах time, а возможности работы с командной строкой в интерактивном режиме через мое приложение.
Страницы: 1 вся ветка
Форум: "KOL";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.032 c