1. UnZip
For VS2010, it’s in [Program Files]\Microsoft Visual Studio 10.0\Samples\1033\VC2010Samples.zip
 

2.  Release Compile 
C++\MFC\OLE\TstCon

3. Add External Tools

4. Tools Debuging 
Project Property > Configuration Properties>Debugging>Command
Browse...
"..\C++\MFC\OLE\TstCon\Release\TstCon.exe" Select



Reference

* ActiveX Test Container Application is Still Available
http://blogs.msdn.com/b/vcblog/archive/2010/03/18/activex-test-container-application-is-still-available.aspx

** Visual Studio 2010 ActiveX Debugging
http://binglongx.wordpress.com/2010/11/30/visual-studio-2010-activex-debugging/  
Posted by duki 두기

이번에 알아볼 것은 바로 CArray 클래스 입니다.

일단 32bit(4Byte) 환경이라고 미리 이야기를 하겠습니다. 그래야 포인터 개념에 대한 설명이 맞기 때문이죠.

시간이 흐르면 64bit(8Byte) 많이 쓰게 될 텐데 그때 가서 포인터 크기가 왜 저래요... 이런 소리 하시면 완전 곤란함 ㅡ_ㅡㅋ

 

CArray는 MSDN을 검색하면 다음과 같은 정보를 얻을 수 있죠.

 

template < class TYPE, class ARG_TYPE = const TYPE& > 
class CArray : 
   public CObject

 

여기서 첫 번째 매개변수는 배열에 저장된 객체의 데이터 타입, 두 번째는 배열에 저장된 객체에 접근하기 위해 사용하는 인수 타입~

그냥 저걸 통째로 받아들여서 이해할 수 있는 아름다운 머리를 가지신 분들도 있겠지만, 그렇지 못한 분들을 위해서 좀 더 쉽게 설명하면

어떤 데이터를 저장하는(첫 번째 매개변수) 배열(배열의 객체를 지시할 수 있는 두번째 매개변수)을 선언하는 것입니다.

 

MSDN 설명 중 첫 줄 설명이 아름답네요.

 "Supports arrays that are similar to C arrays, but can dynamically shrink and grow as necessary."

CArray라고는 하지만 결국 이 놈은 배열이고 필요에 의해 늘었다가 줄었다가 한다.

이런 기능을 클래스의 개념으로 접근하기 때문에 멤버 함수를 이용하면 쉽게 관리가 가능한 것이다.

 

아래의 그림을 보면 이해가 더 쉬울 겁니다.

 


 

① char 배열이다. 이건 쉬울 것 같다. "char abc[12];" 얘랑 뭐가 다를까? 같다.

    char 데이터를 가지고, 여기에 접근하는건 char에 접근하기 위한 주소 연사자인 &를 이용하여 각 값에 접근을 할 수 있다.

 

② char 포인터 배열이다. 32bit OS 사용중이라면 주소 값은 4Byte 값을 지닌다.
    즉 char 형 데이터가 들어가 있는 주소를 포인팅 하기 위해서는 4Byte가 필요한 것이다.
    실제 값은 1Byte 값을 가지지만 주소를 가리키는 포인터 개념과 헷갈리면 안되겠다.
    이런 포인터가 모여있는 배열에 대해서는 해당 포인터를 포인팅 하도록 선언해서 쓰면 되겠다.

 

③ int 배열이다. ①과 같다. 단지 4Byte를 쓴다는 차이점이 있을 뿐이다. 이렇게 설명하면 어려운가? 어려우면 참말로 난감.. ㅡ_ㅡㅋ

    참고로 MSDN은 절대로 이렇게 설명 안해준다. 머리가 좋으면 손발이 덜 고생한다던데... 그래서 내가 이 고생을....

 

 

만약 여기까지 이해가 안 간다면 밑에를 참고하기 바랍니다.

여기 오기 전에 다 이해하셨길 바라지만... 현실은 그렇게 녹녹치가 않으니깐...

 

솔찍히 MSDN의 글만 보고는 제 머리 능력으로는 전혀 이해 안 가는 부분이 더러 있습니다. ㅡ_ㅡㅋ

 

그래 C 언어에서 배열 쓴거야 뭐 어렵겠어? 그냥 데이터 타입 맞춰서 그냥 생각한 개수만큼 선언해서 쓰면 되잖아.

좋다 이거야~ 이게 필요에 의해서 늘릴 수도 줄일 수도 있다니.. 좋지 좋아~ 암 그렇구 말고.

 

하지만....

 

