Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[7427] Re:콘솔 어플리케이션의 표준출력/표준에러 받아오기
박지훈.임프 [cbuilder] 2123 읽음    2001-09-16 02:58
임프랍니다.

원래 소스를 작성하신 분이 Win32 API를 잘 이해하지 못하고 작성하신 것 같군요.
일단, 소스 자체에서는, 내부에서 사용하고 있는 UsingWinNT를 true로 설정해줘야 하는 거였습니다.

하지만.. CreatePipe()를 호출할 때 SecurityAttributes 인자가 NT와 95계열에서 다른 것은 맞지만,
그냥 SecurityAttributes 객체를 넘겨주면 됩니다. 95계열의 경우 이 인자를 무시하니까요.
또 이걸 꼭 InitializeSecurityDescriptor()를 호출해서 초기화해줄 필요도 없습니다.
그냥 구조체 자체만 초기화하면 되죠.

그 외에도 불필요한 코드가 너무 많아서, 싹 지워버리고 필요한 것만 남겨서 재구성했습니다.
소스 길이가 거의 반 정도로 줄어들었습니다. ^^;;

참고로, 이것은 여기 C++Builder 팁 게시판에도 이전에 올렸던 것입니다. C++ 코드이긴 합니다만.
http://www.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=173

function RunDosCommand(Command : string): string;
var
  hReadPipe, hWritePipe: THandle;
  SI: TStartUpInfo;
  PI: TProcessInformation;
  SA: TSecurityAttributes;
  BytesRead: DWORD;
  Dest: array[0..1023] of char;
begin
  SA.nLength := SizeOf(TSecurityAttributes);
  SA.lpSecurityDescriptor := nil;
  SA.bInheritHandle := True;
  CreatePipe(hReadPipe, hWritePipe, @SA, 1024);

  FillChar(SI, SizeOf(SI), 0);
  SI.cb := SizeOf(TStartUpInfo);
  SI.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  SI.hStdOutput := hWritePipe;
  SI.hStdError := hWritePipe;
  if CreateProcess(nil, PChar(Command), nil, nil, True, NORMAL_PRIORITY_CLASS, nil, nil, SI, PI)=false then
    exit;
  CloseHandle(hWritePipe);//이것을 하지 않으면 프로세스가 block된다

  while ReadFile(hReadPipe, Dest, 1024, BytesRead, nil) and (BytesRead>0) do
  begin
    result := result + StrPas(Dest);
    {if GetAsyncKeyState(VK_ESCAPE)<0 then break; // 실행에 많은 시간이 걸릴 경우 주석해제 필요
    Application.ProcessMessages;}
  end;
  CloseHandle(hReadPipe);
end;

그럼 이만...

+ -

관련 글 리스트
7421 2000에서 pipe가 왜 안먹힐까요.. nine 1474 2001/09/14
7434     Re:16bit DOS 프로그램의 리다이렉션 박지훈.임프 2602 2001/09/16
7428     다른 방법이요. ^^a ... 제가 만들어 두었던 함수인데 잘 먹힐레나 모르겠습니다...^^a~~ 박정모 1466 2001/09/16
7432         Re:다른 방법이요. ^^a ... 제가 만들어 두었던 함수인데 잘 먹힐레나 모르겠습니다...^^a~~ nine 1714 2001/09/16
7433             ShellExecuteEx 함수를 쓰세요. 박정모 2277 2001/09/16
7427     Re:콘솔 어플리케이션의 표준출력/표준에러 받아오기 박지훈.임프 2123 2001/09/16
7429         Re:Re:콘솔 어플리케이션의 표준출력/표준에러 받아오기 nine 1572 2001/09/16
7430             Re:Re:Re:콘솔 어플리케이션의 표준출력/표준에러 받아오기 박지훈.임프 1403 2001/09/16
7431                 Re:Re:Re:Re:콘솔 어플리케이션의 표준출력/표준에러 받아오기 nine 1559 2001/09/16
7423     아마도 Standard out을 가로채는 내부적인 루틴이 돌아갈때 안될까요 ??? ^^a.... 박정모 1626 2001/09/15
7426         고맙습니다.. 근데..^^;; nine 1261 2001/09/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.