VS2010 팀블로그에서 현재 미리 보는 C++11’‘Direct2D’ 강좌가 연재 되고 있습니다.

미리 보는 C++11’은 아직 VC++에서 지원해주지 못하고 있지만 새로운 C++ 표준에 들어가는 기능들을 하나씩 소개하고 있습니다. 컴파일러에서 아직 구현되지 않아서 대부분은 실제 사용해 볼 수가 없지만 새 표준에 들어가는 라이브러리 중 일부는 Boost 라이브러리를 통해서 사용해 볼 수 있습니다.

 

[미리 보는 C++11] 1. UTF-8, UTF-16(char_16t), UTF-32(char32_t) 문자형

[미리 보는 C++11] 2. override final

[미리 보는 C++11] 3. constexpr - 1

[미리 보는 C++11] 4. constexpr - 2

 

앞으로 새로 등록될 글은 아래에서 볼 수 있습니다

http://vsts2010.net/category/C++0x

 

 

 

‘Direct2D’ Windows 7에서 새로 생긴 Win32 API로 기존의 GDI를 대체할 수 있는 강력한 것입니다. 이름을 보면 알 수 있듯이 DirectX와 관계가 있습니다. Direct2D를 사용하면 2D 렌더링에 한해서는 어려운 DirectX를 배우지 않고도 DirectX로 할 때의 성능과 효과를 얻을 수 있습니다.

그리고 Direct2D Windows 8에서도 데스크탑 환경에서 돌아가는 프로그램을 만들 때는 최적의 선택입니다(C++ + XAML WinRT 환경 즉 Metro UI에서만 사용할 수 있습니다)

 

[StartD2D-1] Good-bye~~ GDI…

[StartD2D-2] GPU 인가?

[StartD2D-3] Direct2D 프로그래밍 시작하기!!!

[StartD2D-4] WIC 를 이용한 이미지 작업하기

[StartD2D-5] Direct2D의 리소스 기본 개념.

[StartD2D-6] 이동/회전 변환 이해하기

[StartD2D-7] 변환의 중심과 확대/축소/찌그러짐

[StartD2D-8] 투명 이미지 다루기

 

 

앞으로 새로 등록될 글은 아래에서 볼 수 있습니다

http://vsts2010.net/category/DirectX%2011

 

 

저작자 표시
신고
by 흥배 2011.10.04 09:30

VS 2003이나 VS2005에서 만든 VC++ MFC 프로젝트를 VS2008로 업그레이드 했을 때 아래와 같은 에러가 발생할 수 있습니다.

error C2440: 'static_cast' : cannot convert from 'UINT (__thiscall CXXX::* )(CPoint)' to 'LRESULT (__thiscall CWnd::* )(CPoint)'

 

이것은 VS2005에서는 ON_WM_NCHITTEST 메시의 함수로

afx_msg UINT OnNcHitTest(CPoint point);

로 정의 되지만 VS2008에서는

afx_msg LRESULT OnNcHitTest(CPoint point);

로 정의 되기 때문에 발생하는 문제입니다.

 

 

해결 방법

함수의 반환 타입을 UINT에서 LRESULT로 바꾸면 해결됩니다.

 

저작자 표시
신고
by 흥배 2011.02.10 09:00

VS 2003이나 VS2005에서 만든 VC++ 프로젝트를 업그레이드 했을 때 아래와 같은 에러가 발생할 수 있습니다.

manifest authoring error c1010001: Values of attribute 'level' not equal in different manifest snippets

 

 

해결 방법

[프로젝트 속성] – [링커] – [매니페스트 파일]을 선택하여

uac 실행 수준을 reuireAdminstrator

로 설정합니다.



참조 : http://www.sojins.net/tt/sojins/1084

 

저작자 표시
신고
by 흥배 2011.02.01 09:00

오늘 새로운 프로젝트를 만든 후 디버그 모드에서는 빌드가 성공해서 릴리즈 모드로 빌드를 했는데