이건 뭐냔 말이닷 ㅡ_ㅡㅋ

왠지 이걸 접하니깐 딱 하기가 싫어지는군요. 말투부터가...

 

template < class TYPE, class ARG_TYPE = const TYPE& > 
class CArray
   public CObject

 

자.. 일단 템플릿(template) 나왔다. 그래서 그냥 이유 없이 맘에 안 든다. 딱 저 단어로 시작한다는 것 자체가 보기가 싫어진다. 공감?

하지만 포기하지 말자. 그러자고 지금 이 짓을 일삼는 거니깐~

 

그럼 템플릿이 뭔지 알아야 하잖아.....

근데 CArray가 왜 저따구로 쓰는지가 궁금한건지 당장 템플릿까지 다 알 수는 없지 않겠어?

그래서.... 템플릿 개념만 짚어 보고 살짝꿍 넘어가보자. 막상 돌아와서 보니... 길다. 쩝.

 

 

1. 템플릿 : 로직이 같은 경우에 타입을 자유롭게 변환 시켜주는 기능!

 

자... 갈수록 미궁에 빠져든다. 하지만 개념 자체는 쉽다.

예를 들어 x + y라는 함수를 만드는 것에 대해서 생각해 보자.

사람은 x 값과 y 값이 정수든 실수든 더블형이든 그런건 따질 필요 없다.

1+1은 2라는걸 알고 1.5 + 1.5는 3이라는걸 안다.

 

하지만 컴퓨터는 블로그에서 누차 이야기 한 것 같은데 바보다. 하나부터 열까지 알아 먹게끔 설명 다 해줘야 그렇게 처리를 한다.

위와 같은 연산을 수행하려면 1+1은 이게 정수의 덧셈 연산이라고 미리 선언을 해 줘야하고,

1.5+1.5는 이게 소수점을 포함하는 데이터형을 선언한 덧셈 연산을 수행해야 한다고 미리 각각 정의를 해 줘야 한다.

결국 이런 것이다.

 

int add(int a, int b) {

   return a+b;

}

 

double add(double a, double b) {

   return a+b;

}

 

char add(char a, char b) {

   return a+b;

}

 

고작 a + b 하면 되는건데 이것들이 데이터 형이 다르면 함수 호출 자체를 못할 수 있다는 것이다.

물론 말이 여기는 Integer 형과 Double형 char형이지 다른 타입도 추가될 수 있는 문제다.

그런데 그때마다 저걸 굳이 다 저렇게 일일이 이야기 해주는건 얼마나 효율적이지 못한 플레이인가.

 

이런 어벙한 짓을 일삼지 못하도록 뭔가 좀 똑똑해지게 만들 수 없을까?

intdouble 등의 데이터형만 다르지 결국 로직 자체는 다 똑같지 않은가....

 

그래서 템플릿이라는걸 쓰는 것이다.

 

템플릿은 저 위에 설명대로 덧셈을 한다는 똑같은 로직에 데이터의 타입만 다를 뿐이다.

그러니 저렇게 힘들이지 말고 쉽게 가자는 거다. 이왕이면 시간도 줄이고 노동도 줄이고 좋으니까 말이다.

 

그래서 이런걸 가능하게끔 하는걸 템플릿. 즉, 본 뜨는 공구, 형판... 뭐 쉽게 표현하면 초딩때 쓰던 모양자의 역할을 한다.

모양자 얼마나 편한가? 사각형 모양자 하나 있으면 정해진 여러가지의 사각형 모양을 다 그릴 수 있다.

삼각형 그리려면 삼각형 모양자 하나면 또 다양한 삼각형을 만들 수 있다.

 

로직은 4개의 변으로 구성되는 면이냐 3개의 변을 가지는 면이냐는 것이다.

그게 안에 어떤 색을 칠할지는(자료형) 그때 상황 봐서 쓰면 되는 것이다.

단, 여기서 상황 판단은 바보 CPU가 아니라 바로 컴파일러가 하는 것이다.

프로그램 소스를 해석하는 과정에서 컴파일러는 이걸 가능하도록 변수에 맞추어 함수를 만들어 준다.

 

 

2. Templete 사용방법

 

그럼 저 위에껄 어떻게 쓸 수 있을까? 일단 방법 정도는 익혀주는게 저걸 만든 사람에 대한 예의가 아닐까?

 

template <typename T>

T add(T a, T b) {

   return a + b;

}

 

여기서 위 함수들과 차이점이라고 한다면, 리턴 자료형과 인수의 자료형이 서로 정의가 안되어 있고 템플릿 T로 선언되었다는 점이다.

