한번씩 정말 기본적인것에 에러가 나서 시간을 허비하는 경우가 종종 있다.
오늘도 간단한 SendInput 함수를 이용한 예제를 만드는데 컴파일 에러가 나서 몇십분을 삽질한 경우인데 아무래도 다음번에도 똑같은 실수를 할까봐 미리 정리해본다.
SendInput 이란 함수를 쓰기 위해서는 INPUT 이란 구조체를 이용해야한다.
하지만 무턱대고 INPUT 이란 구조체를 사용하려고 했다간 다음과 같은 에러에 직면하게 된다.
F:\...\sendinput_testDlg.cpp(192) : error C2065: 'INPUT' : undeclared identifier
별거 없다.
한마디로 컴파일러가 INPUT 을 찾지 못하는경우인데 MSDN 에 나와있는 헤더파일을 다음과 같이 해줘도 똑같이 발생한다.
#include <Windows.h>
그렇다면 왜 그런가??
일단 해결방법은 모든 헤더파일 보다 우선적으로 다음 정의를 해줘야한다.
#define _WIN32_WINNT 0x0500
간단하게 stdafx.h 의 모든 include 앞에 두면 된다.
정확히는 모든 헤더파일보다 우선이 아니라 windows.h 보다 먼저 정의 되어야한다.
이 정의가 의미하는것은 이 프로그램은 윈도우 2000 이상에서만 동작한다고 미리 명시를 해놓는 것이다.
INPUT 이란 구조체가 윈도우 2000 이상에서만 쓰기 때문이다.
다시한번 MSDN 을 살펴보자.
Structure Information
Header |
Declared in Winuser.h, include Windows.h |
Minimum operating systems |
Windows 98, Windows NT 4.0 Service Pack 3 |
즉 Win32 API 중에는 특정 윈도우 버전에서만 동작하도록 정의를 해놓았기 때문에 해당 API 를 사용할때 MSDN 에서 을 꼼꼼히 살펴보아야 이런 실수를 방지할 수 있다.
다음은 각 OS 의 버전별 정의표이다.
Minimum system required |
Minimum value for _WIN32_WINNT and WINVER |
Windows Server 2008 |
0x0600 |
Windows Vista |
0x0600 |
Windows Server 2003 SP1, Windows XP SP2 |
0x0502 |
Windows Server 2003, Windows XP |
0x0501 |
Windows 2000 |
0x0500 |
Minimum version required |
Minimum value of _WIN32_IE |
Internet Explorer 7.0 |
0x0700 |
Internet Explorer 6.0 SP2 |
0x0603 |
Internet Explorer 6.0 SP1 |
0x0601 |
Internet Explorer 6.0 |
0x0600 |
Internet Explorer 5.5 |
0x0550 |
Internet Explorer 5.01 |
0x0501 |
Internet Explorer 5.0, 5.0a, 5.0b |
0x0500 |