모종의 음모/Notepad22008. 12. 22. 00:57

프로젝트 설정에서 기본 값으로는 PlatformSDK의 include를 사용하지 않기 때문에
Platform SDK를 설치 한다고 해서 에러가 사라지는 것은 아닌 듯 하다.

아래 글을 읽다가 문득 Platform SDK의 경로에 대해서 떠오르게 되었고, 프로젝트 설정에서
어떤 곳에도 include를 설정해 놓은곳이 없었다는 점이 떠올랐다.

[발견 : http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/0300699f-4f0d-46dc-9c47-c4f5f0a2356b]

그리고 나머지 에러는 undefined 에러 이므로.. 오리지널 소스와 비교해서 차이점을 보면 어떻게 될 듯 하고,
문제는 Scintilla 에서 선언된 것들을 끌어 오는 문제인데.. 아마도 프로젝트 환경 설정과 컴파일러 버전 차이로
/Wp64 /GS- /GF 이 세가지 옵션을 인식 못하는게 원인이라고 생각이 된다.

Visual C++ 컴파일러 옵션 /GS(버퍼 보안 검사)
[출처 : http://msdn.microsoft.com/ko-kr/library/8dbf701c.aspx]

Visual C++ 컴파일러 옵션 /GF(중복 문자열 제거)
[출처 : http://msdn.microsoft.com/ko-kr/library/s0s0asdt.aspx]



이 페이지에서 다루는 특정 제품:.
Microsoft Visual Studio 2008/.NET Framework 3.5

다음 제품들은 다른 버전에서 다루어 집니다.

이래저래.. 그냥 VC++ 6.0을 쓰지 말아야 하는 건가 ㄱ-


그리고 에러 중에 COLOR_HOTLIGHT 를 찾지 못하는 것이 있는데
이 녀석은 windows.h에서 include 하는 winuser.h에 정의 되어 있다고 한다.

COLOR_HOTLIGHT
26

Color for a hyperlink or hot-tracked item.


Requirements

Minimum supported clientWindows 2000 Professional
Minimum supported serverWindows 2000 Server
HeaderWinuser.h (include Windows.h)
LibraryUser32.lib
DLLUser32.dll

[출처 : http://msdn.microsoft.com/en-us/library/ms724371(VS.85).aspx]


그래서 내 꺼에서 파일을 봤더니..
#if(WINVER >= 0x0500)
#define COLOR_HOTLIGHT          26

헉.. 설마 CODEWIZ 님의 삽질을 유발했던 저 써글넘의 WINVER이 문제인건가 -ㅁ-!
[codewiz님의 삽질기 : http://www.jiniya.net/tt/635]


아무튼.. 소스 상에서는
#define _WIN32_WINNT 0x501 로 선언되어 있는데, 이 경우 컴파일 하면...
Notepad2.exe - 170 error(s), 41 warning(s)

이 녀석이 존재하는
Searching for '#define _WIN32_WINNT 0x501'...
C:\cvsdown\np2src_VC6\src\Dialogs.c(20):#define _WIN32_WINNT 0x501
C:\cvsdown\np2src_VC6\src\Dlapi.c(20):#define _WIN32_WINNT 0x501
C:\cvsdown\np2src_VC6\src\Edit.c(20):#define _WIN32_WINNT 0x501
C:\cvsdown\np2src_VC6\src\Helpers.c(22):#define _WIN32_WINNT 0x501
C:\cvsdown\np2src_VC6\src\Notepad2.c(21):#define _WIN32_WINNT 0x501
C:\cvsdown\np2src_VC6\src\Print.cpp(21):#define _WIN32_WINNT 0x501
C:\cvsdown\np2src_VC6\src\SciWrap.cpp(20):#define _WIN32_WINNT 0x501
C:\cvsdown\np2src_VC6\src\Styles.c(20):#define _WIN32_WINNT 0x501
8 occurrence(s) have been found.
8 녀석에게 일일이
#define WINVER 0x501 을 추가 하면
Notepad2.exe - 75 error(s), 33 warning(s)

우와~ 에러가 100개가 줄었어요 >_< (젠장!)
디버그의 신 : 너에게는 아직 100개가 줄은 것이 아니라 75개의 버그가 남은 것이란다~


잠시 검색을 했더니.. OTL 역시 적당하게 좀 더 게을렀어야 했다.

Visual C++ 2008을 시작하면 Visual C++는 Windows 95, Windows 98, Windows ME 또는 Windows NT를 지원하지 않습니다. WINVER 또는 _WIN32_WINNT 매크로를 이러한 Windows 버전 중 하나에 할당하면 해당 매크로를 수정해야 합니다. 이전 버전의 Visual C++에서 만든 프로젝트를 업그레이드하는 경우 WINVER 또는 _WIN32_WINNT 매크로를 더 이상 지원되지 않는 Windows 버전에 할당하면 해당 매크로와 관련된 컴파일 오류가 발생합니다.

해당 매크로를 수정하려면 헤더 파일에 다음 줄을 추가합니다.

#define WINVER 0x0500
#define _WIN32_WINNT 0x0500

이렇게 하면 Windows 2000 운영 체제를 대상으로 합니다. Windows XP, Windows Server 2003 및 Windows Vista에 대한 유효 값은 각각 0x0501, 0x0502 및 0x0600입니다.

/D 컴파일러 옵션을 사용하여 이 매크로를 정의할 수도 있습니다. 자세한 내용은 /D(전처리기 정의)를 참조하십시오.

[출처 : http://msdn.microsoft.com/ko-kr/library/6sehtctf.aspx]



Platfrom SDK가 설치된 상태의 Visual Studio 6.0의 환경설정이다.
문제는 Win32 Platform에 대해서만 존재하고, Microsfot SDK(platform SDK)에 경로가 잡혀 있음에도 불구하고
제대로 파일을 불러 오지 못한 것으로 보인다.

즉, 가장 위의  MIDL 에서 굳이 추가해줄 필요는 없었고, 위의 WINVER 선언만 컴파일 옵션에서 넣어 주면 되었던 것이다.
Posted by 구차니