즉, 아직 정해진게 없다는 이야기다. 컴파일러가 보고 필요한 데이터형에 맞는 템플릿 함수를 생성하여 사용하되,

중복적으로 같은 데이터형을 이용하는 경우 미리 생성한 템플릿 함수를 사용하도록 한다.

 

T를 int로 쓸지 double로 쓸지 char로 쓸지에 대해서 컴파일러가 그때 상황봐서 만들어서 써라~

이렇게 생각하면 된다. 단지 저렇게 한 줄 더 추가하면 매개변수 데이터형이 달라져도 바로 사용을 할 수 있게 된다.

 

앗 여기서~

특별한 케이스~

즉 특별한 데이터 형에 대해서는 특별하게 처리해줄 필요가 있을 때에도 템플릿을 쓸 수 있다.

그래서 아래와 같이 특별한 데이터형이 들오어는 케이스, 즉 문제의 발단인 원래 CArray에 대해서 다시 생각해 보자.

 

 

3. 그래서 결국 template < class TYPE, class ARG_TYPE = const TYPE& >이 도대체 뭐냐고 ㅡ_ㅡ;

 

template < class TYPE, class ARG_TYPE = const TYPE& > 
class CArray
   public CObject

 

첫번째 class TYPE은 배열에서 저장되는 객체의 타입 형태를 넣어 주고,

두번째 class ARG_TYPE = const TYPE&는 집어 넣을때 배열의 데이터에 접근하기 위한 데이터 형에 대한 주소연산자입니다.

따라서 배열을 쓰기는 하는데 위와 같은 형태로 선언된 배열을 쓰겠다는 거죠.

그래서 제일 처음 이야기 했던 그림이 나오는 거죠.

 

템플릿에 대해서는 좀 더 많이 다뤄야 하는 부분이고, 저도 사실 아는 바가 이것밖에 없으며,

템플릿 하나 만으로도 성경 같은 책이 나올 수 있는 분야이기 때문에 더 자세한건 참고서적 또는

인터넷 검색을 활용해 보시는게 더 좋을 듯 싶습니다.

 

 

4. 정리

 

CArray도 결국 배열입니다. 근데 사용하기 편리한 배열입니다. 줄이고 늘리고 하는걸 쉽게 할 수 있도록 돕는 클래스죠.

그래서 어떤 데이터를 넣고 어떻게 접근한지에 대해서 선언해서 쓰면 됩니다.

 

※ 참고로 포인터 배열은 CPtrArray 클래스를 사용하면 됩니다.

차이점은 단순히 포인터 객체를 선언한 다음에 포인터 추가시 저장하고자 하는 포인터 타입에 대한 타입캐스팅을 해서 넣으면 됩니다.

그려서 설명하고 싶지만 귀차니즘이 마구 밀려오네요. 위 그림 2번 참고하시면 될 듯 합니다.

포인터에 대한 캐스팅 타입이 다른 것도 들어간다는 점이죠.

Posted by duki 두기

어디서 복사해온 예제 소스는
Visual Studio 상에 붙여 넣기를 하게되면 정렬이 제대로 되어 있지 않는 것을 확인할 수 있습니다.

저도 자주 깜빡하는 단축키라 공유합니다.


Alt+F8

Posted by duki 두기

  Setup 프로그램을 제작하기 위해서 가장 많이 사용하는 Tool이 InstallShield이다. InstallShield는 Visual Studio Enterprise Edition 6.0에서 기본적으로 제공하는 Version이 있고 판매용 버전이 있다. Visual Studio에서 제공하는 버전에 약간의 기능 제한이 있는 것을 제외하면 사용법이 같으므로 Visual Studio 제공버젼으로 설명한다.

  프로그램을 배포할 때 대부분 Debug 정보들이 들어 있지 않는 Release 버전(프로그램 크기가 훨씬 작음)으로 컴파일하여 배포한다. 또한 프로그램이 1개의 실행 파일로 되어 있을 경우에는 컴파일 옵션에서 'Use MFC in a Static Library'를 선택하여 컴파일하고 그 실행 파일만 Setup 프로그램으로 만들면 되나(이 경우 그냥 실행 파일을 그냥 복사해서 쓰는 것이 더 낳을 것이다), 실행 파일이 여러개로 구성된 경우에는 각 실행 파일들을 모두 컴파일 옵션에서 'Use MFC in a Shared DLL'을 선택하여(기본값) 컴파일하고 그 실행 파일 및 필요한 MFC Dll을 포함하여 Setup 프로그램을 만들어 배포한다. MFC Dll을 포함하지 않고 배포하면 Visual Studio가 설치되지 않은 PC에서는 프로그램이 실행되지 않는다.

