![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не читает вывод из консоли [D7]
mamedovvms © (2009-08-25 08:45:00)
nit Unit1;что сделано не так??? может кто знает???
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure RunDosInMemo(DosApp:String;AMemo:TMemo) ;
const
ReadBuffer = 512;
var
l:boolean;
Security : TSecurityAttributes;
ReadPipe,WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
Buffer : Pchar;
BytesRead : DWord;
Apprunning : DWord;
x : Integer;
MyStr : String;
begin
x := 0;
With Security do
begin
Security.nlength := SizeOf(TSecurityAttributes) ;
Security.binherithandle := true;
Security.lpsecuritydescriptor := nil;
end;
if Createpipe (ReadPipe, WritePipe,
@Security, 0) then
begin
Buffer := AllocMem(ReadBuffer + 1) ;
FillChar(Start,Sizeof(Start),#0) ;
start.cb := SizeOf(STARTUPINFO) ;
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES ;
start.wShowWindow := SW_SHOW;
if CreateProcess(nil,
PChar(DosApp),
@Security,
@Security,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
start,
ProcessInfo)
then
begin
CloseHandle(WritePipe) ;
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
BytesRead := 0;
l:=ReadFile(start.hStdInput,Buffer[0],ReadBuffer,BytesRead,nil) ;
ShowMessage(Buffer);
Buffer[BytesRead]:= #0;
OemToAnsi(Buffer,Buffer) ;
AMemo.Lines.Add(MyStr);
AMemo.Refresh;
Application.ProcessMessages;
FreeMem(Buffer) ;
CloseHandle(ProcessInfo.hProcess) ;
CloseHandle(ProcessInfo.hThread) ;
CloseHandle(ReadPipe) ;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
RunDosInMemo('c:\cons.exe',memo1) ;
end;
end.
да к стати консольная программа cons.exe просто выводит на экран строку 12345678910, написана на pascal может я что то не понял и нельзя так делать????
mamedovvms (2009-08-25 13:03:00) [41]ну а если у нас например печатается война и мир, что теперь пока вся не напечатается ничего не будет что ли? а так можно было бы считать уже хотябы пару страниц
Сергей М. (2009-08-25 12:57:00) [42]
> если процесс не закончен то идем дальше
Куда дальше-то ? Из пайпа читать ? А что, спрашивается, читать-то, если процесс не закончен ?
mamedovvms (2009-08-25 12:35:00) [43]ну я тоже самое и имел ввиду , то есть как я понимаю если процесс не закончен то идем дальше, но как можно то сделать что бы не зависало то на строке чтения???
Сергей М. (2009-08-25 12:11:00) [44]Это - ожидание завершения порожденного процесса.
mamedovvms (2009-08-25 10:54:00) [45]ну как я понимаю это передача процесса дочерниму приложению либо пока не будет выполнено либо на определенное время
Сергей М. (2009-08-25 10:45:00) [46]
> это из за того что нечего считывать
> ну у меня же есть строка
> WaitForSingleObject(ProcessInfo.hProcess
А ты вообще понимаешь, что делает строка WaitForSingleObject ?
mamedovvms (2009-08-25 10:14:00) [47]извините строка WaitForSingleObject(ProcessInfo.hProcess, INFINITE); должна быть такой WaitForSingleObject(ProcessInfo.hProcess, 10);
mamedovvms (2009-08-25 10:10:00) [48]да и вот что еще хотел спросить дабы не плодить темы, бывает так что для некоторых консольных программ прога зависает на некоторое время на строке
l:=ReadFile(start.hStdInput,Buffer[0],ReadBuffer,BytesRead,nil) ;
что можно сделать, я как понимаю это из за того что нечего считывать
ну у меня же есть строка
WaitForSingleObject(ProcessInfo.hProcess, 10); то есть как я понимаю выдерживается определенное время для выполнения программы, так вот собственно вопрос как сделать такое, или можно ли
repeat
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
ReadFile(start.hStdInput,Buffer[0],ReadBuffer,BytesRead,nil) ;
until(buffer<>'');
но главное что бы не зависало на строке читки
Leonid Troyanovsky (2009-08-25 09:50:00) [49]
> MBo © (25.08.09 09:42) [4]
Тогда уж command /c
Но, скорее всего, ntvdm не завершится, если вывод был.
Можно попробывать батник с завершающим @cls или в
pif сделать "закрывать окно по завершению", кажись так.
--
Regards, LVT.
mamedovvms (2009-08-25 09:50:00) [50]я взял программу написанную на С++ и у меня выводит результат, как мне надо
mamedovvms (2009-08-25 09:49:00) [51]
>
> > программа cons.exe .. написана на pascal
>
> Это не консольная программа Windows, это программа MSDOS
огромное спасибо, но я почему то думал что программа на pascal консольная, все теперь работает
MBo (2009-08-25 09:42:00) [52]попробуй 'cmd /C c:\cons.exe'
Leonid Troyanovsky (2009-08-25 09:26:00) [53]
> mamedovvms © (25.08.09 08:45)
> написана на pascal может я что то не понял и нельзя так
Не надо извращений - перепиши на дельфи.
--
Regards, LVT.
Сергей М. (2009-08-25 09:25:00) [54]
> программа cons.exe .. написана на pascal
Это не консольная программа Windows, это программа MSDOS
MBo (2009-08-25 09:18:00) [55]можно модуль doscommand.pas взять тут:
http://forum.chertenok.ru/viewtopic.php?p=51996