¸í·ÉÇà °á°ú¸¦ À©µµ(¸Þ¸ð)·Î ³ªÅ¸³ª°Ô ÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù. Áï, ipconfigÀÇ °á°ú¸¦ Memo·Î º¸ÀÌ°Ô ÇÏ´Â ¹æ¹ýÀÔ´Ï´Ù.
ÆÄÀ̾î¹öµåÀÇ ¹é¾÷(gbak.exe)À» À©µµ·Î º¸¿©ÁÙ ¶§ »ç¿ëÇÏ°í Àִµ¥ ´Ù¸¥ ¿ëµµ·Îµµ È°¿ëÀÌ °¡´ÉÇÒ °Í °°½À´Ï´Ù....
unit Unit4;
interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;
type TArg<T> = reference to procedure(const Arg: T);
TForm4 = class(TForm) Memo: TMemo; Panel1: TPanel; Label1: TLabel; edCommand: TEdit; btnExecCmd: TButton; procedure btnExecCmdClick(Sender: TObject); procedure edCommandKeyPress(Sender: TObject; var Key: Char); private procedure CaptureConsoleOutput(const ACommand: String; CallBack: TArg<PAnsiChar>); { Private declarations } public { Public declarations } end;
var Form4: TForm4;
implementation
{$R *.dfm}
procedure TForm4.CaptureConsoleOutput(const ACommand: String; CallBack: TArg<PAnsiChar>); const CReadBuffer = 2400; var saSecurity: TSecurityAttributes; hRead: THandle; hWrite: THandle; suiStartup: TStartupInfo; piProcess: TProcessInformation; pBuffer: array [0..CReadBuffer] of AnsiChar; dBuffer: array [0..CReadBuffer] of AnsiChar; dRead: DWORD; dRunning: DWORD; dAvailable: DWORD; begin saSecurity.nLength := SizeOf(TSecurityAttributes); saSecurity.bInheritHandle := true; saSecurity.lpSecurityDescriptor := nil; if CreatePipe(hRead, hWrite, @saSecurity, 0) then try FillChar(suiStartup, SizeOf(TStartupInfo), #0); suiStartup.cb := SizeOf(TStartupInfo); suiStartup.hStdInput := hRead; suiStartup.hStdOutput := hWrite; suiStartup.hStdError := hWrite; suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; suiStartup.wShowWindow := SW_HIDE; if CreateProcess(nil, PChar(ACommand), @saSecurity, @saSecurity, true, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess) then try repeat dRunning := WaitForSingleObject(piProcess.hProcess, 100); PeekNamedPipe(hRead, nil, 0, nil, @dAvailable, nil); if (dAvailable > 0) then repeat dRead := 0; ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil); pBuffer[dRead] := #0; OemToCharA(pBuffer, dBuffer); CallBack(dBuffer); until (dRead < CReadBuffer); Application.ProcessMessages; until (dRunning <> WAIT_TIMEOUT); finally CloseHandle(piProcess.hProcess); CloseHandle(piProcess.hThread); end; finally CloseHandle(hRead); CloseHandle(hWrite); end; end;
procedure TForm4.edCommandKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin btnExecCmd.SetFocus; Key := #0; end; end;
procedure TForm4.btnExecCmdClick(Sender: TObject); begin Memo.Lines.Clear;
CaptureConsoleOutput(edCommand.Text, procedure(const Line: PAnsiChar) begin Memo.Lines.Add(String(Line)); end); end;
end.
// ¼Ò¶õÄÚ´õ´ÔÀÇ ÁöÀû¿¡ µû¶ó ¼Ò½º¸¦ ´Ù½Ã ¿Ã·È½À´Ï´Ù.
|