참고)필요한 MFC DLL

    기본적으로 들어가야 하는 DLL : MFC42.DLL, Msvcrt.dll

    콘솔 프로그램 중 MFC를 지원하는 프로그램으로 제작했을 경우 필요한 DLL : MSVCP60.DLL

    지금까지 프로그램하면서 배포시 필요한 DLL은 위의 3가지였다. 필요한 DLL이 없을 경우 에러 대화 상자에 DLL이름이 나오므로 Visual Studio가 설치되지 않은 컴퓨터에서 실행을 해본 후 Setup 프로그램을 제작하기 바란다. 3가지 DLL은 Visual Studio가 설치된 컴퓨터의 windows system 디젝토리에서 찾으면 되나 여기에서 Link시켜 두겠다.

    참고로 그럴 경우는 거의 없겠지만 Debug 버전을 배포할 경우 필요한 Dll은 Mfc42d.dll, Mfcd42d.dll, Mfcn42d.dll, Mfco42d.dll, Msvcrtd.dll, Msvcp60d.dll 등이 있다.

 

InstallShield 설치

앞에서도 말했듯이 InstallShield는 Visual Studio에 들어 있다. Visual Studio를 설치할 때 마지막 단계에서 재 부팅을 한다. 재 부팅을 한 후 자동으로 생성되는 대화 상자에서 InstallShield 버튼을 선택하여 설치하거나 Visual Studio CD의 첫 번째장 ISHIELD 디렉토리의 Setup.exe를 실행하면 설치가 된다.

 

InstallShield 사용법

InstallShield를 실행하여 나타난 화면에서 Project Wizard를 선택하거나 File메뉴의 부메뉴 New를 선택하여 생성된 대화 상자에서 Project Wizard를 선택하고 확인을 하면 다음과 같은 대화 상자가 생성된다.

    Application : 프로그램 이름을 입력한다

    Company Name : 회사 이름을 입력한다.

    Application : 적당한 Application 종류를 선택한다.

    Application Version : 프로그램 Version을 입력한다.

 

다음을 선택하면 다음과 같이 대화 상자가 바뀐다.

    이 대화 상자는 InstallShield에서 Setup 프로그램을 작성해서 설치할 때 나타나는 대화 상자의 종류를 설정합니다. 읽어 보면 대강 알 것이고 모르겠으면 다음을 누르면 된다.

 

설정을 한 후 다음을 선택하면 다음과 같이 대화 상자가 바뀐다.

    이 대화 상자는 프로그램이 지원하는 OS을 선택하는 부분이다. 원래 기능은 선택하지 않은 OS에서는 설치가 되지 않을 것 같은데 잘 안되고 그냥 표시만 하는 것 같다.

 

설정을 한 후 다음을 선택하면 다음과 같이 대화 상자가 바뀐다.

    지원 언어를 선택하는 부분이다. English로 설정해도 한글을 지원하므로 그대로 다음을 선택하면 된다.

 

설정을 한 후 다음을 선택하면 다음과 같이 대화 상자가 바뀐다.

    Setup Type을 설정하는 부분이다. 선택한 Type에 따라 다른 파일이 Setup되게 구성할 수 있다.

 

설정을 한 후 다음을 선택하면 다음과 같이 대화 상자가 바뀐다.

    Component 명칭 및 갯수를 설정하는 부분이다. Component는 InstallShield에서 파일 관리를 편하게 하기 위해서 파일들을 Group으로 설정하고 그 그룹들을 다시 Component로 설정하고 Component별로 파일을 다루도록 되어있다. 즉 Component는 File Group의 Group이다. Visual Studio에서 제공하는 InstallShield는 이 Component 갯수가 5개 이하로 제한되어 있다.

 

설정을 한 후 다음을 선택하면 다음과 같이 대화 상자가 바뀐다.

    File Group명칭 및 갯수를 설정하는 부분이다.

 

설정을 한 후 다음을 선택하면 다음과 같이 대화 상자가 바뀐다.

    지금까지 설정한 내용을 화면에 표시하는 대화 상자이다.

 

마침을 선택하면 Step #1의 Application부분에 설정한 프로그램 이름 대로 Setup 프로젝트가 생성되고 InstallShield 화면은 다음과 같이 된다.

 

