'전체 글'에 해당되는 글 678건

  1. 2011.08.13 VS2005 유니코드
  2. 2011.08.13 Visual Studio 2005 실행파일 배포
  3. 2011.08.13 Visual C++ 2008의 새로운 기능
  4. 2011.08.13 자주쓰는 Visual Assist 단축키

출처 : http://cafe.naver.com/busanprograming.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=151

 

VS 2005 부터는 프로젝트 생성시 기본적으로 유니코드 문자집합을 선택하게 되어 있습니다.
처음엔 속성에서 일일이 멀티 바이트 문자집합으로 바꿔주기도 했지만 곧 그것도
귀찮더군요. 그래서 현재는 그냥 유니코드에 맞는 코딩을 하고 있습니다.

윈도우 프로그래밍에선 유니코드나 멀티바이트나 별 차이는 없습니다.

단지 문자나 문자열 앞에 L 또는 TEXT() 매크로를 사용해주는 것만으로도 충분합니다.

그 외엔 운영체제에서 자체 지원하는

lstrcpy(strcpy)
lstrcmp(strcmp)
lstrcat(strcat)
lstrlen(strlen)

정도만 기억하시면 충분합니다.

제 경우는 문자열엔 TEXT()를 문자엔 L을 붙여서 코딩하고 있습니다.
둘의 차이는 거의 없기에 어떻게 사용하든 본인의 자유겠죠.
(int 를 제외한 변수를 선언할때도 주의해주셔야 합니다만...
주의할 거래봐야 char 를 TCHAR로 선언해주는 것 정도죠)

하지만 콘솔 프로그래밍으로 넘어가면 이건 그렇게 만만치가 않습니다.

VS 2005 이전에 유니코드를 지원하던 앞에 w가 붙는 함수가
2005로 넘어오면서 w..._s 형으로 다시 바뀐 겁니다.

_s 형으로 바뀐 건 좋은데 가끔은 받아들이는 인수의 수조차 바뀐 것들이
있어서 사람을 미치게 합니다.

예를 들면

wstrcat_s
예전엔 2개의 인수만을 받던 strcat 함수가 3개의 인수를 받도록 바껴버린거죠.
물론 여전히 2개의 인수를 받고 유니코드를 지원하는 lstrcat을 사용하면 그만이죠

하지만 어딘가 제가 모르는 저런 식의 함수가 분명 있을 겁니다.
(콘솔 프로그램의 의미가 거의 바닥을 치는데 이런 예기는 사실 별 의미가 없죠.)

그래도 혹시나 콘솔 프로그램을 작성하시다가 유니코드를 지원하는 함수를
알 필요가 있을 땐 MSDN을 이용해 보십시오. 영어를 몰라도
대충보면 어떤 함수를 사용해야 하는지 찾으실 수 있으실 겁니다.

서론은 여기까지 하고 이 글을 적는 본론으로 들어가죠

제가 콘솔 프로그램을 하나 만들었습니다. 물론, 유니코드를 사용했죠.

그런데 막상 실행해보니 도스창에 한글이 찍히지 않는 겁니다.
에러 경고 하나도 뜨지 않는데 한글을 안 찍히니 미칠 지경이더군요.

미친듯이 찾아 본 결과 답을 찾았습니다. 물론, 어째서 그런지는 모릅니다.
전혀요;

_wsetlocale(LC_ALL,TEXT("Korean"));

이걸 적어줘야 하더군요. 함수 이름만으로는 지역변경 - 한국 쯤 되는군요;

위 함수의 정의는 locale.h 안에 들어 있습니다.

위 함수를 적어주고 컴파일 하니 한글 출력이 되더군요.
(망할 유니코드...)

그 외에 이런 경우도 있습니다. 멀티바이트 유니코드 안 따지는 함수들이
가끔 있습니다. 그 형태 그대로 유지해서 어느 쪽에나 적응가능하죠.

