기본 콘텐츠로 건너뛰기

비주얼 C++ 애드인 프로그램(2) : 퍼포스 外

출처 주혀니 in ... | 가을하늘
원문 http://blog.naver.com/mydaylee/140020006265
저자: 서진택
원출처: IT EXPERT, 윈도우 프로그래머를 위한 MFC 구조와 원리(한빛미디어, 2005) 부록 중에서



퍼포스

퍼 포스는 공동작업에 필요한 소스 관리 도구(소스 컨트롤, source control)다. 한 프로젝트에 필요한 소스 코드를 여러 명이 공유하는 경우, 소스 컨트롤의 사용은 필수적이다. 많은 소스 컨트롤이 있지만, 퍼포스의 장점은 강력한 소스 머지(source merge) 기능이다. 같은 소스를 2명이서 편집한 경우 발생한 소스의 충돌을 퍼포스는 훌륭하게 자동 머지(auto merge)한다(물론 자동으로 머지되지 않는 경우, 머지 툴이 실행되어 수동으로 머지해야 한다).



[그림 A-7] 퍼포스 메뉴: 등록된 소스의 편집을 시작하기 위해서 소스 저장소에서 가져오는 것을 체크 아웃(check out)이라고 한다. 체크 아웃된 소스의 편집이 끝나고 체크 인(check in)해 주면, 다른 사람은 가장 최근의 소스를 얻을 수 있다. 퍼포스는 여러 명이 동시에 같은 파일을 체크 아웃하는 것을 허용하며, 이러한 파일의 체크 인 시에 자동 머지를 지원한다.

리스토어 클래스 뷰 애드인

잘 정돈된 클래스 뷰의 폴더 구조가 깨어져서 고생한 독자들에게 리스토어 클래스 뷰(Restore ClassView)는 필수적이다. 아래의 화면은 필자가 참여하고 있는 범퍼킹(BumperKing) 프로젝트의 깨어진 클래스 뷰 화면이다.



[그림 A-8] 깨어진 클래스 뷰 폴더 구조: 리스토어 클래스 뷰를 이용하면 깨어진 클래스 뷰를 복구할 수 있다.

클래스 뷰 폴더 구조를 복구하기 위해, 리스토어 클래스 뷰 툴바의 열기 버튼을 선택해서 가장 최근에 저장한 클래스 뷰 구조 파일을 불러온다.



[그림 A-9] RestoreClassView: 클래스 뷰 폴더 구조의 열기와 저장을 지원한다.

툴바에서 리스토어 클래스 뷰 [열기] 버튼을 선택한 다음, 확장자가 .clv인 가장 최근에 저장해놓은 파일을 선택하면 클래스 뷰 폴더 구조가 복구된다.



[그림 A-10] 복구된 범퍼킹 프로젝트의 클래스 뷰: 소스가 1000개를 넘어가는 큰 프로젝트에서 클래스 뷰 구조를 복구하는 기능은 많은 도움이 된다.

비주얼 어시스트

비 주얼 어시스트는 소스 작성을 돕는 편리한 툴이다. 대표적인 기능으로 멤버 함수 자동완성 기능, 멤버 함수 찾아가기 기능, 편집 문맥 표시 기능, 프로젝트 파일 열기 기능, 다중 클립보드 기능 등이 있다. 또한 클래스의 이름과 멤버 함수를 다른 색으로 표시하는 강화된 컬러기능은 한 눈에 함수의 종류를 판단하는데 도움을 준다. 아래의 그림은 비주얼 어시스트의 멤버 함수 자동완성 기능을 보인다.



[그림 A-11] 비주얼 어시스트의 소스 자동 완성 기능: 객체 이름 다음에 .이나 ->를 적는 순간 팝업되며, 두 문자를 타이핑치고, 탭 키를 누르면 여러 번의 타이핑을 줄일 수 있고, 타이핑 오류를 미연에 방지한다.

비주얼 어시스트의 멤버 함수 찾아가기 기능은 현재 커서가 위치한 문맥에서 클래스의 멤버 함수를 찾아가는 기능을 제공하므로, 빠르게 연관된 멤버 함수로 이동할 수 있다.



[그림 A-12] 비주얼 어시스트의 멤버 함수 찾아가기 기능: 멤버 함수의 이름을 입력하기 시작하면 일치하는 멤버 함수가 강조되고 엔터 키를 누르면 해당 멤버 함수로 이동한다.