지금까지 설정한 내용이 Setup.rul에 스크립트로 저장되어 있다. 스크립트는 대강 읽어 보면 어떤 내용이구나 하고 알 수 있을 것이나 몰라도 된다. 남은 작업을 정리해 보면 다음과 같다.

1. File들을 그룹별로 File Group에 설정한다.

2. 그룹들을 기능 별로 Component에 설정하고 설치될 디렉토리등을 설정한다. 설치될 디렉토리는 Component별로 설정하게 되어있다.

3. Setup Type에 따라 설치될 Component를 설정한다.

4. 시작 메뉴 및 바탕 화면에 추가될 Icon을 설정한다(옵션).

5. 레지스트리 등록이 필요한 경우 등록해 준다(설명하지 않음).

6. 컴파일을 수행한다.

7. Setup 파일을 생성한다.

 

  먼저 File Groups Tab Icon()을 선택한 후 각 File Group의 하위 Tree Links를 선택하면 화면이 다음과 같이 변한다.

    Insert 메뉴의 부메뉴 Links into File Groups을 선택하여 나타난 파일 선택 대화 상자에서 파일들을 선택하면 파일들이 추가된다. 또한 탐색기를 띄워 파일들을 선택한 후 InstallShield로 Drag&Drop하면 파일들이 추가된다. 디렉토리 전체를 추가할 경우 이 두 번째 기능을 사용하는 것이 가장 쉽다.

 

  Components Tab Icon()을 선택하면 화면이 다음과 같이 변한다.

    Destination을 더블 클릭하면 Component에 들어 있는 파일들이 복사될 위치를 설정할 수 있으나 그대로 사용하는 것이 좋다. HDD의 용량이 작을 때 윈도우의 정책은 HDD를 절약 위하여 여러 프로그램에서 사용하는 dll파일은 windows system 디렉토리에 넣어 공용으로 사용하도록 권장했으나 현재는 버전 충돌 등 여러 가지 때문에 이방식을 권장하지 않는 것으로 알고 있다.

    Include File Groups을 더블클릭 하면 다음과 같은 대화 상자가 생성된다.

    Add를 선택하여 나타난 File Group 선택 대화 상자에서 File Group을 추가한다. 여러번 Add를 실행하여 여러개의 File Group을 한 Component에 설정할 수 있다.

     

  Setup Types Tab Icon()을 선택하면 화면이 다음과 같이 변한다.

    각 Setup Type마다 설치할 Component를 설정한다.

 

    Programs(시작 메뉴에 등록) 또는 Desktop(바탕화면에 등록)를 선택하고 마우스 오른쪽 버튼을 눌러 생기는 팝업 메뉴에서 New의 부메뉴 Folder을 선택하면 폴더가 생성되어 이름을 수정하도록 한다. 다시 그 폴더에 파일 Icon을 넣으려면 팝업 메뉴 New의 부메뉴 ShortCut을 선택하면 파일 Icon이 성성되어 이름을 수정하도록한다. 다음 그림은 Programs에서 폴더 Test를 추가하고 다시 그 폴더에서 TestIcon을 추가한 후의 모양이다.

    Target을 마우스로 더블클릭하면 다음과 같은 대화 상자가 생성된다.

    Target에  <TARGETDIR>\실행파일명.exe 라고 입력한후 확인을 선택한다.

    이런 방식으로 추가하고자 하는 모든 파일 Icon을 설정할 수 있다.

 

Build 메뉴의 부메뉴 Build(Ctrl+F7)를 선택하면 컴파일이 수행된다.

 

Build 메뉴의 부메뉴 Media Build Wizard를 선택하여 생성된 대화 상자에서 순차적으로 철차를 따라가면 Setup 파일을 생성할 수 있다.

 

Setup파일은 C:\My Installations\프로젝트명\Media\Default\DiskImages\Disk1 디렉토리에 생성된다.

 

참고로 C:\My Installations\프로젝트명\Setup Files\Uncompressed Files\Language Independent\OS Independent\Setup.bmp를 그래픽 편집기에서 수정하여 Setup파일 작성을 새로하면 초기 로고 화면이 바뀐다.

     

출처:http://ttongfly.net/document/Programming/Windows_Programming/VisualC++(MFC)%B0%AD%C1%C2/VisualC/Setup.htm
Posted by duki 두기
이전버튼 1 이전버튼

블로그 이미지
개인적인 잡다한 기록 공간입니다
duki 두기

공지사항

Yesterday
Today
Total

달력

 « |  » 2024.4
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함