그런데 가끔 이 함수들이 인수로 받아들이는 데이타형이 유니코드에 맞지 않을때가 있습니다.

예를 들면 소켓 프로그래밍의 send,recv 함수 같은 게 있죠
send,recv 함수는 두번째 인수로 (const char*) 형을 받습니다.

이 경우

TCHAR a[10];

send(socket,(char*)a,......);
//에러

send(socket,(char FAR*)a,......);
//성공

이런 식으로 적어주어야 합니다. recv 역시 마찬가지로 char FAR*
형으로 캐스팅해주면 유니코드 문자열을 넘겨줄 수 있습니다.

지금까지 제가 유니코드를 사용해 코딩하면서 겪은 문제점은 이걸로 대충 다 적었습니다.

아... 마지막으로 강조해야 할 부분 유니코드는 한 문자가 1바이트가 아니라 2바이트란 거죠.
(멀티바이트는 1바이트 문자셋과 2바이트 문자셋이 섞여 있죠)

유니코드에선 심지어 영어도 2바이트를 차지합니다.

크게 중요해 보이지 않는 거 같지만 이걸 깜박하면 자신도 모르게 에러를
내 버릴 수가 있습니다. (특히 메모리 활당 부분)

그럼, 별 의미 없는 글이나마 읽어주셔서 감사합니다.

p.s : wprintf 함수의 경우 유니코드 문자열을 출력할때는 %s 가 아니라 %S를 써야 합니다
안 그럼 알 수 없는 외계어가 출력되죠.

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,

출처 : http://blog.naver.com/gameprog2/150030216567

 

visual studio 2005 프로그램 배포하기!! (Native)

 

비주얼 스튜디오 2005가 되면서 프로그램 배포가 엄청 어려워졌다.

이전 처럼 그냥 만들어 dll만 같은 폴더에 넣으면 되지 않는 요상한 시스템으로 변경되었다.

나름 dll 지옥에서 벗어나는 것이라고 얘기하지만 배포는 더 어려워만 졌다. ㅜ_ㅜ;;

 

참고 : Microsoft Visual C++ 2005 Redistributable Package 를 MS에서 배포하고 있지만 이거 안됨.-_-;;

 

* 일단 이글은 이론적인 내용보다는 실무적인 부분으로 배포자체만을 다룬다.

 

0. 들어가기 전

    Dependency Walker 라는 프로그램을 받아서 설치해야함.

 

1. win32 응용프로그램 배포하기.

 

- 비주얼 스튜디오에서 프로젝트 옵션이 기본 설정일 경우 배포하기.

 

   * 실행파일을 디펜던시워커에 넣어 dll 종속성을 확인한다.

   * F9를 눌러 전체 보기를 하면 각 dll의 실제 위치가 나온다.

   * 실제 위치중 c:\windows\winsxs 폴더에 위치한 dll에 주목한다.

   * winsxs 폴더의 dll은 실제로 응용프로그램이 참조하는 dll 이므로 배포하고자 하는 시스템에도 같은 위치에 깔려야 한다.

    예) c:\windows\winsxs\x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f

   *위 예와 같이 엄청 긴 폴더 밑에 실제 dll 이 위치한다.

   *확인된 모든 winsxs폴더 dll들을 모두 카피하여 따로 복사해 둔다.

   *winsxs 폴더에는 Manifests폴더가 존제하고 예와 같은 긴 이름의 파일 두 개가 존재하는데 이것도 같은 위치에 깔려야 한다.

          x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f.cat

          x86_Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_5490cd9f.manifest

   *한 개의 winsxs dll 이 있으면 위 와 같이 기본으로 총 세 개의 파일을 복사해야한다.

 

   *추가로 winsxs폴더에는 Policies폴더가 존제하고 아래 예와 같이 긴 폴더가 있다면 이것도 같은 위치에 깔려야 한다.

          x86_policy.8.0.Microsoft.VC80.DebugCRT_1fc8b3b9a1e18e3b_x-ww_09e017b4
        이름을 보면 세 번쩨 언더 바 다음은 다른 값이지만 역시 복사해서 깔아야 한다.


   *일단 현재 내가 아는 방법이다.

