在Windows2000的平台如何使用控制台(Console)?(100分)

  • 主题发起人 主题发起人 biyesheng
  • 开始时间 开始时间
B

biyesheng

Unregistered / Unconfirmed
GUEST, unregistred user!
有一问题,想在控制台上解决:在WIN2000下捕捉一个DOS下的程序的输出结果。
该程序在DOS界面下执行,执行完毕后,将结果显示在DOS窗口内。
我应该怎么办才能捕捉到显示在DOS窗口下的结果呢?当然,如果有更好的办法,
不一定要用控制台。
 
procedure CheckResult(b: Boolean);
begin
; if not b then
; ; Raise Exception.Create(SysErrorMessage(GetLastError));
end;

function RunDOS(const Prog, CommandLine,Dir: String;var ExitCode:DWORD): String;
var
; HRead,HWrite:THandle;
; StartInfo:TStartupInfo;
; ProceInfo:TProcessInformation;
; b:Boolean;
; sa:TSecurityAttributes;
; inS:THandleStream;
; sRet:TStrings;
begin
; Result := ';
; FillChar(sa,sizeof(sa),0);
; //设置允许继承,否则在NT和2000下无法取得输出结果
; sa.nLength := sizeof(sa);
; sa.bInheritHandle := True;
; sa.lpSecurityDescriptor := nil;
; b := CreatePipe(HRead,HWrite,@sa,0);
; CheckResult(b);
; FillChar(StartInfo,SizeOf(StartInfo),0);
; StartInfo.cb := SizeOf(StartInfo);
; StartInfo.wShowWindow := SW_HIDE;
; //使用指定的句柄作为标准输入输出的文件句柄,使用指定的显示方式
; StartInfo.dwFlags := STARTF_USESTDHANDLES+STARTF_USESHOWWINDOW;
; StartInfo.hStdError := HWrite;
; StartInfo.hStdInput := GetStdHandle(STD_INPUT_HANDLE);//HRead;
; StartInfo.hStdOutput := HWrite;
; b := CreateProcess(PChar(Prog),//lpApplicationName: PChar
; ; ; ; PChar(CommandLine), //lpCommandLine: PChar
; ; ; ; nil, //lpProcessAttributes: PSecurityAttributes
; ; ; ; nil, //lpThreadAttributes: PSecurityAttributes
; ; ; ; True, //bInheritHandles: BOOL
; ; ; ; CREATE_NEW_CONSOLE,
; ; ; ; nil,
; ; ; ; PChar(Dir),
; ; ; ; StartInfo,
; ; ; ; ProceInfo );
; CheckResult(b);
; WaitForSingleObject(ProceInfo.hProcess,INFINITE);
; GetExitCodeProcess(ProceInfo.hProcess,ExitCode);
; inS := THandleStream.Create(HRead);
; if inS.Size>0 then
; begin
; ; sRet := TStringList.Create;
; ; sRet.LoadFromStream(inS);
; ; Result := sRet.Text;
; ; sRet.Free;
; end;
; inS.Free;
; CloseHandle(HRead);
; CloseHandle(HWrite);
end;
 
主函数RunDos的各个参数是什么意思?这个函数如何使用?这个函数的平台是9x还是2000?
请这位大哥指点一下。谢谢。
 
方法一、程序InputToClipBrd将所有输入写入剪贴板,DOS程序的输出重定向到程序InputToClipBrd,
程序GetFromClipBrd从剪贴板中取数据。代码如下:

//程序InputToClipBrd,一定要是控制台程序
Program InputToClipBrd;
{$APPTYPE CONSILE}
uses ClipBrd;
Var
; ClipText,TmpStr:String;
begin
; ClipBoard.Astext:='';
; ClipText:='';
; While not EOF do
; begin
; ; Readln(TmpStr);
; ; ClipText:=ClipText+TmpStr+#13+#10;
; end;
; ClipBoard.AsText:=ClipText;
end;

//程序GetFromClipBrd从剪贴板中取数据,要使用ClipBrd
procedure TForm1.btTestClick(Sender:TObject);
begin
; WinExec('Command.com /c Dir|InputToClipBrd.exe',SW_HIDE);
; memo1.Text:=ClipBoard.AsText;
end;

方法二、
Var
; ...
; Temp:TStrings;
begin
; ...
; Temp:=TStringList.create;
; ShellExecute(Handle,'OPEN',PChar('dir>tmptext.txt'),nil,nil,SW_SHOWNORMAL);
; Temp.LoadFromFile('tmptext.txt');
; ...
; Temp.Free;
; ...
end;
 
多人接受答案了。
 
后退
顶部