정확히 원하는게 무엇인지 헷갈리네요..
하여간 kylix님이 소개한 방법대로 하면 될것 같은데...
저도 Builder6.0에서는 여전히 안되네요
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=51466
그런데 VC6.0에서는 저 code가 제대로 동작하는군요
결국 CBuilder가 뭔가 다르다는것인데...?
무엇이 다른것인지? 어떻게 하면 맞출수 있는것인지 .. 고민이네요..
CBuilder에서 kylix님이 소개한 방법이 안된다 하더라도
제가 얘기한 printf함수를 재 정의해서 하면 될것 같으데요....
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=51459
그리고 쓰기 왜에 읽기를 하고자 한다면..
STD_INPUT_HANDLE 으로 input핸들을 구해서 ReadConsole로 읽어오기가 되네요
...
HANDLE hStdIn = GetStdHandle(STD_INPUT_HANDLE);
ReadConsole(hInput, strIn, Len(strIn), 1, 1)
...
그런데 위 방법은 ReadConsole함수를 호출한후에 window메세지 처리가 안되므로
윈도우가 다른 화면에 덮이거나 하면 PAINT메세지를 받을수 없으므로 화면이 깨집니다.
마지막으로 ... Console에 입력을 받고자 할때도
window화면에서 다른 이벤트 처리도 문제없이 하고자 한다면?
Window 부분과 Console입출력 부분을 다른 쓰레드로 분리하면 되네요(테스트 해봄)
단 window종료와 Console 종료시 쓰레드 종료및 동기화 처리에 주의해야 합니다.
님의 질문 덕택에 공부좀 하네요
남은 과제는 stdout 을 재설정하는 것이 VC에서는 되는데
BCB에서는 왜 안되지 연구해 봐야겟네요
그럼...
이후승 님이 쓰신 글 :
: 안녕하세요.. 밑에 글 본문에 질문한 사람입니다..
: 덧글이 매우 많이 달려서 좋긴한데.. 정작 제 질문에 아직 해결책을 못찾았네요..^^;;
:
: AllocConsole() 을 사용하게 되면, 별도의 command window 가 생성되어서 출력되는데..
: 이러한 형태가 아니고, 콘솔의 command line 에서 직접 윈App를 실행한 다음에,
: 동일 콘솔에 텍스트가 출력되게 하려면 어떻게 해야 할까요.. 마치 일반 도스툴처럼 보여지게요..
: 핸들을 가져와서 standard output 으로 지정하려하는데 잘 되지 않습니다..
:
: 조언 부탁드립니다.
:
:
:
: ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
: 음... 쩝~
:
: 델파이만 쓰다 보니까.. 델파이에서는 바로 되어서, 당연히 될줄 알고 말씀드렸는데... ㅠㅠ
:
: AllocConsole하면 CB/VC는 GetStdHandle에서 얻는 핸들로 printf에서 출력을 위해 사용하는 stdlib에있는 stdout이 바뀌지 않는다는군요...
:
: 아래와 같이 하시면 이후로 printf, cout, ... 등 콘솔에 출력하는 모든 함수들을 다 이용하실 수 있습니다.
:
: AllocConsole();
: HANDLE hAfter = GetStdHandle(STD_OUTPUT_HANDLE);
: int crt = _open_osfhandle((int)hAfter, _O_TEXT );
: FILE * fd = fdopen(crt, "w");
: *stdout = *fd;
:
: printf("wow");
:
: 장성호 님이 쓰신 글 :
: : 감사합니다.
: : 그런데 저는 그냥 printf 써서는 출력이 안되더군요
: : 그래서 tip에 있는것을 보고 저렇게 만든것인데...
: :
: : 제가 무엇 잘못한것이라도 있나요?
: : bcb6.0 으로 New Applicaion하고 아무것도 설정 건들지 않고
: : 아래와 같이 코딩했을때 출력되지 않더라구요
: :
: : #include <stdio.h>
: : void __fastcall TForm1::Button1Click(TObject *Sender)
: : {
: : AllocConsole();
: : printf("adfad");
: : }
: :
: :
: :
: : kylix 님이 쓰신 글 :
: : : printf가 표준출력에 출력을 하기 때문에 GetStdHandle로 표준출력의핸들구해서 WriteFile로 안쓰셔도 됩니다.
: : : 그냥 printf쓰셔도 별 문제없이 됩니다.
: : :
: : : 장성호 님이 쓰신 글 :
: : : : 팁 게시판에 있네요..
: : : :
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=425
: : : :
: : : : AllocConsole 하고..
: : : : 그냥 printf 하는게 아니었네요.. ㅋㅋ
: : : : 그러니 printf는 아래와 같이 재정의 해서 쓰면 되겟네요
: : : :
: : : : void printf(char * szFormat, ...)
: : : : {
: : : : char szBuffer[4097];
: : : : va_list args;
: : : :
: : : : va_start(args, szFormat);
: : : : vsprintf(szBuffer, szFormat, args);
: : : : va_end(args);
: : : :
: : : : HANDLE hOut;
: : : : DWORD dwWrite;
: : : : hOut = GetStdHandle( STD_OUTPUT_HANDLE );
: : : : WriteFile(hOut,szBuffer,strlen(szBuffer),&dwWrite,NULL);
: : : : }
: : : :
: : : :
: : : : 한가지 배우네요
: : : :
: : : : 그럼..
: : : :
: : : :
: : : :
: : : : kylix 님이 쓰신 글 :
: : : : : 그냥 일반 프로젝트로 하세요.
: : : : :
: : : : : AllocConsole함수로 콘솔창 하나띄우고, 파일에 입출력하듯이 표준출력(Out)에 출력하시면 됩니다.
: : : : :
: : : : : 쩡이 님이 쓰신 글 :
: : : : : : 빌더에서 실행할 때, 폼을 먼저 닫으면 괜찮은데
: : : : : : 콘솔창을 먼저 닫으면, CPU창과 함께 무시무시한 메세지를 보이면서 기절해버리네요..
: : : : : :
: : : : : : 필요시...
: : : : : : #define CONSOLE_ONOFF 머..이런 식이라도..
: : : : : : 사용하고 안하고 가능할까요?
: : : : : : 잘안되네요.
: : : : : :
: : : : : :
: : : : : :
: : : : : : 장성호 님이 쓰신 글 :
: : : : : : : 전에 비슷한 질문에 답변을 드린적이 있는데요....
: : : : : : :
: : : : : : : VS처럼 컴파일옵션을 변경해서 하는 방법은 모르겠구요
: : : : : : :
: : : : : : : 아래처럼 하면 됩니다 (쬐금 불편하지만..)
: : : : : : :
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_qna&no=51011
: : : : : : :
: : : : : : : 단지 디버깅을 위한것이라면 자료실에 있는 trace같은 것을 이용해도 좋을것 같습니다.
: : : : : : :
http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_res&no=343
: : : : : : :
: : : : : : : 그럼..
: : : : : : :
: : : : : : :
: : : : : : : 이후승 님이 쓰신 글 :
: : : : : : : : 안녕하세요..
: : : : : : : :
: : : : : : : : Windows Applicaiton 으로 작성된 툴에서,
: : : : : : : : Standard Output (커맨드창) 으로 텍스트를 출력해야하는데.. 어떻게 해야할지 모르겠네요..
: : : : : : : : System() 함수를 사용하면 단발성으로 커맨드를 내리고 종료되는데.
: : : : : : : : 계속적으로 현재 툴의 진행상황을 일반 console application 처럼 같은창에서 출력해야합니다..
: : : : : : : :
: : : : : : : : 조언을 부탁드리겠습니다.