- 비주얼 스튜디오에서 프로젝트 옵션을 변경하여 배포하기.

 

* 매니페스트를 제거하고 배포하면 위와 같이 복잡한 dll 카피를 안해도 된다.(단, 이것은 win32 버전만 해당한다.)

 

2. MFC 응용프로그램 배포하기.

 

- 비주얼 스튜디오에서 프로젝트 옵션이 기본 설정일 경우 배포하기.

 * 이것은 win32 방법과 같이 winsxs파일을 다 찾아서 복사해주어야한다.

 * 주의 점 : winsxs기본 파일들까지 카피 복사 할 필요는 없다.

   예) c:\windows\winsxs\x86_Microsoft.Windows.* 폴더들은 기본이기에 거의다 깔려 있다.(xp이상..)

 

- 비주얼 스튜디오에서 프로젝트 옵션을 변경하여 배포하기.

 * 프로젝트 속성페이지 - 구성속성 - 일반 - MFC사용 의 내용을 '정적 라이브러리에서 MFC 사용'으로 변경한다.

 * 이것은 실행 파일에 라이브러리를 붙여버리는 것으로 따로 dll을 카피할 필요가 없다.

 
===========================================================================================================
 
안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,

출처 : http://msdn.microsoft.com/ko-kr/library/bb384632.aspx

 

Visual C++ 2008 새로운 기능

업데이트: 2007 11

항목에서는 Visual Studio 2008 릴리스의 기능과 변경 사항에 대해 설명합니다.

 Visual C++ IDE(통합 개발 환경)

단원

정의

이제 ATL, MFC Win32 응용 프로그램에서 만들어지는 대화 상자가 Windows Vista 스타일 지침을 따릅니다.

Visual Studio 2008 사용하여 프로젝트를 만들면 응용 프로그램에 삽입한 모든 대화 상자가 Windows Vista 스타일 지침을 따르게 됩니다. 이전 버전의 Visual Studio에서 만든 프로젝트를 다시 컴파일하면 모든 기존 대화 상자가 이전 버전의 모양을 그대로 유지합니다. 응용 프로그램에 대화 상자를 삽입하는 방법에 대한 자세한 내용은 대화 상자 편집기 참조하십시오.

이제 ATL 프로젝트 마법사에 모든 사용자를 대상으로 구성 요소를 등록하는 옵션이 제공됩니다.

Visual Studio 2008부터는 모든 사용자의 구성 요소 등록 선택하지 않으면 ATL 프로젝트 마법사로 만드는 COM 구성 요소와 형식 라이브러리가 레지스트리의 HKEY_CURRENT_USER 노드에 등록됩니다. 자세한 내용은 ATL 프로젝트 마법사, 응용 프로그램 설정 참조하십시오.

ATL 프로젝트 마법사에서는 이상 특성을 사용하는 ATL 프로젝트를 만드는 옵션을 제공하지 않습니다.

Visual Studio 2008부터는 ATL 프로젝트 마법사에 프로젝트의 특성 사용 상태를 변경할 있는 옵션이 없습니다. 마법사에서 만들어지는 모든 ATL 프로젝트는 특성을 사용하지 않습니다.

레지스트리에 대한 쓰기를 리디렉션할 있습니다.

Windows Vista 도입으로 레지스트리의 특정 영역에 쓰려면 프로그램을 관리자 모드로 실행해야 합니다. 하지만 Visual Studio 항상 관리자 모드로 실행하는 것은 바람직하지 않습니다. 사용자별 리디렉션을 사용하면 프로그램을 변경할 필요 없이 레지스트리 쓰기가 자동으로 HKEY_CLASSES_ROOT에서 HKEY_CURRENT_USER 리디렉션됩니다. 자세한 내용은 링커 속성 페이지 참조하십시오.