비 주얼 어시스트의 프로젝트 파일 열기 기능도 유용하다. 소스 파일이 클래스의 헤더를 포함한 경우, 위저드 바의 클래스 찾기 기능으로 쉽게 이동할 수 있지만, 전역 변수를 모아둔 파일이나, 이름 공간이 정의된 파일 등은 위저드 바의 클래스 찾기 기능을 이용해서 쉽게 해당 클래스로 이동할 수 없다. 이때 비주얼 어시스트의 프로젝트 파일 열기 기능을 선택하고, 파일 이름을 입력하기 시작하면 해당 파일을 강조하고 몇 번의 타이핑으로 해당 파일을 열 수 있다.
혹 독자들은 클래스 뷰나 파일 뷰에서 열려는 파일을 선택하면 되는데, 뭐가 문제지? 라고 생각할 수도 있을 것이다. 하지만 프로젝트를 이루는 소스 파일의 개수가 1000여개가 된다고 생각해보라. 긴 파일들의 리스트에서 소스파일을 찾는 것은 고된 일이지만, 비주얼 어시스트가 있으면 대여섯 번의 타이핑만으로 소스를 열수가 있다.



[그림 A-13] 비주얼 어시스트의 프로젝트 파일 열기 기능: 프로젝트 파일 열기를 단축 키로 매핑해 놓으면 대여섯 번의 타이핑만으로도 소스를 열 수 있다.

비 주얼 어시스트의 문맥 표시 기능은 현재 커서가 위치한 곳의 문맥 정보를 동적으로 표시해준다. 예를 들면, 긴 if문에서 복잡한 블록을 편집중일 때, if문의 시작 부분은 화면 위로 스크롤 되어 보이지 않고, 특정 블록의 위치가 헷갈릴 때, 비주얼 어시스트의 문맥 기능을 보면 커서가 위치가 곳이 어딘지 쉽게 알 수 있다.



[그림 A-14] 비주얼 어시스트의 문맥 기능

비 주얼 어시스트의 다중 클립보드 기능은 클립보드로 복사한 최근 텍스트 중에서 하나를 선택하여 붙여넣기를 하는 것을 지원한다. 예를 들면 복사해야 하는 코드가 세 군데에 흩어져 있고, 붙여넣기를 할 때 이 세 개 중 하나를 사용해야 한다고 하자. 비주얼 어시스트가 있다면, 원하는 세 곳의 텍스트를 선택하여 Ctrl+C를 눌러 일반적으로 복사한 다음, 붙여넣기를 할 때, Ctrl+V가 아니라 Ctrl+Shift+V를 누르면 아래와 같이 클립보드의 내용이 메뉴로 표시된다. 사용자는 원하는 클립보드의 내용을 선택하면 된다.



[그림 A-15] 비주얼 어시스트의 다중 클립보드 기능: 클립보드로 복사되는 최근의 텍스트 중에서 붙여넣기 원하는 텍스트를 선택할 수 있다.

윈탭

윈탭은 편집중인 소스 파일을 탭 컨트롤로 표시해주는 도구다. 파일 이름을 보고, 열려는 파일을 선택할 수 있으므로 편리하며 다양한 파일 관련 기능들을 제공한다.



[그림 A-16] 윈탭의 파일 탭 기능

탭 컨트롤 위에서 마우스 오른쪽 버튼을 누르면 다양한 종류의 컨텍스트 메뉴를 제공한다. 아래의 그림을 보자.



[그림 A-17] 윈탭의 컨텍스트 메뉴

눈에 띄는 기능은 탐색기의 컨텍스트 메뉴를 그대로 제공한다는 것이다. 그것은 비주얼 C++ 안에서 탐색기로 할 수 있는 많은 작업을 할 수 있다는 것을 의미한다.

인크레디빌드

인 크레디빌드가 없는 비주얼 C++는 생각하기도 싫다! 인크레디빌드는 네트워크를 통하여 분산 컴파일/링크를 지원하는 유용한 툴이다. 필자가 진행 중인 범퍼킹 프로젝트의 경우 Rebuild All을 선택하면 펜티엄4 2.6에서 약 20분이 걸린다. 그런데 인크레디빌드를 사용하면 인크레디빌드 서버에 등록된 모든 컴퓨터와 협조하여 소스를 컴파일하고 링크하여 1분도 걸리지 않아 실행파일을 생성한다.



[그림 A-18] 인크레디빌드(IncrediBuild)

<출처 : 한빛 네트워크 http://network.hanbitbook.co.kr/view.php?bi_id=1112 >

댓글

이 블로그의 인기 게시물

