Windows에서 프로그래밍 할 때, 디버깅 메시지를 메모장으로 출력하는 방법입니다.

출처는 Open Robotics 블로그입니다.

제가 mfc를 잘 모르기 때문에 간단히 소스코드를 분석해보았습니다.

전체 코드입니다.

일단 동작원리를 확인해 보겠습니다. WinExec()함수를 이용하여 notepad를 실행시킨 후 DebugMessage() 함수를  이용하여 메모장으로 내보냅니다.

메모장으로 텍스트를 내보내기 위해서 클립보드를 사용합니다. DebugMessage()함수는 printf() 함수의 인자들과 비슷한 형식을 취하고 있습니다. 이렇게 사용하기 위해서는 가변인자에 대해서 알아야합니다.

4번째 줄의 함수의 선언부를 보면 가변인수를 받아들이기 위해 '...' 으로 되어있습니다. '...' 이하의 인수값들을 받아들이기 위해서 va_list, va_start, va_end를 이용합니다.

va_list args
char *형으로 정의 되어있으며 가변인수를 읽기위한 포인터 변수를 선언했다고 생각하자.

va_start(args, fmt)
이 명령은 가변 인수를 읽기위한 준비를 하는 것으로 args가 첫 번째 가변인수를 가르키도록 초기화한다. 첫 번째 가변인수의 번지를 조사하기위해 마지막 고정인수 fmt를 전달해 주었다.

va_end(args)
가변인수를 다읽은 후 뒷처리를 해준다.


10번째 줄의 wvsprintf(msg, fmt, args)를 이용하여 전달받은 가변인수 (여기서는 변수 i에 저장되어있는 값)과 'fmt 포인터가 가르키고 있는 문자열 '변수 i = %d'의 값을 결합하여 '변수 i = 0' 과 같은 문자열은 만들어 msg에 전달해준다.

DebugMessage() 함수의 그 이하의 내용은 WinExec()를 이용하여 실행한 notepad의 window를 찾고 child window를 찾아 msg에 들어있는 문자열의 내용을 클립보드로 올린 후 paste해주는 내용인듯 한다.

 

처음에 컴파일 했을 때 에러가 발생했다. 원인은 char로 전달받은 문자열을 wvsprintf()와 다른 함수들에서 유니코드로 처리하는 듯한다. 해결방법은 visual studio 2008의 메뉴에서 프로젝트-속성-구성속성-일반-문자집합-멀티바이트 문자집합사용으로 설정해주면 된다.

'sample code' 카테고리의 다른 글

메모장으로 디버깅 메시지 출력2  (0) 2013.02.19
Posted by 신영식
,