이제 클래스 디자이너가 네이티브 C++ 코드를 제한적으로 지원합니다.

이전 버전의 Visual Studio에서는 클래스 디자이너를 Visual C# Visual Basic에서만 사용할 있었습니다. 이제 C++ 사용자도 읽기 전용 모드로 클래스 디자이너를 사용할 있습니다. C++에서 클래스 디자이너를 사용하는 방법에 대한 자세한 내용은 클래스 디자이너에서 Visual C++ 코드 사용 참조하십시오.

 Visual C++ 라이브러리

일반

단원

정의

응용 프로그램을 특정 버전의 Visual C++ 라이브러리에 바인딩할 있습니다.

Visual C++ 라이브러리가 릴리스된 업데이트된 내용에 따라 응용 프로그램의 동작이 좌우되는 경우가 있습니다. 이러한 경우 이전 버전의 라이브러리가 있는 컴퓨터에서 응용 프로그램을 실행하면 예기치 않은 동작이 발생할 있습니다. 이제 응용 프로그램을 특정 버전의 라이브러리에 바인딩하여 이전 버전의 라이브러리가 있는 컴퓨터에서는 응용 프로그램이 실행되지 않게 있습니다. 자세한 내용은 응용 프로그램 재배포 특정 라이브러리에 바인딩 참조하십시오.

STL/CLR 라이브러리

단원

정의

이제 Visual C++ STL/CLR 라이브러리가 포함됩니다.

STL/CLR 라이브러리 표준 C++ 라이브러리의 하위 집합인 STL(표준 템플릿 라이브러리) 패키징이며, C++ .NET Framework CLR(공용 언어 런타임) 함께 사용할 있습니다. 이제 STL/CLR 통해 STL 모든 컨테이너, 반복기 알고리즘을 관리되는 환경에서 사용할 있습니다.

MFC 라이브러리

단원

정의

Windows Vista 공용 컨트롤을 지원합니다.

Windows Vista 기능을 지원하거나 최신 MFC 클래스의 기능을 향상시키기 위해 클래스나 기존 클래스 18개에서 150 이상의 메서드가 추가되었습니다.

CNetAddressCtrl 클래스를 사용하면 IPv4 IPv6 주소나 DNS 이름을 입력하고 유효성을 검사할 있습니다. CPagerCtrl 클래스를 사용하면 Windows 페이저 컨트롤을 쉽게 사용할 있습니다. 또한 CSplitButton 클래스를 사용하면 기본 작업이나 옵션 작업을 선택하는 Windows 분할 단추 컨트롤을 쉽게 사용할 있습니다.

C++ 지원 라이브러리

단원

정의

C++ 마샬링 라이브러리가 도입되었습니다.

마샬링 라이브러리를 사용하면 네이티브 환경과 관리되는 환경 사이에 쉽고 최적화된 방법으로 데이터를 마샬링할 있습니다. 라이브러리는 PInvoke 사용 같이 복잡하고 효율이 떨어지는 방법을 대신하여 사용할 있습니다. 자세한 내용은 Overview of Marshaling in C++ 참조하십시오.

ATL 서버

단원

정의

ATL 서버가 공유 소스 프로젝트로 릴리스됩니다.

대부분의 ATL 서버 코드베이스는 CodePlex 공유 소스 프로젝트로 릴리스되어 있으며 Visual Studio 2008 일부로 설치되지 않습니다. ATL 서버와 관련된 가지 파일은 이상 Visual Studio 포함되지 않습니다. 제거된 파일의 목록은 Removed ATL Server Files 참조하십시오.

atlenc.h 유틸리티 함수의 데이터 인코딩 디코딩 클래스와 atlutil.h atlpath.h 클래스는 이제 ATL 라이브러리에 속합니다.