Error 2 general error c101008d: Failed to write the updated manifest to the resource of file ".\Debug\eConsole.exe". The process cannot access the file because it is being used by another process. mt.exe "

 

위와 비슷한 에러가 발생했습니다. 혹시나 해서 비주얼스튜디오를 종료하고 다시 실행 후 빌드를 해도 같은 에러가 발생하더군요.

 

그래서 즉시 구글링에 들어가니 역시나 저 이외에도 이런 문제를 겪은 사람들이 있더군요

 

답글을 대충 보니 해결 방법은 두 가지였습니다.

 

1. 백신 프로그램이 mt.exe를 웜으로 오인하여 발생했으므로 백신 프로그램에 mt.exe는 신뢰할 수 있는 프로그램으로 등록시켜서 해결

 

2. 메뉴의 [도구] -> [옵션] -> [프로젝트 및 솔루션] -> [빌드 및 실행] 에서 최대 병렬 프로젝트 빌드 수를 낮춘다.

 

제 경우는 1번은 아니라고 판단해서 2번대로 해보니 해결 되었습니다. 제 경우는 최대 병렬 프로젝트 빌드 수의 값이 4였는데 이것을 2로 바꾸니 에러가 발생하지 않았습니다.

 

 

참고로 제가 사용한 Visual Studio 2008 SP1입니다.

 

저작자 표시
신고
by 흥배 2010.12.28 09:00

현재 SP1 베타가 나온 상태입니다.

개인적으로 제가 생각한 부분과 꽤 다른 부분이 많았습니다. 저는 Concurrency Runtime의 컨테이너나 알고리즘이 추가될지 알았는데 그렇지 않고 의외로 MFC에서 추가가 있었습니다.

 

추가되는 기능은

MFC-based GPU-accelerated graphics and animations

New AMD and Intel Instruction Set Support

Managed Incremental Build parity with Visual Studio 2008

Help Viewer

Addressing Customer Issues

 

 

그리고 VC++에 해당하는 버그 픽스 리스트는 아래와 같습니다.

 SSE2 instructions generated when /arch:SSE is specified

Missing destructor calls when optimization is enabled

Code generation bug in x64 C++ compiler (optimizer)

C++ compiler generates incorrect movups instructions iso movss

Optimizer bug (/Og) with the 64-bit 2010 Beta 2 compiler.

Visual Studio 2010 VC++ Concurrent Runtime libraries leak memory

concurrent_queue causes crash

Memory leaks reported when using simple parallel_for code

ftell returns negative value for UTF-8 files opened with textmode and ccs

vector::erase returns incompatible iterator in debug build

tr1:regex has different behavior between vs2008 and vs2010 on some regular expression

inserting in a std::vector of std::string causes memory leak

CRecordset/DoFieldExchange not working properly in Visual Studio 2010

 

 

 

MFC-based GPU-accelerated graphics and animations Win32 API Direct2D, DirectWrite Windows Animation Manager MFC용 라이브러리를 말합니다. 이중 Direct2D, DirectWrite Win7에서만 사용할 수 있습니다. Win7에서 GDI를 사용한다는 것은 크나큰 하드웨어 낭비입니다. 가능한 Direct2D, DirectWrite를 사용해야 합니다. Direct2D, DirectWrite는 기존의 GDI DirectX와 통합도 잘 됩니다. 만약 Win7에서 2D 게임을 만든다면 어렵게 DirectX를 사용할 필요 없이 Direct2D를 사용하면 됩니다.

 

 

몇 달 전에 VC++ MVP들의 메일링에서 Direct2D 같은 것들이 MFC에 안들어왔냐? MFC 버리기냐? 라고 따진 분이 계셨는데 드디어 들어왔네요. 정말 오랜만에 MFC에 공부할게 생겼네요^^

 

 

SP1에 대한 자세한 내용은 아래를 참고하세요

