怎样捕获一个程序的输出,比如捕获php.exe的输出.(50分)

  • 主题发起人 主题发起人 rocknet
  • 开始时间 开始时间
R

rocknet

Unregistered / Unconfirmed
GUEST, unregistred user!
另外,怎样用一行命令执行完link.exe(dos下的)?
 
用如下命令:
php.exe index.php >index.html
然后打开index.html应该就可以了吧?

link.exe应该也差不多才对
 
我的意思是说用程序捕获。。。
 
好象要截获控制台输出的,很麻烦。
winexec("php.exe index.php >index.html")试试,投机了
 
利用CreateProcess函数的倒数第二个参数,这个参数是一个结构体,里面
有hStdInput/hStdOutput/hStdError三个参数,你可以CreateFile创建一个
文件然后令要运行的程序的hStdOutput还有hStdError等于这个句柄就可以
把标准输出和标准错误重定向到这个文件了
 
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;
 
接受答案了.
 
后退
顶部