프로그래밍/Mobile |
2009. 10. 21. 10:44 |
Posted by 99%
“스마트폰 모바일 랩” 포럼에서 T Store 공모전을 맞아 두 번째 세미나를 개최합니다.
모바일 어플리케이션 개발에 관심을 갖고 있는 개발자가 알아야 할 것들은 너무나 많습니다. 다양한 모바일 OS, 다양한 단말기 환경들.. 이런 개발 환경은 우리의 선택을 어렵게 만들고 있습니다.
스모랩에서 준비한 두 번째 세미나에서는 “동등계층 협업 시스템” DevForge 를 통해서 여러분의 동료와 킬러앱 생산을 위해 협업할 수 있는 방법을 소개해 드리고, 삼성의 스마트폰 킬러 단말기 옴니아의 개발키트를 사용해서 옴니아 단말에 최적화된 킬러앱을 제작할 수 있는 방법을 제시합니다.
그리고 한 번의 노력으로 다양한 단말기 위에서 동작하는 킬러앱을 제작할 수 있는 SKT 가 제안하는 새로운 개발 프레임워크 SKAF 를 만나보세요!!!
킬러앱(KillerApp)을 만들기 위한 발걸음을 “스마트폰 모바일 랩” 세미나와 함께 시작하세요.
주 제
Windows Mobile 응용 개발 도구
개최일시
2009년 10월 17일(토) 14:00 ~ 17:30
장소
SK텔레콤빌딩 4층 슈팩스홀
참가대상
- Windows Mobile 응용프로그램 개발을 시작하시는 분
- 삼성 Omnia SDK에 관심이 있는 분
- SKAF-SKT 프레임워크을 사용한 개발에 관심이 있는 분
내용수준
초급/중급
참가비
무료
시 간
Session
강 좌 제 목
13:00~14:00
60분
-
세미나 등록
14:00~14:10
10분
-
오프닝 인사
14:10~15:00
50분
Session 1
어플리케이션 개발을 위한 DevForge 사용 전략
발표자: ㈜데브피아 송승규
15:00~15:10
10분
-
Break Time
15:10~15:50
40분
Session 2
삼성 Omnia SDK
발표자: 형아소프트 대표 신석현
15:50~16:00
10분
-
Break Time
16:00~16:50
50분
Session 3
교육 프로그램 소개
발표자: SK텔레콤 김성균 매니저
SKAF-SKT
발표자: 이노에이스 고영관 과장
16:00~17:10
20분
-
Q & A
* 각 섹션의 쉬는 시간은 유연성 있게 조절됩니다.
- 서울시 중구 을지로2가 SK텔레콤빌딩(SK T-Tower) 4층 슈팩스홀 - 교통편 : 지하철 2호선 을지로 입구역 4번 출구방면
- 세미나 당일 선착순 60명에게 경품이 지급됩니다. (사전 온라인 참가 신청자에 한합니다.)
Bluetooth GPS NCS-NAVI R120
선착순 40명
SanDisk MicroSDHC(T-Flash) 4GB
선착순 20명
- 세미나 당일 주차는 지원되지 않습니다. 가급적이면 대중교통을 이용해 주시기 바랍니다.
- 세미나 참가확인 페이지는 세미나 신청 후 [참가신청] 버튼을 다시 클릭하시면
확인 하실 수 있습니다.
- 강의자료 : 스모랩 세미나 게시판을 참고하세요.
VC6에서 Release로 빌드시 자꾸 fatal error C1083: Cannot open compiler intermediate file: 'c:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\a09236ex': Permission denied 위와 같은 에러가 발생한다.
메세지에 따라 파일을 찾아가서 지워보니 다시 컴파일이 된다.
몇번을 이렇게 반복하고 나서 인터넷으로 찾아보니
결론은 카스퍼스키때문이었다.
몇일전 부터 사용하기 시작한 카스퍼스키.. 에베스트보단 훨 빠른거 같아 좋았는데..
이런 문제가 발생할 줄이야..
필수 플러그인 설치방법 ( 주의 3.5 버전 이상에서는 별도의 플러그인 설치없이 대부분의 동영상이 재생됩니다.)
[adobe Flash player]
- Flash Player 다운받는다.
- Univertial Extractor 1.5 로 다운받은 파일을 푼다.
- NPSWF32.dll , flashplayer.xpt( 안넣어도 될지도....) 파일을 Dataplugins 폴더에 넣는다.
[윈도우 미디어 플래이어]
- Windows media player 플러그인 다운받는다.
- Univertial Extractor 1.5 로 다운받은 파일을 푼다.
- ffplugin.msi 를 다시 Univertial Extractor 1.5 로 푼다.
- np-mswmp.dll 을 Dataplugins 폴더에 넣는다.
추천 부가기능
- IE Tab : 현재 페이지를 IE 렌더링으로 보여준다. ( 파폭에서 깨지는 웹페이지를 정상적으로 볼 수 있음 )
- FireGestures : 마우스 동작으로 다양한 명령어 실행
- DownLoad Statusbar : 파일 다운로드 시 화면 하단에 다운로드 진척상황 표시
- DownThemAll! : 여러개의 이미지 또는 파일을 한꺼번에 다운로드 받을때 매우 편리함
- DownloadHelper : 웹상의 이미지와 비디오 파일들을 다운로드 할 수 있도록 해줌
- Personal Menu : 파이어폭스 기본 메뉴를 편집할 수 있게 해줍니다.
//DATA 폴더를 통째로 복사하면 설정을 가져올수 있고
//setting 파일을 열어서 경로지정을 확인해본다
// 부가기능 및 좋은 설명
http://www.choboweb.com/entry/%ED%8C%8C%EC%9D%B4%EC%96%B4%ED%8F%AD%EC%8A%A4-%ED%8C%81-%EB%A9%94%EA%B0%80-%EC%BD%9C%EB%A0%89%EC%85%98-Ver-01
http://donghaerang.com/category/Firefox/Firefox%20Add-on?page=2
http://kamingn.egloos.com/category/%EB%B6%88%EC%97%AC%EC%9A%B0%20%EC%93%B0%EB%8B%A4%EB%93%AC%EA%B8%B0
http://tong.nate.com/thesunrises/46736112
http://jugug.net/entry/Using-Firefox-Addons-2
//포터블 파이어폭스를 설치하여 사용할 때 좀 더 빠르게 실행되도록 하는 팁
http://portableapps.com/support/firefox_portable#performance
vc6에서 빌드해서 사용하기 위해선 1_34_1버젼을 사용하기 바란다. 상위버젼은 vc를 설치하고 Platform SDK만 설치했는데도 제대로 빌드가 안된다.또한 VC6과 상위버젼을 같이 사용시 빌드 옵션을 -sTOOLS=msvc로 설정해도 상위버젼의 컴파일러로 빌드가 된다.(필자는 vc6과 2008을 같이 사용중인데 계속 vc9(2008)로만 컴파일이 된다.) 이렇게 두개의 vc버젼을 같이 사용할때는 vc6를 먼저 설치하고 빌드한후 다른 vc버젼을 설치해서 사용하는게 편하다.
참고로 1_34_1에는 circular_buffer가 없다. 또한 1_34_1버젼까지는 boostpro도 vc7.1까지만 지원한다.
boost사이트의 다운로드에 boost-binaries라고 컴파일된 결과물이 올라와 있지만 vc6용은 없다.
공식적인 문서는 확인 못했지만 vc6지원을 버린듯 하다;(STLPort를 설치하면 1_34_1 상위버젼도 빌드가 될지도 모르겠다.)
CRT 함수의 보안버전 Security-Enhanced Versions of CRT Functions - MSDN
warning
C4996: 'strcpy': This function or variable may be unsafe. Consider
using strcpy_s instead. To disable deprecation, use
_CRT_SECURE_NO_WARNINGS. See online help for details.
버퍼의 길이체크를 하기 위한 _s접미사가 붙는 보안 버전의 CRT 함수가 추가되었다.사용방법은 기존 함수에 _s를 붙이고 버퍼의 길이를 인자로 더 추가해주면 된다.당장은 VC에만 존재하지만 앞으로 C++표준에 추가될 수 있다고 한다.
참고사항 1. _s관련 함수는 errno_t를 반환하게 변경되었다.(에러발생) 2. _CRT_SECURE_CPP_OVERLOAD... 관련 3개의 define을 사용하면 버퍼가 배열형일 경우 Template overloads를 이용해서 기존 코드를 자동으로 _s관련 함수로 변경할 수 있다. Default 값과 설명 _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1 -> secure함수에 길이 인자관련을 생략해준다. _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 0 -> 기존함수 지원 ex) strcpy _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT 0
-> 길이체크하는 기존함수 지원 ex) strncpy 위와같이 편한 방법이 있지만 포인터형의 버퍼변수 일경우는 기존과 같이 길이값을 인자로 넣어야 한다. char a[100]; // 가능 strcpy_s(a, "hello");
char * p = new char[100]; // 불가능(컴파일 에러) strcpy_s(p, 10, "hello");
위와 같은 코드는 혼란만 올뿐이다. 결론은 secure함수를 사용할꺼라면 인자값을 사용하지말고 overload함수도 사용하지 말자.
#ifndef _TIME_T_DEFINED
typedef long time_t; /* time value */
#define _TIME_T_DEFINED /* avoid multiple def's of time_t */
#endif
/////////////////////////////////////////////////////////////////////////
// VC9(2008)
// c:\program files\microsoft visual studio 8\vc\include\crtdefs.h
#ifndef _TIME64_T_DEFINED
#if _INTEGRAL_MAX_BITS >= 64
typedef __int64 __time64_t; /* 64-bit time value */
#endif
#define _TIME64_T_DEFINED
#endif
문제점
이부분은 기존 long형으로 처리되던 부분들이 에러없이 자동으로 64비트로 변경되므로 32비트로 처리되던 코드들은 메모리주소가 밀려서 쓰레기값으로 처리될수 있다.
해결방법(임시)
_USE_32BIT_TIME_T 를 정의한다.
MSDN을 참고해보면 위와 같이 define해놓으면 time_t를 32비트로 쓸수 있다.
사용자 정의(User-Defined) 메세지
User-Defined Handlers - MSDN
아래 내용은 기존에 정의되어 사용되고 있던 것이지만 VC6에서 대충 넘어가던것을 2005부터는 정확하게 사용되어야 하는 것들이다.
1. ON_MESSAGE
MFC에서 사용자 정의 메세지를 사용시 User-Defined Handlers의 원형은 아래와 같은데
afx_msg LRESULT memberFxn( WPARAM, LPARAM ); VC6에선 반환값을 void형으로 선언하고 사용해도 문제가 없었지만 2005부터는 컴파일 에러가 발생한다
해결방법
1. ON_MESSAGE를 ON_MESSAGE_VOID로 변경한다.
-> AFXPRIV.H에 선언되어 있는 ON_MESSAGE_VOID를 사용하면 문제는 해결할 수 있지만 AFXPRIV.H파일 자체가 MFC 버젼이 바뀔경우 예고없이 바뀔 수 있는 파일이므로 조심해야하고 위매크로를 사용시 함수의 인자값이 이상하다는 글을 본적이 있으므로 사용시 주의하자. 매크로의 선언은 아래와 같다.(VC6,2008 sp1)
// like ON_MESSAGE but no return value
#define ON_MESSAGE_VOID(message, memberFxn) \
{ message, 0, 0, 0, AfxSig_vv, \
(AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(void))&memberFxn },
2. LRESULT를 반환하게 함수를 변경한다.
-> 이게 표준이니 이렇게 사용하자.
2. ON_THREAD_MESSAGE ON_THREAD_MESSAGE - MSDN
CWinThread를 상속한 클래스내에서는 ON_MESSAGE가 아닌 ON_THREAD_MESSAGE를 사용해야한다.
사용법은 동일하지만 함수원형에 반환 값이 없다. afx_msg void memberFxn( WPARAM, LPARAM );
매크로의 선언을 비교해보자.(AFXMSG_.H)
// for Windows messages
#define ON_MESSAGE(message, memberFxn) \
{ message, 0, 0, 0, AfxSig_lwl, \
(AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM))&memberFxn },
속성 -> 구성속성 -> C/C++ -> 언어 -> wchar_t를 기본 제공 형식으로 처리 -> 아니요
error C2668(함수 오버로드)
함수 오버로드에 대한 묵시적 형변환을 사용할 수 없다. VC6에선 상관없던 코드가 최신툴에선 error를 발생한다.
error C2668: 'pow' : 오버로드된 함수에 대한 호출이 모호합니다.
error C2668: 'sqrt' : 오버로드된 함수에 대한 호출이 모호합니다.
위의 에러는 double pow(double x, double y)인 pow함수등을 pow(2,2)같이 호출했을때 발생한다. 이때는 형변환을 하거나 숫자뒤에 '.'를 표시해서 실수로 만들어준다. 표준이므로 지키자.
※표준 준수를 더욱 강화하기 위해
pow의 오버로드 double pow(int, int)가 제거되었습니다. - MSDN
-> int형의 인자를 받던 pow함수가 제거되었다. 그리고 _Pow_int라는 템플릿함수가 추가되었다.
VC 프로젝트 기본 설정
WINVER 설정
VC6프로젝트를 2005이상으로 업그레이드시 WINVER 가 정의 되지 않아 Default 값을 설정한다는 메세지를 볼수 있다.
WINVER not defined. Deafaulting to 0x0502 (Windows Server 2003)
-> 2008은 Vista가 기본이다.
VS2005이상으로 프로젝트를 새로 생성시는 stdafx.h에 #include "targetver.h"가 선언되며 이곳에 프로젝트가 최소로 지원하는 플랫폼을 정의해놨다.
참고
WINVER값이 잘못설정되어 있으면 API나 라이브러리에서 윈도우의 버젼이 잘못 설정되어 이상하게 동작하거나 에러가 발생할 수도 있으므로 업데이트 후 WINVER관련을 잘 체크하자.
->_WIN32_WINNT값을 0x0500으로 선언하고 필자의 경우 CFileDilog를 사용하면 error가 발생한다. 이유는 OPENFILENAME구조체의 선언때문인데 아래 링크를 참조하자. MFC 프로젝트를 Visual C++ .NET 이나 대상 운영 체제에서 Visual C++ 2005 변경 이식 - MSDN
99%'s Code
위 정리된 사항을 필자는 아래코드로 헤더파일 하나에 넣고 stdafx의 상위에서 설정해서 사용한다.
sy는 필자 이름이므로 헷갈리지 말자 ㅎㅎ
// syDef.h
#pragma once
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// 최소로 지원하는 플랫폼 정의
// Modify the following defines if you have to target an OS before the ones
// specified in the following code. See MSDN for the latest information
// about corresponding values for different operating systems.
#ifndef WINVER // Permit use of features specific to Windows 95 and Windows NT 4.0 or later.
# define WINVER 0x0400 // Change this to the appropriate value to target
#endif // Windows 98 and Windows 2000 or later.
#ifndef _WIN32_WINNT // Permit use of features specific to Windows NT 4.0 or later.
# define _WIN32_WINNT 0x0400 // Change this to the appropriate value to target
#endif // Windows 98 and Windows 2000 or later.
#if (_MSC_VER > 1200) // VC6 초과
# ifndef _WIN32_WINDOWS // Permit use of features specific to Windows 98 or later.
# define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target
# endif
#endif // _MSC_VER // Windows Millennium Edition or later.
#ifndef _WIN32_IE // Permit use of features specific to Internet Explorer 4.0 or later.
# define _WIN32_IE 0x0400 // Change this to the appropriate value to target
#endif // Internet Explorer 5.0 or later.
// #include "targetver.h" -> .net툴에서 위코드가 포함된 헤더파일
// http://msdn.microsoft.com/en-us/library/aa383745(VS.85).aspx - Using the Windows Headers(MSDN)
///////////////////////////////////////////////////////////////////////////////////
// Visual C++ 8이상 세팅
//#define SYUTIL_USE_CRT_SECURE // CRT 보안관련 함수 사용
#define SYUTIL_NOTUSE_NONSTDC_NO // POSIX관련 CRT사용안함
#define SYUTIL_USE_32BIT_TIME_T // time_t를 32비트로 사용함
// VC8(VS2005) 이상 컴파일러설정.
#if defined(_MSC_VER) && (_MSC_VER >= 1400)
// 최신버젼의 VC라이브러리 사용
// Redistributing an Application and Binding It to Specific Libraries - MSDN
// http://msdn.microsoft.com/en-us/library/cc664727.aspx
# ifdef _BIND_TO_CURRENT_VCLIBS_VERSION
# undef _BIND_TO_CURRENT_VCLIBS_VERSION
# define _BIND_TO_CURRENT_VCLIBS_VERSION 1
# else
# define _BIND_TO_CURRENT_VCLIBS_VERSION 1
# endif
// 안전한 문자열 사용(오버플로우 방지)
// Using the Strsafe.h Functions
// http://msdn.microsoft.com/ko-kr/library/ms647466(en-us,VS.85).aspx
# define STRSAFE_NO_DEPRECATE
//#pragma warning(disable : 4995)
// time_t 64비트 처리
// Time Management - MSDN
// http://msdn.microsoft.com/ko-kr/library/w4ddyt9h.aspx
# ifdef SYUTIL_USE_32BIT_TIME_T
# define _USE_32BIT_TIME_T
# endif // SYUTIL_USE_32BIT_TIME_T
// 유니코드 형식으로 저장하라는 경고 무시 -> VS 버그임
// http://support.microsoft.com/kb/912790
# pragma warning(disable: 4819)
#endif // _MSC_VER
#if _MSC_VER == 1500
// Visual C++ 2008(9.0)
#elif _MSC_VER == 1400
// Visual C++ 2005(8.0)
#elif _MSC_VER == 1310
// Visual C++ .NET 2003(7.1)
#elif _MSC_VER == 1300
// Visual C++ .NET 2002(7.0)
#elif _MSC_VER == 1200
// Visual C++ 6.0
#elif _MSC_VER == 1100
// Visual C++ 5.0
#endif
정리중...
///////////////////////////////////////////////////////////////////////////////////////////////////////
// 문자 집합이 기본 유니코드이다.
속성 -> 구성속성 -> 일반 -> 프로젝트 기본값에서 문자 집합 -> 멀티코드 문자 집합 사용
///////////////////////////////////////////////////////////////////////////////////////////////////////
// 런타임라이브러리(CRT)이 기본 /MD, CRT라이브러리에 대해서는 고민해보아야 하고
// 기존라이브러리들과 맞춰주는게 좋다.
속성 -> 구성속성 -> C/C++ -> 언어 -> 런타임 라이브러리 -> /MT
///////////////////////////////////////////////////////////////////////////////////////////////////////
// 비증분 링크
LINK : warning LNK4076: '.\Debug/IIS.ilk' 증분 상태 파일이 잘못되었습니다. 비증분 링크합니다.
프로젝트 -> 속성 -> 링커 -> 일반 -> 증분 링크 사용 -> 아니요(/INCREMENTAL:NO)
///////////////////////////////////////////////////////////////////////////////////////////////////////
// 증분 링크
LNK4075: '/EDITANDCONTINUE'이(가) '/INCREMENTAL:NO' 사양으로 인해 무시됩니다.
프로젝트 -> 속성 -> 링커 -> 일반 -> 증분 링크 사용 -> 예(/INCREMENTAL)
증분링크란?
obj를 합치는과정에서 메모리배치랑 순서 함수들 코드, 데이터 영역등을 계산하게 되는데 이걸 매번 재계산하게되면 시간이 오래 걸리게되죠
그래서 변한건만 재계산하는 과정을 말합니다. 위의 속성은 "증분 링크" 하겠다는거죠.간간히 이전obj가 껴있어 문제가 생기는데
이땐 rebuild all해서 풀링크 하면된다고 하네요 ^^;;