http://blogs.msdn.com/b/vcblog/archive/2010/12/09/vs2010-sp1-beta-what-s-on-it-for-c-developers.aspx

http://blogs.msdn.com/b/jasonz/archive/2010/12/20/visual-studio-2010-service-pack-1-beta-feedback.aspx

 

저작자 표시
신고
by 흥배 2010.12.22 00:40
세미나에서 제가 살짝 정신줄을 놓아서(? -_-;;) 이 부분 설명이 미흡했는데

int* p = nullptr;
p = new int[200];

에서 p의 첫번째 위치에서 11번째만 보고 싶은 경우는
(p+10)



11번째에서 5개만 보고 싶은 경우는
(p+10), 5




저작자 표시
신고
by 흥배 2010.12.16 21:57
세미나에서 제가 살짝 정신줄을 놓아서(? -_-;;) 이 부분 설명이 미흡했는데

int* p = nullptr;
p = new int[200];

에서 p의 첫번째 위치에서 11번째만 보고 싶은 경우는
(p+10)



11번째에서 5개만 보고 싶은 경우는
(p+10), 5




저작자 표시
신고
by 흥배 2010.12.16 21:57

CryptGenRandom는 랜덤 값을 생성하는 함수로 C 라이브러리의 rand와 비슷합니다.

틀린 점은 rand는 랜덤 값이 예측 가능하고 CryptGenRandom는 암호화 기능을 사용하여 예측 할 수 없는 랜덤 값을 생성해 줍니다.
(rand
의 경우 srand을 사용한 후 사용해야 이전과 중복되지 않은 패턴으로 랜덤 값을 생성합니다)

 


CryptGenRandom의 또 하나의 장점은 시드 값의 자료형 크기를 넘지 않는 랜덤 값을 생성합니다.
즉 시드 값의 자료형이 unsigned char라면 CryptGenRandom을 사용한 랜덤 값은 0 ~ 255 사이의 값만 나옵니다.


CryptGenRandom는 기존의 srand+rand의 조합에 비해서 장점이 있지만 단점도 있습니다. 단점은 성능입니다. CryptGenRandom가 암호화 기능을 사용하므로 rand에 비해서 느립니다. Win32 API에서는 어느 정도 차이가 나는지 잘 모르겠지만 똑 같은 기능이 있는 닷넷에서는 rnadCryptGenRandom의 성능 차이는 대략 100배 정도라고 합니다.

 

 

 

참고

Step By Step: Visual C++에서 난수 생성 방법
http://support.microsoft.com/kb/983137/ko

 

[MSDN] CryptoRandom 이야기
http://msdn.microsoft.com/ko-kr/magazine/cc163367.aspx

 

저작자 표시
신고
by 흥배 2010.11.08 09:00

VS2008까지는도구’ – ‘옵션메뉴를 통해서 VC++ 디렉토리를 설정하였습니다.

이렇게 설정한 정보는 모든 VC++ 프로젝트에 적용됩니다.

 

그러나 VS2010에서는 각 프로젝트 별로 VC++ 디렉토리를 설정합니다.


 

 

각 프로젝트 마다 독립적으로 설정을 할 수 있어서 편한 부분도 있지만 때로는 모든 프로젝트에 공통적으로 적용되어야 하는 경우는 매번 설정하는 것이 귀찮을 수 있습니다.

( 예로 DirectX boost 라이브러리 등 )

 

이런 경우속성 매니저를 통해서 VC++ 디렉토리를 설정하면 모든 프로젝트에 공통적으로 적용할 수 있습니다.

 

1. 일단 아무 프로젝트 하나를 열어 놓습니다.

2. 메뉴의보기’ -> ‘속성 관리자를 선택합니다.

 

 

3. 속성 관리자에서 ‘Microsoft.Cpp.Win32.user’를 더블 클릭해서 열어 놓습니다.


 

여기서 설정한 정보는 모든 프로젝트에 공통적으로 적용됩니다.

