윈도우 MFC나 Win32 프로젝트에서 콘솔을 사용하는 방법
AllocConsole()을 통해 콘솔 창이 하나 뜨며 이곳에 메세지를 쓸 수 있다.

//콘솔 생성
if (!AllocConsole()) return;	

{//방법1
	//스크린 버퍼 핸들 얻음
	HANDLE hOut = CreateFile(_T("CONOUT$"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
	if (hOut != INVALID_HANDLE_VALUE)
	{
		CString str;
		str.Format(_T("(%ld, %ld) clicked\n"), point.x, point.y);
		
		//UNICODE -> MultiByte 변환
		char* buf = new char[str.GetLength()];
		int rst = ::WideCharToMultiByte(CP_ACP, 0, str, -1, buf, str.GetLength(), NULL, NULL);

		//콘솔 출력
		DWORD sz;
		WriteFile(hOut, buf, str.GetLength(), &sz, NULL);
		CloseHandle(hOut);
		delete buf;
	}
	else
	{
		MessageBox(_T("[FAILED] write console"), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
	}
}

{//방법2
	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);	
	if (hOut != INVALID_HANDLE_VALUE)
	{
		TCHAR str[128];
		wsprintf(str, _T("(%ld, %ld) clicked\n"), point.x, point.y);

		//UNICODE -> MultiByte 변환
		char* buf = new char[128];
		int rst = ::WideCharToMultiByte(CP_ACP, 0, str, -1, buf, 128, NULL, NULL);

		//콘솔 출력
		DWORD sz;
		WriteFile(hOut, buf, strlen(buf), &sz, NULL);
		//CloseHandle(hOut); //방법2는 CloseHandle 호출을 콘솔 제거 전에 호출해야 하는 듯..
		delete buf;
	}
	else
	{
		MessageBox(_T("[FAILED] write console"), _T("Error"), MB_OK | MB_ICONEXCLAMATION);
	}
}

//콘솔 제거
FreeConsole();


'C++' 카테고리의 다른 글

COM  (0) 2011.01.24
MFC 기초 정리  (0) 2011.01.21
파일 비동기 IO 조작 (Async IO)  (0) 2011.01.18
SEH (Structured Exception Handling) 예외처리  (0) 2011.01.12
Windows 접근 제어  (0) 2011.01.11
CRITICAL_SECTION을 사용한 Lock 클래스 예제  (0) 2011.01.07
Design Patterns (디자인 패턴)  (0) 2011.01.06
POSA (Pattern-Oriented Software Architecture)  (0) 2011.01.03