Visual Studio 2010으로 Windows 2000용 프로그램 만들기

작년에 필요해서 찾아만 뒀던 내용인데 이제 정리해 본다.

Visual Studio 6이 언제 나왔나 찾아 보니 1998년 6월이다. 이제 곧 만 15년이 되는 컴파일러이지만 여기는 여전히 현역이다. Visual Basic은 코드만 남아 있고 다루는 사람이 없으니 좀 더 정확히 말하자면 이제 Visual C++ 6을 버리고 컴파일러도 최신으로 바꿔야 한다는 공감대는 모아졌는데 문제는 컴파일러별로 지원하는 OS가 다르다는 점이다.

VS 2008 VS 2010 VS 2012
Win 2k O X X
Win XP SP2 O O O
Win Vista 이상 O O O

Visual Studio 6이 현역인 것처럼 Windows 2000 역시 현역으로 뛰고 있다보니 컴파일러 선택 폭이 매우 좁아진다. 기껏 올려 봐야 2008인데 이 건 좀 맘에 들지 않는다. VS 2012도 함께 쓸 것이므로 그만큼은 아니더라도 C++11 맛이라도 볼 수 있었으면 하는 게 바람이랄까.

VS 2010에서 만든 프로그램을 Win 2k에서 쓰지 못하는 건 Win 2k에 없는 API를 호출하기 때문이다. 이에 대해서는 Visual C++ 2010 Apps Don’t Support Windows 2000이란 글을 참조한다. 결론적으로 이를 우회하도록 코드를 변경하면 되는데 방법은 다음과 같다. 이 방법은 How to get Visual C++ 2010 MFC applications to run on Windows 2000이란 글을 정리한 것이다. 참고로 아래 내용은 Windows 2000 SP4 + Update Rullup 1 KB891861을 적용한 것을 전제로 한다.

  1. Visual Studio 2010을 실행해 MFC 프로젝트를 생성한다.
    MFC 프로젝트 생성
  2. MFC 사용은 static library로 한다. 여기서는 간단히 다이얼로그로 생성했다.
    Application Type 설정
  3. 지금부터는 프로젝트 속성에서 Configuration: All Configurations를 선택하고 진행한다.
    1. General
      1. Use of MFC를 Use MFC in a Static Library로 선택한다(2번에서 선택했으면 패스).
        MFC 사용 설정
    2. Linker
      1. System에서 Minimum Required Version에 5.0 입력.
        최소 요구 버전 설정
      2. Input에서 Delay Loaded Dlls에 gdiplus.dll 입력.
        DLL 로드 설정
  4. 프로젝트 이름을 마우스 오른쪽 버튼으로 선택한 후 ‘Build Customizations…’ 메뉴를 선택한다.
    Build Customizations 선택
  5. Build Customization Files 창이 뜨면 masm 항목을 선택한 후 OK 버튼을 누른다.
    MASM 설정
  6. vs10_2k_mfc.asm 파일을 프로젝트 소스 디렉터리에 복사하고 프로젝트에 추가한다.
  7. 프로젝트 속성을 열어 보면 Microsoft Macro Assembler 항목이 생겨야 한다.
    MASM 추가 확인
  8. vs10_2k_mfc.h 파일을 프로젝트 소스 디렉터리에 복사하고 프로젝트에 추가한다.
  9. stdafx.cpp 파일을 열고 다음처럼 #include “stdafx.h” 아래에 vs10_2k_mfc.h 파일을 경로에 맞춰 포함한다.
    #include "stdafx.h"
    #include "vs10_2k_mfc.h"
    
  10. 프로젝트를 빌드한다.
  11. gdiplus.dll을 실행 파일과 함께 두고 실행한다.

콘솔 프로그램 역시 과정은 동일하지만 C 런타임은 DLL을 사용하지 않는 버전으로 직접 바꿔야 한다. 6번 과정에서 vs10_2k_con.asm 파일을 사용하고 stdafx.cpp 파일은 변경할 필요 없다.

소스 코드는 여기에서 받을 수 있다.

Notes:
1. SP1에서 지원
2. 즉 정적으로 링크해야 한다
SP1에서 지원
즉 정적으로 링크해야 한다

You may also like...