저작자 표시
신고
by 흥배 2010.10.28 09:00

VS.NET(VS2002)에서 MFC 프로젝트로 만들었던 프로그램을 VC++10 프로젝트로 변환하여 컴파일 했더니 에러가 발생하면서 아래의 경고가 나왔습니다.

C:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include\atlcore.h(35):#error This file requires _WIN32_WINNT to be #defined at least to 0x0403. Value 0x0501 or higher is recommended.

 

에러 내용은 프로젝트에서 정의된 _WIN32_WINNT 버전이 0x403인데 atlcore.h 버전이 최소 0x0501 이상이 되어야 한다는 것입니다.

 

그래서 _WIN32_WINN 정의한 stdafx.h 파일을 열어보니

#define _WIN32_WINNT 0x0400

되어 있었더군요. 그래서 일단 이것을 최신이 좋다라는 생각에 아래와 같이 했습니다. ^^;;

#define _WIN32_WINNT 0x0600

 

그랬더니 이제는 아래와 같은 에러가 나오더군요. -_-;

c:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afxcmn3.inl(29): error C2065: 'CCM_SETWINDOWTHEME' : 선언되지 않은 식별자입니다.

 

그래서 바로 구글링 들어갔습니다.

쉽게 저와 같은 에러가 나와서 질문을 올린 글을 찾았고 답변도 보았습니다.

문제 해결은 stdafx.h 파일에 정의된 버전의 숫자를 아래와 같이 하면 된다고 하더군요

// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Allow use of features specific to Windows 95 and Windows NT 4 or later.
#define WINVER 0x0501 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif

#ifndef _WIN32_WINNT // Allow use of features specific to Windows NT 4 or later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif

#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0501 // Change this to the appropriate value to target Windows Me or later.
#endif

#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later.
#define _WIN32_IE 0x0500 // Change this to the appropriate value to target IE 5.0 or later.
#endif

 

이렇게 하니 문제 없이 빌드가 성공 되었습니다.

 

주위에서 VC++의 새로운 버전이 나와도 쉽게 사용하지 못하는 경우가 오래 전에 만들었던 프로젝트를 포팅 할 수 없어서 이전 버전을 어쩔 수 없이 사용한다는 이야기를 종종 듣습니다.

그러나 저는 운이 좋아서인지 2002버전부터 순차적으로 새 버전의 VC++을 사용할 수 있어서 VC++6에서 VS2002로 넘어갈 때만 빌드 문제를 겪었습니다.

그래서 이런 포팅에 대한 문제는 잘 알지 못합니다. 이번에는 예전에 만들었던 코드를 C++0x 코드로 바꾸고 싶어서 오래 전에 만들었던 프로젝트를 VC++ 10로 포팅하면서 정말 정말 오랜만에 이런 문제를 겪어 보게 되고 해결 방법을 포스팅 할 수 있었습니다.

 

혹시 앞으로 또 이런 경우가 발생하면 바로 바로 공유하도록 하겠습니다
저작자 표시
신고
by 흥배 2010.10.26 09:00

Visual C++에서 프로젝트에 외부 라이브러리를 추가할 때 해당 라이브러리의 헤더 파일이 있는 디렉토리를 프로젝트 설정에서 추가 포함 디렉토리에 추가만한 후 빌드를 하면 보통 미리 컴파일된 헤더‘LNK2019’ 문제가 발생합니다.

 

미리 컴파일된 헤더

가장 쉽게는 솔루션에서 추가한 라이브러리의 cpp 소스 파일 속성에서 미리 컴파일된 헤더 사용 안함으로 선택합니다.

 

LNK2019 빌드 에러

프로젝트에 추가된 라이브러리의 소스 파일이 추가되어 있지 않았기 때문입니다. 솔루션에서 해당 파일들을 추가하면 됩니다.

저작자 표시
신고
by 흥배 2010.10.12 16:57
| 1 2 3 4 5 |

티스토리 툴바