Microsoft 이전 버전의 Visual Studio 지원되는 계속해서 이러한 Visual Studio 릴리스에 포함된 ATL 서버 버전을 지원할 것입니다. CodePlex에서는 앞으로도 계속해서 ATL 서버 코드를 커뮤니티 프로젝트로 개발할 것입니다. Microsoft ATL 서버의 CodePlex 버전을 지원하지 않습니다.

 Visual C++ 컴파일러 링커

컴파일러 변경 사항

단원

정의

컴파일러가 관리되는 증분 빌드를 지원합니다.

옵션을 지정하면 참조된 어셈블리가 변경된 경우 컴파일러가 코드를 다시 컴파일하는 것이 아니라 증분 빌드를 수행합니다. , 변경 내용이 종속 코드에 영향을 주는 경우에만 파일이 다시 컴파일됩니다. 자세한 내용은 일반 속성 페이지(프로젝트) 참조하십시오.

ATL 서버와 관련된 특성이 이상 지원되지 않습니다.

컴파일러는 ATL 서버와 직접 관련된 여러 특성을 이상 지원하지 않습니다. 제거된 특성의 전체 목록을 보려면 주요 변경 사항 참조하십시오.

컴파일러가 Intel Core 마이크로아키텍처를 지원합니다.

컴파일러에는 코드를 생성하는 동안 Intel Core 마이크로아키텍처에 맞게 성능을 조정하는 기능이 포함되어 있습니다. 조정 기능은 기본적으로 사용되며 Pentium 4 기타 프로세서의 성능 향상에도 도움이 되므로 해제할 없습니다.

내장 함수가 AMD Intel 프로세서를 지원합니다.

가지 새로운 내장 명령이 최신 AMD Intel 프로세서의 향상된 기능을 지원합니다. 내장 함수에 대한 자세한 내용은 Supplemental Streaming SIMD Extensions 3 Instructions, Streaming SIMD Extensions 4 Instructions, SSE4a and Advanced Bit Manipulation Intrinsics, AES Intrinsics, _mm_clmulepi64_si128 __rdtscp 참조하십시오.

__cpuid 함수가 업데이트되었습니다.

이제 __cpuid 함수가 최신 버전의 AMD Intel 프로세서에 포함된 가지 새로운 기능을 지원합니다. 새로 추가된 __cpuidex 내장 함수에서는 최신 프로세서에 대한 자세한 정보를 수집합니다.

/MP 컴파일러 옵션을 사용하면 전체 빌드 시간이 줄어듭니다.

/MP 옵션을 사용하면 파일을 동시에 컴파일하는 가지 프로세스를 만들어 여러 소스 파일을 컴파일하는 전체 시간을 상당히 줄일 있습니다. 옵션은 하이퍼스레딩, 다중 프로세서 또는 다중 코어를 지원하는 컴퓨터에서 특히 유용합니다.

/Wp64 컴파일러 옵션과 __w64 키워드는 사용되지 않습니다.

64비트 이식성 문제를 검색하는 /Wp64 컴파일러 옵션과 __w64 키워드는 사용되지 않으며 컴파일러의 이후 버전에서 제거됩니다. 컴파일러 옵션과 키워드를 대신에 64비트 플랫폼을 대상으로 하는 Visual C++ 컴파일러를 사용합니다. 자세한 내용은 Visual C++ 사용한 64비트 프로그래밍 참조하십시오.

/Qfast_transcendentals

초월수 함수에 대한 인라인 코드를 생성합니다. 자세한 내용은 /Qfast_transcendentals(빠른 초월수 강제 적용) 참조하십시오.

/Qimprecise_fwaits

/fp:except 컴파일러 옵션을 사용할 try 블록 내의 fwait 명령을 제거합니다. 자세한 내용은 /Qimprecise_fwaits(Try 블록 내의 fwait 제거) 참조하십시오.

링커 변경 사항

단원

정의

이제 사용자 계정 컨트롤 정보가 Visual C++ 링커(link.exe)에서 사용하는 실행 파일의 매니페스트 파일에 포함됩니다.

