求详细代码,在windows界面下,能直接访问dos界面,并返回结果.达到重定向的效果~~谢谢!!
解决方案 »
- DBgrid如何平常显示密码为*号,点击编辑时才显示密码???
- 这是怎么回事?打开串口的问题!Unhandled exception in Project1.exe:0xC00000005 :Access Violation.
- 关于虚拟磁盘的问题,如果您有过这方面的经验,请透落一点,感激不尽!!!!
- ★★●●救救小妹!有关olecontainer操作excel的问题!
- 大家还是放宽心胸,不要被小人算计---写在cg1120君遭伤害之后
- 紧急求救
- 用过FastReport的朋友请过来,急急急!!!
- 谁有UTF-8<=>GB2312的Delphi源码?
- 一个Quickrep的打印问题 !
- 开发ERP的程序员再次请问?++(昨天回答问题的高手再给你门分)!
- 关于事件的问题?谢谢!
- 取出最大单据号的问题????
有个控件,很好用的
http://www.google.cn/search?complete=1&hl=zh-CN&q=StdIORedirect&meta=
俺写的
procedure RunDosCommand(Command: string; Output: Tstringlist; TimeOut: integer);
var
hReadPipe: THandle;
hWritePipe: THandle;
SI: TStartUpInfo;
PI: TProcessInformation;
SA: TSecurityAttributes;
// SD : TSecurityDescriptor;
BytesRead: DWORD;
Dest: array[0..1023] of char;
CmdLine: array[0..512] of char;
TmpList: TStringList;
Avail, ExitCode, wrResult: DWORD;
osVer: TOSVERSIONINFO;
tmpstr: AnsiString;
all, sEnd: string;
TC: integer;
begin begin
// InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION);
// SetSecurityDescriptorDacl(@SD, True, nil, False);
SA.nLength := SizeOf(SA);
SA.lpSecurityDescriptor := nil; //@SD;
SA.bInheritHandle := True;
CreatePipe(hReadPipe, hWritePipe, @SA, 0);
end; try FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(TStartUpInfo);
SI.wShowWindow := SW_HIDE;
SI.dwFlags := STARTF_USESHOWWINDOW;
SI.dwFlags := SI.dwFlags or STARTF_USESTDHANDLES;
SI.hStdOutput := hWritePipe;
SI.hStdError := hWritePipe;
StrPCopy(CmdLine, 'CMD.EXE /c ' + Command); TC := 0;
if CreateProcess(nil, CmdLine, nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then
begin
ExitCode := 0; while ExitCode = 0 do
begin wrResult := WaitForSingleObject(PI.hProcess, 500);
inc(Tc, 500); BytesRead := 1024; while BytesRead > 0 do
if PeekNamedPipe(hReadPipe, @Dest[0], 1024, @Avail, nil, nil) then
begin
if Avail > 0 then
begin try
FillChar(Dest, SizeOf(Dest), 0);
ReadFile(hReadPipe, Dest[0], Avail, BytesRead, nil);
TmpStr := Copy(Dest, 0, BytesRead);
all := all + TmpStr; finally end; end
else
Break;
end
else
Break;
if wrResult <> WAIT_TIMEOUT then
begin
ExitCode := 1;
// Output.Add('ÔËÐÐÍê³É£¡')
end else
begin
if TC > TimeOut then
if TerminateProcess(PI.hProcess, 0) then
begin
sEnd := 'ÔËÐг¬Ê±£¬Ç¿ÖƽáÊø£¡'
end
else
begin
sEnd := 'ÔËÐг¬Ê±£¬Ç¿ÖƽáÊøʧ°Ü£¡'
end; end;
end;
GetExitCodeProcess(PI.hProcess, ExitCode);
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end
else
Output.Add('ÔËÐв»ÄܽøÐУ¡'); Output.Text := all;
if sEnd <> '' then
Output.Add(sEnd);
all := '';
tmpstr := '';
sEnd := '';
finally
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
end;
end;
var
hReadPipe: THandle;
hWritePipe: THandle;
SI: TStartUpInfo;
PI: TProcessInformation;
SA: TSecurityAttributes;
// SD : TSecurityDescriptor;
BytesRead: DWORD;
Dest: array[0..1023] of char;
CmdLine: array[0..512] of char;
TmpList: TStringList;
Avail, ExitCode, wrResult: DWORD;
osVer: TOSVERSIONINFO;
tmpstr: AnsiString;
all, sEnd: string;
TC: integer;
begin begin
// InitializeSecurityDescriptor(@SD, SECURITY_DESCRIPTOR_REVISION);
// SetSecurityDescriptorDacl(@SD, True, nil, False);
SA.nLength := SizeOf(SA);
SA.lpSecurityDescriptor := nil; //@SD;
SA.bInheritHandle := True;
CreatePipe(hReadPipe, hWritePipe, @SA, 0);
end; try FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(TStartUpInfo);
SI.wShowWindow := SW_HIDE;
SI.dwFlags := STARTF_USESHOWWINDOW;
SI.dwFlags := SI.dwFlags or STARTF_USESTDHANDLES;
SI.hStdOutput := hWritePipe;
SI.hStdError := hWritePipe;
StrPCopy(CmdLine, 'CMD.EXE /c ' + Command); TC := 0;
if CreateProcess(nil, CmdLine, nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI) then
begin
ExitCode := 0; while ExitCode = 0 do
begin wrResult := WaitForSingleObject(PI.hProcess, 500);
inc(Tc, 500); BytesRead := 1024; while BytesRead > 0 do
if PeekNamedPipe(hReadPipe, @Dest[0], 1024, @Avail, nil, nil) then
begin
if Avail > 0 then
begin try
FillChar(Dest, SizeOf(Dest), 0);
ReadFile(hReadPipe, Dest[0], Avail, BytesRead, nil);
TmpStr := Copy(Dest, 0, BytesRead);
all := all + TmpStr; finally end; end
else
Break;
end
else
Break;
if wrResult <> WAIT_TIMEOUT then
begin
ExitCode := 1;
// Output.Add('运行完成!')
end else
begin
if TC > TimeOut then
if TerminateProcess(PI.hProcess, 0) then
begin
sEnd := '运行超时,强制结束!'
end
else
begin
sEnd := '运行超时,强制结束失败!'
end; end;
end;
GetExitCodeProcess(PI.hProcess, ExitCode);
CloseHandle(PI.hProcess);
CloseHandle(PI.hThread);
end
else
Output.Add('运行不能进行!'); Output.Text := all;
if sEnd <> '' then
Output.Add(sEnd);
all := '';
tmpstr := '';
sEnd := '';
finally
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
end;
end;