请教一个难题:如何调用Dos控制台程序后,再逐个向其输入参数?(200分)

  • 主题发起人 主题发起人 yxy2003yxy
  • 开始时间 开始时间
Y

yxy2003yxy

Unregistered / Unconfirmed
GUEST, unregistred user!
一开始启动Dos控制台程序时可以输入参数,但是该Dos控制台程序运行过程中如何再用我的win32程序向其逐个输入参数呢?我希望能用windows窗体程序来完全控制后台的dos程序。
用管道能实现吗?还是要用消息机制?还请高手指教,谢谢!
 
现在大富翁好冷清啊
 
帮顶,mark。
 
用管道技术,通过接管控制台的输入向其传输数据就可达到控制输入的目的.具体代码在DFW上搜索一下吧,肯定有的.
 
当然可以了.
paramStr就可以直接得到你的参数了.
 
Rainstorey:
能说具体点么。用管道我能做到启动Dos控制台程序时可以输入参数,可是如何Dos控制台程序运行过程中再输入参数和得到返回呢?

dcsdcs:
paramStr是什么?
 
贴一段代码给你,支持向控制台输入和输出内容:
unit RedirectConsole;

interface

const
CRLF=#13#10;

var
RC_SendBuf:string;
RC_End:Boolean;
RC_ExitCode:Cardinal;

procedure RC_Run(Command:string);
procedure RC_LineIn(s:string);
var
RC_LineOut:procedure(s:string);

implementation

uses Windows,Forms;

procedure RC_LineIn(s:string);
begin
RC_SendBuf:=RC_SendBuf+s+CRLF;
end;// RC_LineIn;


procedure SplitLines(s:string);
var
t:string;
begin
while Pos(CRLF,s)<>0 do
begin
t:=Copy(s,1,Pos(CRLF,s)-1);
RC_LineOut(t);
Delete(s,1,Pos(CRLF,s)+1);
end;
if Length(s)>0 then RC_LineOut(s);
end;// SplitLines

procedure RC_Run(Command:string);
const
bufsize=1024;// 1KByte buffer
var
buf:array[0..bufsize-1] of char;
si:tSTARTUPINFO;
sa:tSECURITYATTRIBUTES;
sd:tSECURITYDESCRIPTOR;
Pi:tPROCESSINFORMATION;
newstdin,newstdout,read_stdout,write_stdin:tHandle;
bread,avail:dword;
begin
// Configuraciones de seguridad para WinNT

InitializeSecurityDescriptor(@sd,SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@sd,True,nil,False);
sa.lpSecurityDescriptor:=@sd;

// Creamos Pipe A
if not CreatePipe(newstdin,write_stdin,@sa,0) then
begin
RC_LineOut('Error creating Pipe A');
Exit;
end;
// Creamos Pipe B
if not CreatePipe(read_stdout,newstdout,@sa,0) then
begin
RC_LineOut('Error creating Pipe B');
CloseHandle(newstdin);
CloseHandle(write_stdin);
Exit;
end;
// Configuramos si
GetStartupInfo(si);
si.dwFlags:=STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
si.wShowWindow:=SW_HIDE;
si.hStdOutput:=newstdout;
si.hStdError:=newstdout;
si.hStdInput:=newstdin;
// Creamos proceso
if not CreateProcess(pchar(Command),nil,nil,nil,True,
CREATE_NEW_CONSOLE,nil,nil,si,Pi) then
begin
RC_LineOut('Error creating process: '+Command);
CloseHandle(newstdin);
CloseHandle(newstdout);
CloseHandle(read_stdout);
CloseHandle(write_stdin);
Exit;
end;
// Loop principal
FillChar(buf,SizeOf(buf),0);
RC_End:=False;
RC_SendBuf:='';
repeat
// application.processmessages;
Application.HandleMessage;
GetExitCodeProcess(Pi.hProcess,RC_ExitCode);
if (RC_ExitCode<>STILL_ACTIVE) then RC_End:=True;
PeekNamedPipe(read_stdout,@buf,bufsize,@bread,@avail,nil);
// Comprobamos texto de salida
if (bread<>0) then
begin
FillChar(buf,bufsize,0);
if (avail>bufsize) then
while (bread>=bufsize) do
begin
ReadFile(read_stdout,buf,bufsize,bread,nil);
SplitLines(buf);
FillChar(buf,bufsize,0);
end
else
begin
ReadFile(read_stdout,buf,bufsize,bread,nil);
SplitLines(buf);
end;
end;
// Comprobamos texto de entrada
while (Length(RC_SendBuf)>0) do
begin
WriteFile(write_stdin,RC_SendBuf[1],1,bread,nil);
Delete(RC_SendBuf,1,1);
end;
until RC_End;
// Cerramos las cosas
CloseHandle(Pi.hThread);
CloseHandle(Pi.hProcess);
CloseHandle(newstdin);
CloseHandle(newstdout);
CloseHandle(read_stdout);
CloseHandle(write_stdin);
end;// RC_Run

end.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部