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
[7429] Re:Re:콘솔 어플리케이션의 표준출력/표준에러 받아오기
nine [] 1572 읽음    2001-09-16 11:30
저 UsingWinNT 때문에 고생하던건 아닌데요(함수 없길래 true로 하고 실행시켰었습니다)
원래 소스 코드랑 두드러지게 다른건 CloseHandle(hWritePipe) 이 문장 같은데,
저 소스 코드로 실행해도, 원래 소스 코드를 비슷하게 고쳐봐도
역시 윈2000에서는 제대로 동작을 안하네요.
뭔가 다른 곳에 문제가 있는가 봅니다.

박지훈.임프 님이 쓰신 글 :
: 임프랍니다.
:
: 원래 소스를 작성하신 분이 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 1475 2001/09/14
7434     Re:16bit DOS 프로그램의 리다이렉션 박지훈.임프 2602 2001/09/16
7428     다른 방법이요. ^^a ... 제가 만들어 두었던 함수인데 잘 먹힐레나 모르겠습니다...^^a~~ 박정모 1467 2001/09/16
7432         Re:다른 방법이요. ^^a ... 제가 만들어 두었던 함수인데 잘 먹힐레나 모르겠습니다...^^a~~ nine 1714 2001/09/16
7433             ShellExecuteEx 함수를 쓰세요. 박정모 2278 2001/09/16
7427     Re:콘솔 어플리케이션의 표준출력/표준에러 받아오기 박지훈.임프 2124 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.... 박정모 1627 2001/09/15
7426         고맙습니다.. 근데..^^;; nine 1262 2001/09/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.