80040154 오류로 인해 CLSID가 {xxxx-...}인 구성 요소의 COM 클래스 팩터리를 검색하지 못했습니다.

원문보기 .NET 으로 만든 응용프로그램에서 com 객체를 호출한 경우 Windows7 64bit 에서 제목과 같은 에러가 발생했다. Win32 COM 과 .NET 프로그램간의 호환성 때문에 생긴 문제였다. 원인은 .NET 실행시 JIT 컴파일러에 의해 최적화된 기계어로 변환되기 때문.. Win32 COM은 컴파일시.. Win32 COM에 맞춰 빌드 속성에서 하위버전으로 맞춰 컴파일을 다시하는 방법도 있지만 메인 프로젝트가 .NET이라면 참조되는 모든 프로젝트를 다 바꿔야할 노릇.. 또 다른 방법은 COM+를 이용하여 독립적으로 만드는 것이다. 분리시키는 방법은 아래 주소해서 확인할 수 있다. http://support.microsoft.com/kb/281335 나의 경우는 Win32 COM DLL을 64비트 .NET 프로그램에서 참조하니 COM 객체를 제대로 호출하지 못하였습니다. 그래서 .NET 프로그램의 Target Machine을 x86으로 설정하니 제대로 COM 객체를 호출하였습니다.

[Pyinstaller] 실행 파일 관리자 권한 획득하기

고객사에서 일부 사용자에게서 프로그램 오류가 발생한다며 아래와 같이 에러 캡처를 보내왔습니다. 프로그램에서 로그를 남기기 위해 로그 파일을 생성하는데 권한의 문제로 로그 파일을 생성하지 못해 프로그램 오류가 발생한 것 같습니다. 처음에는 Python 코드에서 관리자 권한을 요청하는 코드를 넣으려고 했는데, 실제로 Stackoverflow를 찾아보면 이런 내용이 나옵니다. 프로그램이 관리자 권한으로 실행되지 않았다면 관리자 권한으로 다시 프로그램을 실행시키는 코드입니다. import os import sys import win32com.shell.shell as shell ASADMIN = 'asadmin' if sys.argv[-1] != ASADMIN: script = os.path.abspath(sys.argv[0]) params = ' '.join([script] + sys.argv[1:] + [ASADMIN]) shell.ShellExecuteEx(lpVerb='runas', lpFile=sys.executable, lpParameters=params) sys.exit(0) 하지만 개인적으로 이런 방식은 마음에 들지 않았고 조금 더 찾아보니 Pyinstaller로 exe 파일을 만들 때 옵션을 설정하여 관리자 권한을 요청하도록 할 수 있다고 합니다. --uac-admin을 옵션에 추가하면 프로그램 실행 시 관리자 권한을 요청할 수 있습니다. pyinstaller.exe --uac-admin sample.py 하지만 안타깝게도 이 방식은 원하는 대로 동작하지 않았습니다. 마지막으로 manifest 파일을 이용하여 시도해보았습니다. spec 파일을 이용하여 pyinstaller로 빌드하면 <실행 파일 이름>.manifest 라는 파일이 생성됩니다. 파일에서 아랫부분을 찾아볼 수 있습니다. <security> <re

초간단 프로그램 락 걸기

프로그램에 락을 걸 일이 생겨났다. 하드웨어 락을 걸면 쉬울텐데 그 정도는 아니고 프로그램의 실행 날짜를 제한 해 달라고 한다. 그래서 파일(license.lic)을 가지고 락을 걸리고 결정을 했다. 요구 사항은 아래와 같다. 1. license.lic 파일이 없으면 프로그램을 실행 할수 없게 한다. 2. 지정한 날짜를 넘어서는 프로그램을 실행 할수 없게 한다. 3. 사용자가 시스템 날짜를 되돌렸을때 인식하여 프로그램을 실행 할수 없게 한다. 음.... 1.번 문제는 사용자가 프로그램을 실행하기 위해서 license.lic 파일을 받아야만 한다. license.lic 파일에는 최근 실행 날짜/종료날짜 이런식으로 적도록 한다.(물론 내용은 암호화 한다.) 최근 실행날짜는 프로그램이 실행때마다 업데이트 하도록 하고 시스템 날짜와 비교하여 시스템 날짜가 최근 실행 날짜보다 이전의 날짜면 시스템 날짜를 되돌렸다고 인식하도록 한다.(3.번 문제 해결) 시스템 날짜와 종료 날짜를 비교하여 시스템 날짜가 종료 날짜를 넘으면 프로그램을 실행 할수 없도록 한다.(2.번 문제 해결)