반응형

furyheimdall.springnote.com


MFC 나 API 에서는 유저에게 숨겨진 실제 엔트리포인트가  CRTWinMain 으로 콘솔과는 전혀 다르게 사전에 초기화가 됩니다.

하지만 MFC 나 API 환경에서 간단한 수치를 디버깅 하기 위해선 익숙해지더라도 참 번거롭기 마련입니다.

이런 답답한 부분때문에 네이버에서 콘솔을 띄우는 방법에 대해 검색해보았는데 의외로 많더군요.

그중에 가장 좋다 싶은 방법을 선택하여 클래스로 만들어보았습니다만... 민망할 정도로 사용상 편의점이 아니고서는 썰렁하네요.


사용자 삽입 이미지

일단 기본적인 방법에 대해서 살펴보겠습니다.

  1. AllocConsole();   //콘솔을 할당    
  2. FreeConsole();   //콘솔을 해제   

  1. /* stdout 에 대한 설정 */  
  2. hCrt = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE),_O_TEXT);    
  3. hf = _fdopen(hCrt,"w");  
  4. *stdout = *hf;  
  5. setvbuf( stdout, NULL, _IONBF, 0 );   

기본적으로 위의 두가지 블럭안에 있는 코드만으로 콘솔을 띄우고 난 후 printf 나 cout 을 이용하여 출력, 콘솔을 닫는 작업들이 가능합니다.


그럼 완성된 클래스를 보지요.


  1. //[MFCConsole.h]    
  2. #pragma once  
  3. #include <io.h>  
  4. #include <fcntl.h>  
  5. #include <stdio.h>  
  6. #include <iostream>  
  7. using namespace std;    
  8. #define DEBUG_PRINT(x) printf("%s - Value : %ld[0x%lx], Address : 0x%lx\n",#x,x,x,&x)    
  9.   
  10. class CMFCConsole  
  11. {  
  12. public:  
  13.  CMFCConsole(void);  
  14.  ~CMFCConsole(void);  
  15.  void OpenConsole(void);  
  16.  void CloseConsole(void);   
  17. };  

  1. //[MFCConsole.cpp]    
  2. #include "StdAfx.h"  
  3. #include "MFCConsole.h"    
  4. CMFCConsole::CMFCConsole(void)  
  5. {  
  6.  //초기화 콘솔을 열고 stdout, stdin 설정후 콘솔을 닫음  
  7.  AllocConsole();  
  8.  int hCrtout = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE),_O_TEXT);  
  9.  FILE *hout = _fdopen(hCrtout,"w");  
  10.  *stdout = *hout;    
  11.  int hCrtin = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE),_O_TEXT);  
  12.  FILE *hin = _fdopen(hCrtin,"r");  
  13.  *stdin = *hin;  
  14.  setvbuf( stdin, NULL, _IONBF, 0 );  
  15.  FreeConsole();  
  16. }    
  17. CMFCConsole::~CMFCConsole(void)  
  18. {  
  19.  //해제  
  20.  _fcloseall();  
  21. }    
  22. void CMFCConsole::OpenConsole(void)  
  23. {  
  24.  //콘솔을 열고 타이틀을 셋팅, 열린 콘솔이 있을경우 무시됨  
  25.  if(AllocConsole()){  
  26.   SetConsoleTitle(_T("Furyheimdall's Console"));  
  27.   printf("-----------------------------------------------\n");  
  28.   printf("             Console Class for MFC             \n");  
  29.   printf("              Made by Furyheimdall             \n");  
  30.   printf("-----------------------------------------------\n\n");  
  31.  }  
  32. }    
  33. void CMFCConsole::CloseConsole(void)  
  34. {  
  35.  //콘솔을 닫음. 열린 콘솔이 없을경우 무시  
  36.  FreeConsole();  
  37. }   

반응형

+ Recent posts