c:\source\atltest\server\APTMain.h(21) : fatal error C1189: #error : "단일 스레드 COM 개체는 전체 DCOM 지원을 포함하지 않는 Windows Mobile 플랫폼과 같은 Windows CE 플랫폼에서 제대로 지원되지 않습니다. ATL이 단일 스레드 COM 개체의 생성을 지원하고 단일 스레드 COM 개체 구현을 사용할 수 있도록 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA를 정의하십시오. rgs 파일의 스레딩 모델은 DCOM Windows CE가 아닌 플랫폼에서 지원되는 유일한 스레딩 모델이므로 'Free'로 설정되어 있습니다."
컴파일러에서 CE_ALLOW_SINGLE_THREADED_OBJECTS_IN 정의에 대한 경고가 발생하면 _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA를 정의하고 stdafx.h에 플래그를 정의하십시오. 그렇게 하려면 stdafx.h 헤더 파일을 열고 파일 위쪽 부분에 #define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA를 추가합니다.
시키는 대로 하는 것이 우리내 팔자…
일단 stdafx.h파일을 열고
#pragma once #define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA
Windows에서 동작하는 소프트웨어를 개발하는 분들이 Windows 7, Windows Server 2008 R2 호환을 고민할 때 볼만한 문서가 있어 나누고자 합니다. 문서 목적은 애플리케이션이 Windows 7 혹은 Windows Server 2008 R2에 문제없이 동작하는데 필요한 호환성 관련 사항을 전달하려는 것입니다. 문서 이름은 “Windows Application Quality Cookbook”입니다. 문서는 http://code.msdn.microsoft.com/Windows7AppQuality에서 내려받을 수 있습니다. 지속적으로 수정될 예정이고, 버전 1.1 문서는 이 포스트에 첨부했습니다. 이 문서에는 Windows XP에서 Windows 7으로 바로 옮겨가는 것은 고려되지 않았습니다.애플리케이션을 Windows XP에서 Windows Vista 옮기는 것은 http://msdn.microsoft.com/en-us/library/bb757005.aspx를 참조하시기 바랍니다.
1. 운영체제 버전
운영체제 버전이 올라가면 언제나 달라지는 것 중의 하나입니다. GetVersion 함수의 반환 값이 변화되었습니다.
2. Windows Mail 삭제
이후에 Windows Mail 도구는 지원되지 않을 것을 명시했습니다. CoStartOutlookExpress API는 동작하지 않으며, 다른 메일 API도 deprecating 정보를 포함했습니다. 앞으로 지원 중단을 선언하지 않은 API는 전과 같이 동작합니다.
3. Internet Explorer 8 – 사용자 에이전트 문자열
Windows 7에 포함된 Internet Explorer 버전은 8입니다. 웹 개발자가 개발하는 웹 애플리케이션이 사용자 브라우저 버전 혹은 정보에 따라 행동을 달리하는 경우에 사용자 에이전트 문자열 (User Agent String) 값을 다시 검토해야 합니다. 그리고, Internet Explorer 8은 Internet Explorer 7 compatibility view를 지원하기 때문에, 웹 개발자는 필요한 경우 Internet Explorer 7 compatibility view 상태를 판단할 수 있는 메타 정보도 확인해야 합니다.
4. 윈도우 휴대용 장치를 위한 WPDUSB.SYS 삭제
커널 모드로 Windows Vista USB 드라이버 스택에서 동작한 WPDUSB.SYS는 WINUSB.SYS 드라이버로 교체되었습니다.
5. Microsoft Message Queuing (MSMQ) – SHA-2 사용
Windows 7에 포함된 MSMQ는 보안 강화를 목적으로 메시지를 보낼 때, SHA-2를 기본으로 이용합니다. 다른 설정에 변화가 없다면 Windows 7 MSMQ에서 만들어진 메시지는 하위 버전에서 받아볼 수 없습니다. 반대도 마찬가지입니다.
6. 바이너리 간의 기능 이동
이후의 기능 효율성과 구조 향상을 위해 Windows 핵심 바이너리 사이에 기능 이동을 했습니다. 예를 들어, kernel32.dll와 advapi32.dll에서 동작하던 기능을 kernelbase.dll로 옮긴 것입니다. 백신/백업 소프트웨어 같이 하층의 API를 직접 다루는 개발자 분들은 주의 깊게 보실 필요가 있습니다.
7. (Windows Server 2008 R2에만 적용) Microsoft Message Queuing (MSMQ) – Windows 2000 클라이언트 지원 삭제
Windows 2003, 2008 도메인에서 Windows 2000 클라이언트 지원은 선택 사항이지만, Windows 7 도메인에서는 Windows 2000 클라이언트를 지원하지 않습니다.
8. (Windows Server 2008 R2에만 적용) 64-bit 지원
Windows Server 2008 R2는 64-bit 제품만 지원합니다. 32-bit 드라이버, 32-bit 플러그-인, 16 bit 실행 바이너리만 지원하는 제품을 개발하시는 분들은 미리 준비를 하셔야 합니다. WoW64, x86 emulator가 있기는 하지만, 모든 32 bit 애플리케이션이 동작하는 것은 아니므로 개발자 분들은 세부적인 요건을 조사해서 어떻게 대처할지를 결정해야 합니다.
9. (Windows Server 2008 R2에만 적용) Server Core에서 Wow64 지원은 선택 사항
Windows Server 2008 R2에서 Server Core를 설치하는 경우 Wow64는 디폴트에 포함되지 않습니다.
[새로운 기능과 개선 사항]
1. 파일 라이브러리
라이브러리는 여러 군데로 흩어져 있는 폴더를 묶어 하나로 보일 수 있도록 하고, 인덱싱을 통한 빠른 검색과 원격 접속 방법을 제공합니다. Windows 7에서 달라진 것은 파일 다이얼로그에서 열기, 저장하기를 수행할 때 디폴트로 나타나는 곳이 문서 폴더에서 문서 라이브러리로 바뀐 점입니다. 그리고 라이브러리의 성질은 폴더가 아니라 파일이기 때문에, IFiledialog를 이용하는 경우 GetFolder, GetFilename을 이용하는 대신에 GetResult를 사용해야 합니다. 애플리케이션 개발자는 IShellLibrary 인터페이스를 이용해 필요에 따라 특정 폴더를 라이브러리에 추가할 수 있습니다.
2. 사용자 인터페이스 – 높은 DPI 인식
목적은 텍스트와 이미지 크기를 변경하고자 화면 해상도 (screen resolution)을 이용하는 것보다 DPI를 사용하는 것을 권장하려는 것입니다. 추가된 기능은 사용자 단위의 DPI 설정과 로그-온만으로 변경된 DPI를 적용하는 것입니다. 사용자 인터페이스 측면에서 글자, 폰트, 이미지를 다루어야 하는 경우에 유심해 볼 필요가 있습니다.
3. Internet Explorer 8 – Data Execution Protection/NX
이 기능 변화는 Windows 7만이 아니라 Internet Explorer 8이 설치되는 모든 곳에 공통으로 적용되는 것입니다. Internet Explorer에 추가 기능으로 설치되는 모듈 중에 금융권에서 사용하고 있는 ActiveX처럼 하단의 운영체제를 직접 다루는 ActiveX와 같은 것을 개발하는 분들이 반드시 확인하셔야 할 사항입니다. 기본 개념은 Internet Explorer 8의 추가 기능으로 설치된 모듈이 메모리에 올라가서 실행될 때, 운영체제가 판단해서 heap, stack과 같은 영역에서 코드가 수행되는 것은 디폴트로 막겠다는 것입니다. 목적은 buffer overflow와 같은 보안 침해를 예방하는 것입니다. 일반 개발자 분들은 이런 코드가 있는 지도 갸우뚱하실 것입니다. 생각할 수 있는 대처 방안은 Internet Explorer 추가 기능 모듈을 DEP/NX 호환 ATL 프레임워크 같은 것을 이용해서 재작성하거나, Internet Explorer를 관리자 권한에서 실행해서 DEP/NX를 동작하지 않게 하는 것입니다.
4. 사용자 인터페이스 – UAC (User Account Control) 다이얼로그
UAC (User Account Control) 기초 구조는 변경되지 않았습니다. 크게 달라진 점은 UAC 다이얼로그 상자에서 선택할 수 있는 선택이 “Yes”, “No”로 줄어든 것과 같은 단순화입니다. 좀 더 세부적인 설명은 Windows 7 engineering blog또는 Koalra 블로그를추천합니다.
5. ChooseFont() win32 공통 다이얼로그
영향도가 크지는 않습니다. 애플리케이션에서 폰트를 선택하는 다이얼로그에서 WYSIWYG 개념에 따라 폰트 특성을 볼 수 있도록 바뀐 것과 Windows 지역 설정에 따라 필요 없다고 추정되는 폰트는 보이지 않도록 한 것입니다.
6. 애플리케이션 매니페스트 호환성
Windows 7에서는 애플리케이션 매니페스트에 “CompatiblityInfo.”을 넣었습니다. Windows 7에서 실행되지만 동작 방식을 Windows XP 혹은 Windows Vista처럼 하게 하는 것입니다. 모든 동작을 이전 환경으로 하는 것은 아니고 아래와 같은 컴포넌트가 대상입니다.
생성되는 SDK에는 에뮬레이터가 추가되기 때문에 ROM Image가 필요합니다
우리는 이미 이것을 2단계에서 생성하였고, 릴리즈 폴더에 보시면 nk.bin파일이 있음을 확인하실 수 있습니다
상단의 3. Release Directory 에서 위치를 확인하시고 이동하시면 됩니다
확인된 nk.bin 파일을 다음과 같은 경로에 폴더를 새로 생성하여 복사합니다
C:\WINCE500\PBWorkspaces\WinCE5_SDK_Korean\BIN
이유는 다음과 같습니다
디바이스 에뮬레이션 nk.bin 파일이지만 폴더라고 생각하면 된다.
폴더에는 최종 nk.bin파일 외에는 다른 이미지 (bin)파일이 없어야 하는 것을 권장한다. 왜냐면 SDK 롤러(음..영어의 표현은 재미 있는 것이 마니 있군..^^) 는 빌드하는 과정에서 이 폴더에 있는 것들을 하나로 만들어 버리기 때문이다.
by. Jaegeol Kim
이러한 이유로 nk.bin파일을 BIN이라는 폴더를 생성해서 복사하였습니다
다시 ExportSDK.sdkcfg 편집으로 돌아갑니다
ExportSDK.sdkcfg파일 아래에 보면 <PropertyBag NAME="Added Files"/>이러한 테그를 보실 수 있습니다
이것은 사용자가 추가로 다른 파일들을 SDK에 추가할 것인지를 묻는 내용으로 SDK Configure에서 수정이 가능합니다만, 관련 환경변수가 많기 때문에우리는 이것을 수작업으로 추가하도록 하겠습니다.
앞서 말씀드린 바와 같이 이것은 No Custom Skin용 입니다.
Custom Skin을 이용하실 경우 상단의 링크를 통하여 다른 소스를 참고하시기 바랍니다
{3B388597-0924-4102-ADFA-2519D2C3E11B}속성백은 에뮬레이터의 이미지를 가리키는 속성백이라 보시면 됩니다
노란색 하이라이트 부분을 아까 nk.bin을 복사한 파일 경로로 입력해 주시기 바랍니다
적색 하이라이트 부분이 새롭게 추가된 속성백 입니다
위와같은 작업을 마치셨으면 저장하고 텍스트 편집도구를 종료합니다
6. SDK 생성
Menu – Platform->SDK->Build SDK 실행
※ 주 : 가급적이면 5,6단계를 진행한 상태에서는 Configure SDK를 이용하여 수정하지 마시기 바랍니다
가끔 앞서 입력된 내용들이 손상을 입는 경우가 발생되어 재수정해야 하는 경우가 발생됩니다
진행 중 SDK에 릴리즈된 파일들과 어플리케이션 개발에 필요한 언어가 포함되는 것을 보실 수 있습니다
에러없이 정상적으로 SDK가 생성되면 위와 같은 화면이 출력 됩니다
7. SDK 설치
C:\WINCE500\PBWorkspaces\WinCE5_SDK_Korean\SDK 경로에 보시면 위에서 설정한 이름으로 WinCE5_SDK_Korean_SDK.msi가 생성된 것을 보실 수 있습니다
생성된 SDK를 실행하여 설치과정을 진행합니다
정상적으로 설치가 완료되었습니다
8. Visual Studio 2005 설정
Visual Studio – 메뉴 – 도구->옵션 실행
옵션 트리에서 장치도구->장치 선택을 하시면
장치에 우리가 작성한 WinCE5 verKorean이 설치된 것을 보실 수 있습니다
이곳에 입력된 이름은 ExportSDK.sdkcfg의 DeviceEmuation 속성백의 1번 속성백에 있는
ImageName 속성에 정의한 이름이 나오게 됩니다
WinCE5 verKorean을 선택 후 [속성]버튼을 누릅니다
속성 창에서 [전송]을 DMA 전송으로 선택 후 [에뮬레이터 옵션] 버튼을 누릅니다
에뮬레이터 속성의 [일반]탭에는 이미지의 위치와 RAM 크기 지정을 할 수 있습니다
또한 공유 폴더를 지정하여 SD카드를 추가한 것처럼 이용할 수 있습니다
어플리케이션 개발시 PC의 자료를 에뮬레이터로 저장할 때 유용하게 사용됩니다
[표시]탭에서는 스킨과 비디오를 선택 할 수 있는데 우리는 Custom Skin을 이용하지 않았기 때문에 비디오를 선택하고 화면너비와 화면 높이, 색상 수를 정의 합니다
[네트워크]탭에서는 NE200 PCMCIA 네트워크 어댑터를 활성하여 다음에 바인딩 이라는 설정이 있습니다
이는 우리가 1단계에서 추가한 네트워크 어댑터로 개발PC의 네트워크 카드와 바인딩을 통하여
인터넷을 지원하는 기능입니다
이것을 선택 하지 않으면 에뮬레이터 상태에서 크래들에 접속해 ActiveSync를 통하여 인터넷을 지원하는 방법도 있습니다
[확인] 버튼을 눌러 설정을 마무리 합니다
9. VS2005 장치 에뮬레이터 관리자 동작 시험
Visual Studio – 메뉴 – 도구->장치 에뮬레이터 관리자 실행
장치 에뮬레이터 관리자를 실행하면 우리가 생성하여 설치한 WinCE5_SDK_Korean과
에뮬레이터 이름 WinCE5 verKorean을 보실 수 있습니다
※ 주 : 만약 보이지 않으면 [새로 고침]을 눌러보세요
WinCE5 verKorean을 선택 후 오른쪽 마우스 클릭으로 팝업 메뉴를 띄워 [연결]을 누릅니다
다음과 같은 화면이 나오면 성공한 것 입니다
Device Emulator – 내 장치-Storage Card가 설치된 것을 보실 수 있습니다
개발PC의 폴더의 파일과 동일한 정보가 들어가 있는 것을 볼 수 있습니다
내장된 인터넷 익스플로어로 네이버 PDA사이트에 접속한 모습입니다
자체 장치인 Ethernet Card를 추가해 둔 상태이기 때문에 ActiveSync와 접속이 안되어도 인터넷이 됩니다
10. 마치며...
이상으로 PB5를 이용하여 VS2005의 에뮬레이터 SDK를 생성하여 설치하는 것을 보았습니다
사실 이 문제가 해결되지 않아 약 한달간 고생하였습니다.
정확하게는 설명문서를 잘 읽지 않았다는 것이 가장 큰 이유중 하나 입니다
기본적인 환경을 한번 직접 해 본다면 그 다음부터는 많은 성장에 도움이 될 것 입니다
이 글을 작성한 계기는 자신에 대한 백업 이기도 하고, 또 이런 문제로 고생하시는 분들께 도움이 될까 해서 입니다
[Partition Driver] Catalog View: Core OS->Windows CE Devices->File Systems and Data Store-> Storage Manager->Partition Driver
[FAT File System] Catalog View: Core OS->Windows CE Devices->File Systems and Data Store->Storage Manager->FAT File System
이 세가지 파일 추가로 에뮬레이터에서 파일을 저장하고 읽어올 수 있는 환경을 정의한다
5. 한국어 폰트 추가
[한국어 폰트 굴림체 추가] Catalog View: Core OS->Windows CE Devices->International->Locale Specific Support->Korean->Fonts->Gulim (GL_CE) Catalog View: Core OS->Windows CE Devices->International->Locale Specific Support->Korean->Fonts->Gulim & GulimChe (Choose 1)->Gulim & GulimChe (Subset 1_30)
[한국어 기능 추가] Catalog View: Core OS->Windows CE Devices->International->Locale Specific Support->Korean->Input Method Editor->IME 97
[한국어 입력기 추가] Catalog View: Core OS->Windows CE Devices->International->Locale Specific Support->Korean->Input Method –>Korean Soft Keyboard Sample
6. 플랫폼 환경설정
Menu - Platform->Settings… 선택
[Locale] 탭에서 다음과 같이 설정한다
Locales : 한국어 추가 Default language : 한국어 선택
[OK]를 눌러 환경설정을 저장한다
7. 이미지 빌드
Menu – Build OS->Sysgen 선택
※ 주의 : 초급자는 Build and Sysgen 이나 Clean Before Buildig은 실행하지 않는 것이 좋다 자칫하다가 포맷하는 깔끔한 경우가 생긴다 (진짜다!)
화면의 Copy Files to Release Directory After Build와 Make Run-Time Image After Build가 설정되어있는 것을 볼 수 있는데, 이는 SDK생성을 위해 필요한 과정이니 설정하는것이 좋다 만약, 이 과정을 못거쳤을 경우, 아래 Copy Files to Release Directory와 Build와 Make Run-Time Image를 따로 실행하여도 무방하다
Sysgen이 완료될 때까지 느긋하게 기다린다 (시스템 성능에 따라 대략 5분에서 10분 소요)
8. Build 완료
위에서 작성한 모든 과정에 특별한 에러가 없을경우 Sysgen은 종료하고 릴리즈 디렉토리 복사와 이미지 생성까지 완료한 화면이다
Platform Builder 5를 이용하여 VS2005 에뮬레이터 SDK를 생성하기는 총 3단계로 진행될 것 입니다
1단계 : Platform Builder 5 - Workspace 생성
2단계 : OS Design
3단계 : SDK 생성 및 SDK설치와 VS2005 설정
이렇게 진행될 예정입니다