Win9x 에서 유니코드 사용가능하게 프로그래밍…

요즘에는 윈도우9x을 기준으로 프로그래밍 하진 않을 것이다.
다만 윈도우2000 이상을 기준으로 유니코드방식으로 작성한 프로그램을 윈도우9x에서의 호환성 차원에서 수정하는 정도일 것인데, 유니코드라는 녀석때문에 윈도우9x 계열과 부딪히게 된다.

윈도우 9x 계열에서 유니코드 방식으로 작성한 프로그램을 실행하면 프로그램이 실행되지 않는다. 이를 해결하는 방법은 아래와 같다.

Compiling Your Application with the Microsoft Layer for Unicode
http://msdn.microsoft.com/en-us/library/ms812698.aspx
http://www.microsoft.com/globaldev/handson/dev/mslu_announce.mspx

문서를 보시면 unicows.dll을 이용해서 이를 해결하라고 나와 있다. 이 파일은 아래의 링크에서 다운로드 받아보실 수 있다.
http://www.microsoft.com/downloads/details.aspx?familyid=73ba7bd7-ed06-4f0d-80a4-2a7eeaee17e2&displaylang=en

또한 unicows.lib 파일은 플랫폼 SDK를 설치하면 같이 깔리게 된다.

unicows.dll, unicows.lib 파일을 모두 준비하였다면 이제 프로젝트에 적용하면 된다.
다만 프로젝트의 MFC 사용을 ‘정적 라이브러리에서 MFC 사용’으로 변경하여야 한다.(중요)

그리고 링커>입력에서 추가 종속성 입력란에 아래의 내용을 추가한다.

/nod:kernel32.lib /nod:advapi32.lib /nod:user32.lib /nod:gdi32.lib /nod:shell32.lib /nod:comdlg32.lib
/nod:version.lib /nod:mpr.lib /nod:rasapi32.lib /nod:winmm.lib /nod:winspool.lib /nod:vfw32.lib
/nod:secur32.lib /nod:oleacc.lib /nod:oledlg.lib /nod:sensapi.lib

그 다음 unicows.lib를 추가한 다음에

다시 kernel32.lib advapi32.lib user32.lib gdi32.lib shell32.lib comdlg32.lib version.lib mpr.lib rasapi32.lib winmm.lib winspool.lib vfw32.lib secur32.lib oleacc.lib oledlg.lib sensapi.lib 를 추가한다.

그리고 나서 컴파일하여 윈도우 9x 에서 실행하면 잘 실행됨을 볼 수 있다. 배포할 때는 unicows.dll 파일을 같이 배포하면 된다.

unicows.zip

—————–

이 방법 외에 MFC를 정적이 아닌 동적으로 사용하는 방법도 있다. 아래의 문서를 보면 유니코드 레이어를 지원하는 MFC DLL을 생성하는 방법이 나와있다. 실행 파일의 크기를 줄이기 위해선 아래 방법으로 해야겠다.

http://blogs.msdn.com/michkap/articles/478235.aspx

—————–

윈도우 9x 계열헤서 실행할 때, unicows.dll이 없다면 런타임 에러가 나게 된다. 이럴때 프로그램에서 메시지를 출력하고 싶다면 아래와 같은 소스를 추가하면 된다. stdafx.h의 헤더 파일에 포함만 시키면 되겠다.

static HMODULE __stdcall LoadUnicowsProc(void)
{
 HMODULE hMod = LoadLibraryA("unicows2.dll");
 if(hMod == 0)
 {
  // Replace [specific path] with your specific path.
  hMod = LoadLibraryA("[specific path]\\unicows.dll");
 }
 if(hMod == 0)
 {
  // If the load still failed, then exit.
  MessageBoxA(0,
   "Unicode wrapper not found",
   "My Company",
   MB_ICONSTOP | MB_OK);
  _exit(-1);
 }
 return(hMod);
}

extern "C" HMODULE (__stdcall *_PfnLoadUnicows) (void) = &LoadUnicowsProc;

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다