기능은 기본적으로 사용됩니다. 자세한 내용은 UAC(사용자 계정 컨트롤) 응용 프로그램에 주는 영향 참조하십시오. 기능을 사용하지 않도록 설정하거나 기본 동작을 수정하는 방법에 대한 자세한 내용은 /MANIFESTUAC(매니페스트에 UAC 정보 포함) 참조하십시오.

이제 링커가 Windows Vista ASLR(Address Space Layout Randomization) 기능을 사용하는 /DYNAMICBASE 옵션을 지원합니다.

옵션은 실행 파일의 헤더를 수정하여 로드 응용 프로그램의 주소가 임의로 지정되어야 하는지를 나타냅니다. 자세한 내용은 /DYNAMICBASE(주소 공간 레이아웃을 임의로 지정) 참조하십시오.

 Visual C++ 샘플

Visual Studio 2008 새로운 샘플

단원

정의

CFileDialog 샘플: 이벤트 순서 기록

CFileDialog 만들 생성되는 이벤트를 보여 주는 사용자 지정 대화 상자를 만듭니다.

CMNCTRL3 샘플: Visual Studio 2008에서 사용할 있는 MFC 컨트롤 데모

명령 링크 단추(CButton), 페이저 컨트롤(CPagerCtrl), 분할 단추(CSplitButton) 네트워크 주소 컨트롤(CNetAddressCtrl) 비롯하여 Windows Vista MFC에서 사용할 있는 가지 새로운 컨트롤에 대해 설명합니다.

NETADDR 샘플: Vista 네트워크 주소 검증 도구 컨트롤 샘플

Windows Vista "네트워크 주소 검증 도구" 컨트롤을 사용하는 방법을 보여 줍니다.

StlClrLibrary 샘플: STL/CLR 기능 데모

STL/CLR Library 사용할 사용할 있는 가지 기능을 설명합니다.

 Visual C++ Express Edition

Visual C++ Express Edition 추가 사항

단원

정의

이제 Visual C++ Express Edition Windows SDK 포함됩니다.

이제 Visual C++ Express Edition 사용자는 Windows SDK 따로 다운로드하여 설치하지 않고도 사용할 있습니다. Visual C++ Express Edition에는 Win32 프로젝트 마법사도 포함됩니다.

 관련 단원

단원

정의

주요 변경 사항

Visual C++ 2008 주요 변경 사항을 보여 줍니다.

프로그램 이식 업그레이드

Visual C++ 이전 릴리스에서 업그레이드된 사항과 다른 플랫폼에서 이식하는 방법에 대해 설명하는 항목의 링크를 제공합니다.

방법: 이전 버전의 Visual C++에서 프로젝트 업그레이드

이전 버전에서 Visual C++ 프로젝트를 업그레이드하는 관련된 항목의 링크를 제공합니다.

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,
< Visual Assist 단축키 >


Goto implementation (Alt+G) : 함수 원형 및 함수 구현 위치로 보내줌

Open H <-> CPP (Alt+O) : .h파일과 .cpp파일 사이를 왔다갔다 하게 해줌

Popup context menu (Shift+오른쪽마우스) : va 확장 메뉴 보여줌

List method in current file (Alt+M) : 현재 파일의 모든 method 리스트를 보여줌

Dlg open file in workspace (Shift+Alt+O) : warkspace에 존재하는 모든 파일 리스트를 보여줌

FindReferences (Shift+Alt+F) : 선택된 레퍼런스와 같은 리스트를 보여줌


Back(Alt+Left Arrow) : 브라우져에서처럼 뒤로 돌아가기를 실행한다.
Forward(Alt+Right Arrow) : 브라우져처럼 앞으로 가기를 실행한다.
Paste Multiple(Shift+Ctrl+V) : 멀티플 클립보드 버퍼 내용을 보여주고 paste할 수 있게 한다. 
Find Next(Alt+Shift+F3) : 현재 마우스커서가 가르키고 있는 Symbol을 이후에서 찾는다.


안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,