运行DOS程序,把输出的东东输入自己的程序里怎么办??以前的贴我找了半天找不到。(50分)

  • 主题发起人 主题发起人 cgh0717
  • 开始时间 开始时间
C

cgh0717

Unregistered / Unconfirmed
GUEST, unregistred user!
帮个忙了。
 
是这个吧?[:)]
此函数能够实现功能,但是如果控制台没有相应,则程序死掉。使用时需要进行修改,同时此函数经过改动能够实现向Dos控制台发送消息的功能。

function GetDosOutput(const CommandLine: string): string;
var
; SA: TSecurityAttributes;
; SI: TStartupInfo;
; PI: TProcessInformation;
; StdOutPipeRead, StdOutPipeWrite: THandle;
; WasOK: Boolean;
; Buffer: array[0..255] of Char;
; BytesRead: Cardinal;
; WorkDir, Line: string;
begin
; Application.ProcessMessages;
; with SA do
; begin
; ; nLength := SizeOf(SA);
; ; bInheritHandle := True;
; ; lpSecurityDescriptor := nil;
; end;
; // create pipe for standard output redirection
; CreatePipe(StdOutPipeRead, ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;// read handle
; ; StdOutPipeWrite, ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;// write handle
; ; @SA, ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;// security attributes
; ; 0 ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; // number of bytes reserved for pipe - 0 default
; ; );
; try
// Make child process use StdOutPipeWrite as standard out,
// and make sure it does not show on screen.
; ; with SI do
; ; begin
; ; ; FillChar(SI, SizeOf(SI), 0);
; ; ; cb := SizeOf(SI);
; ; ; dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
; ; ; wShowWindow := SW_HIDE;
; ; ; hStdInput := GetStdHandle(STD_INPUT_HANDLE); ; ; ; ; ;// don't redirect std input
; ; ; hStdOutput := StdOutPipeWrite;
; ; ; hStdError := StdOutPipeWrite;
; ; end;

; ; // launch the command line compiler
; ; WorkDir := ExtractFilePath(CommandLine);
; ; WasOK := CreateProcess(nil, PChar(CommandLine), nil, nil, True, 0, nil,
; ; ; PChar(WorkDir), SI, PI);

; ; // Now that the handle has been inherited, close write to be safe.
; ; // We don't want to read or write to it accidentally.
; ; CloseHandle(StdOutPipeWrite);
; ; // if process could be created then handle its output
; ; if not WasOK then
; ; ; raise Exception.Create('Could not execute command line!')
; ; else
; ; try
; ; ; // get all output until dos app finishes
; ; ; Line := '';
; ; ; repeat
; ; ; ;// read block of characters (might contain carriage returns and line feeds)
; ; ; ; WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);

; ; ; ; // has anything been read?
; ; ; ; if BytesRead > 0 then
; ; ; ; begin
; ; ; ; ; // finish buffer to PChar
; ; ; ; ; Buffer[BytesRead] := #0;
; ; ; ; ; // combine the buffer with the rest of the last run
; ; ; ; ; Line := Line + Buffer;
; ; ; ; end;
; ; ; until not WasOK or (BytesRead = 0);
; ; ; // wait for console app to finish (should be already at this point)
; ; ; WaitForSingleObject(PI.hProcess, INFINITE);
; ; finally
; ; ; // Close all remaining handles
; ; ; CloseHandle(PI.hThread);
; ; ; CloseHandle(PI.hProcess);
; ; end;
; finally
; ; result := Line;
; ; CloseHandle(StdOutPipeRead);
; end;
end;
 
好像前边贴是从ping开始说起,引出这个问题的。
 
看了半天没有什么可以回的贴子想到自己的贴子还没有发分就来了[:D]
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部