[출처] Windows-Apache-Tomcat-Axis-JDK를 이용한 WebService 플랫폼 구축하기|작성자 희열


1. 일단 관련 소프트웨어부터 설치를 해야한다. 설치해야할 소프트웨어는

         * jdk 최신 버전 -> www.sun.com/java 에서 download 메뉴를 들어가면 받을 수 있다.


         * apache tomcat 최신 버전 -> 현재 5.5가 최신 버전이다. tomcat.apache.org에서

               받을 수 있다.


         * apache axis 최신 버전 -> Tomcat 서버에서 실행되는 java 프로그램으로 apache를

            이용하여 web service를 제공하는 패키지 이다. ws.apache.org/axis/에서 받을 수

            있다.


         * apache ant 최신 버전 -> make와 유사한 빌드 툴이다. 있으면 편리하다.

            ant.apache.org에서 다운로드 받을 수 있다.



   1.1 Apache Tomcat은 JDK에 포함된 Java Runtime Environment(JRE)를 필요로 한다. 따라서

        먼저 JDK를 설치한다. 여기에서는 J2SE 1.5 update 7 with NetBeans를 설치하였다. 파일

        용량은 153MB이고, 설치에 필요한 하드 디스크 용량은 473MB이다. (평균 80KB/s 속도로

        다운로드 받는데 30분정도 걸렸다.)


                 jdk install directory = c:/program files/java/jdk1.5.0_07/

                 netbeans directory = c:/program files/NetBeans/


        설치가 끝나면, 내 컴퓨터 ->속성 -> 고급 -> 환경 변수에 다음의 항목을 추가한다.

                 JAVA_HOME=C:\Program Files\Java\jdk1.5.0_07

                 PATH += C:\Program Files\Java\jdk1.5.0_07\bin

                 CLASSPATH += C:\Program Files\Java\jdk1.5.0_07\lib\tools.jar


    1.2 Apache Tomcat 5.5 설치는 비교적 간단하다.


          * 먼저, Apache 사이트에서 윈도우즈용 Apache Tomcat 5.5 Binary를 다운로드 받은 후

             실행한다.


          * 설치 마법사가 수행되면, 몇 가지 선택을 요청하는데, 첫번째 설치 목록 선택에서는

             Full Option을 선택한다. 이렇게 하면 Documentation과 각종 Example이 설치되므로,

             이후 참조하기에 편리하다. 두번째로, 설치된 JRE(Java Runtime Environment)의

             디렉토리 위치를 물어오는데, jdk 1.5.0_07을 미리 설치했다면 jre 1.5.0_07이 설치된

             디렉토리가 기본 설정으로 표시된다. 이것을 그냥 선택하면 된다.

             (나의 경우 : c:/program files/java/jre 1.5.0_07/ 디렉토리를 사용하였다)


           * 그리고, Apache Tomcat의 port 번호와 관리자 ID/PASSWORD를 입력하라는 창이

              나타난다. 여기서는 포트 번호를 8080으로 설정하였다. 나머지 ID/passsword는

              알아서 설정한다.


           * 설치가 끝나면 Apache Tomcat을 수행할 지를 물어온다. 이 때 실행을 선택한다. 그리고,

              Web Browser에서 http://localhost:8080을 입력하여 Apaceh Tomcat 화면이 나오는지

              확인한다. 화면이 뜨면 제대로 설치가 된 것이다.


           * 다음의 환경 변수를 시스템에 추가한다.

                 CATALINA_HOME = C:\Program Files\Apache Software Foundation\Tomcat 5.5

                 CLASSPATH += C:\Program Files\Apache Software Foundation\Tomcat 5.5

                                              \common\lib\servlet-api.jar



  1.3. AXIS 설치하기 (설치 마법사를 사용하지 않고, 그냥 압축을 풀어서 복사한다).


         ws.apache.org/axis에서 AXIS 최신 버전을 다운로드 받는다. 여기서는 Windows 버전을

         사용하였다. AXIS는 zip으로 압축되어 있는데, 압축을 원하는 디렉토리에 푼다.

          ( C:\Program Files\Apache Software Foundation\axis-1.4\ )


         AXIS를 사용하기 위해 다음과 같이 PATH를 설정한다.

         AXIS_HOME = C:\Program Files\Apache Software Foundation\axis-1.4

         AXIS_LIB = %AXIS_HOME%\lib

         AXISCLASSPATH =%AXIS_LIB%\axis.jar;

                                  +=%AXIS_LIB%\commons-discovery-0.2.jar;

                                  +=%AXIS_LIB%\commons-logging-1.0.4.jar;

                                  +=%AXIS_LIB%\jaxrpc.jar;

                                  +=%AXIS_LIB%\saaj.jar;

                                  +=%AXIS_LIB%\log4j-1.2.8.jar;

                                   +=%AXIS_LIB%\wsdl4j.jar

                                  +=%AXIS_LIB%\xml-apis.jar;

                                  +=%AXIS_LIB%\xercesImpl.jar;

         CLASSPATH +=%AXISCLASSPATH%


         위의 AXISCLASSPATH에서 마지막 2개의 jar 파일(xml-apis.jar와 xercesImpl.jar)

         는 기본 axis 배포에 포함되어 있지 않다. 이 두 파일은 xerces.apache.org에서

         다운로드 받을 있다. Mirror에서 xerces-J-bin.2.8.0.zip을 다운로드하여 압축을

         풀면 이 두 파일을 얻을 수 있다. 해당 파일을 %AXIS_LIB% 디렉토리에 복사한다.


   1.4 AXIS와 Tomcat을 연동하기

         AXIS의 압축을 풀어놓은 디렉토리 하위에 webapps\axis가 있는데, 이것을 Tomcat

         의 webapps 디렉토리로 복사한다. 즉, %AXIS_HOME%\webapps\axis를

         %CATALINA_HOME%\webapps\로 복사한다.


         그 다음, 웹을 통해 Axis의 동작을 확인한다. 동작 확인은 웹 브라우저에서

         http://localhost:8080/axis 주소를 입력하여 AXIS 화면이 제대로 뜨는지 보면 된다.


         화면이 제대로 뜨면 "validation" 링크를 클릭한다. 그러면 happyaxis.jsp가 수행되는

         데, 이 JSP는 axis가 필요로 하는 모듈(주로 jar 파일)들을 검사하여 필요한 jar 파일

         이 없으면 경고나 에러 메시지를 출력한다. 내가 Axis를 설치하고, happyaxis를 실행

         했을 때에는 activation.jar 파일과 mail.jar(java mail), xmlsec.jar 모듈이 설치되어

         있지 않다고 메시지가 나왔다.

        

         happyaxis.jsp 출력에서 해당 jar 파일들을 어디에서 다운받는지 알 수 있으므로,

         사이트에 접속하여 파일들을 다운로드 한다. 받은 jar 파일들을 java runtime

         environment(JRE)\lib\ext 에 복사하면 문제가 해결된다.

         (복사한 후 happyaxis.jsp를 실행해도 여전히 해당 jar 파일들이 없다고 나온다.

          JRE 이전 버전들을 모두 제거하고, 컴퓨터를 재부팅하고 나서 살펴보니,

          activation.jar와 mail.jar는 인식이 되는데, xmlsec.jar는 인식이 안된다.

          다른 모듈과의 dependency 문제 때문에 발생하는 것 같은데, 원인은 아직 잘

          모르겠다. --> 누가 아는 사람들은 덧글을 달아주시면 감사하겠습니다. )

Posted by 나비:D
:

#include <iostream>
#include <list>
#include <vector>
#include <string>
#include <conio.h>

using namespace std;

typedef struct _list
{
 int    idx;
 string name;
 string telnum;
} List;


void Insert( vector<list<List> > & rhs )
{
 List tmp;
 int tn;

 cout << "고객번호 입력" << endl;
 cin >> tn;
 if(cin.fail())
 {
  cout << "잘못된 입력";
  cout << "차트0번에 입력 됩니다." << endl;
  cin.clear();
  while(!isspace(cin.get()))
   continue;
 }
 
 tmp.idx = tn%10;
 cout << "이름 입력" << endl;
 cin >> tmp.name;
 cout << "전화번호 입력" << endl;
 cin >> tmp.telnum;
 
 rhs[tmp.idx].push_back(tmp);
 cout << "press any key to continue" ;
 getche();
 system("cls");
}

void Print( vector<list<List> > tmp )
{
 for(int i=0; i<10; i++)
 {
  cout << "[" << i << "]번차트" << endl;
  list<List>::iterator ptr = tmp[i].begin();
  while( ptr != tmp[i].end() ) {
   cout << ptr->name << "\t\t";
   cout << ptr->telnum << endl;
   ptr++;
  } 
 }
 cout << "press any key to continue" ;
 getche();
 system("cls");
}

list<List>::iterator Serch( vector<list<List> > tmp )
{
 string s_vel;
 cout << "찾으실 이름을 입력하세요" << endl;
 cin >> s_vel;
 
 for(int i=0; i<10; i++)
 {
  list<List>::iterator ptr = tmp[i].begin();
  while( ptr != tmp[i].end() ) {
   if( ptr->name == s_vel ){
    cout << ptr->name << endl;
    cout << ptr->telnum << endl;
    return ptr;
   }
   ptr++;
  }
 }
 return 0;
}

void Delete( vector<list<List> > tmp )
{
 string s_vel;
 cout << "찾으실 이름을 입력하세요" << endl;
 cin >> s_vel;
 
 for(int i=0; i<10; i++)
 {
  list<List>::iterator ptr = tmp[i].begin();
  while( ptr != tmp[i].end() ) {
   if( ptr->name == s_vel ){
   
   }
   ptr++;
  }
 }
}

void main()
{
 vector<list<List> >  tmp(10);
 char ch;
 
 while (1) {
  cout << "1. 입 력" << endl;
  cout << "2. 출 력" << endl;
  cout << "3. 검 색" << endl;
  cout << "4. 삭 제" << endl;
  cout << "5. 종 료" << endl;
  cout << "메뉴선택[ ]\b\b"; cin >> ch;
  system("cls");
  switch(ch) {
  case '1': Insert( tmp ); break;
  case '2': Print( tmp );  break;
  case '3': Serch( tmp );  break;
  case '4': Delete( tmp ); break;
  case '5': exit(0);
  default : cout << "다시 입력하세요" << endl;
  }
 }
}

Posted by 나비:D
:

C++/C :: 강좌

2008. 5. 14. 10:05

출처 : 네이버 :: 지식iN




C++을 배우신다면 C는 배우셨는지 모르겠네요.


일정이 바쁘신게 아니라면 씨부터 배우는 것을 추천합니다.


물론 C++부터 배운다고 나쁜거는 아니지만 C부터 배우면


정말 기본 부터 배울수가 있습니다.


일단 C 강좌는


http://www.chanywa.com/pl/ 자료 만땅!

http://goldkorea.x-y.net/frame.htm 강좌.있는곳.

http://cprogramming.ce.ro/ 강좌있는곳..가끔 18x같은배너떠서 짜증남.

http://ns2.dongju-c.ac.kr/~syhong/teaching/c/c13.htm# 책처럼 자세한 강좌

http://loveisstar.hihome.com/홈페이지/공부방/c.htm 포인터 강좌, 캠퍼스 C강좌, 정복 터버C강좌 있음.. 여기가 강좌로만 치면 제일많음..

http://romeo.hufs.ac.kr/~dondek/ 상돈형님의 사이트 포인터 부분..

http://www.terms.co.kr/ 용어사전 텀즈..강추

http://www.winapi.co.kr/ pdf자료 만땅. 강좌도 쓸만함.

http://spnode10.knou.ac.kr/computer/html/08.htm 걍 함번 가보면 좋음.
음성이 나옴-_______-;


이렇게 있습니다.


완전 초보시라면 크레듀(http://www.credu.com) 와 같은 교육 싸이트의 동영상 강의도


좋습니다. 초보에 맞게 진행되고 씨와 씨뿔뿔 어려 과목이 있습니다.


C++ 싸이트로는 아래의 링크를 이용해 주세요


윈도우즈 API(Win32 API) 전문 사이트 : http://winapi.co.kr/


프로그래머를 위한 C++ : http://higasijoe.nasse.net/Main/index2.htm


C언어 길라잡이 : http://www.c-language.wo.to/


ProGramma : http://www.hanpoi.wo.to/


C++언어 강좌(기초) : http://cplus.ubedu.com/


C++ 온라인 동영상 강좌(무료) : http://cla.ib96.com/study/index.php


C 구조대 : http://www.sosc.nuri.cc/


지키미 : http://www.zikimi.co.kr/


워킹 C : http://workingc.com/


골드코리아 : http://goldkorea.x-y.net/html/frame.htm


민호의 프로그램 공부방 : http://oa.colorn.com/


지니야닷넷 : http://www.jiniya.net/bbs/portal.php


Standard C++ Library : http://oopsla.snu.ac.kr/~sjjung/stl/


생각하는 C++ : http://tc.pukyung.co.kr/index.htm


김중태의 C언어 이야기 : http://www.dal.co.kr/chair/c/c.html


데브피아 : http://www.devpia.com/


C 언어 길라잡이 : http://www.web-reader.co.kr/c-vb/c-edu.htm


C : http://hanuri.jnu.ac.kr/lecture/language/clang/


C 강좌 : http://www.mydosu.com/LEC/cpp/main_cpp.asp


http://fhl.com.ne.kr/school/C/cm.html

1주차 강의 C 의 기초지식,소개
2주차 강의 C 의 기본 문법
3주차 강의 기본적인 입출력 함수
4주차 강의 제어구조
5주차 강의 배열
6주차 강의 포인트
7주차 강의 포인트 배열
18주차 강의 8주는 시험
9주차 강의 함수의 이해
10주차 강의 데이터형과 기억 클레스
11주차 강의 구조체와 공용체
12주차 강의 프리프로세서
13주차 강의 표준 라이브러리 함수
14주차 강의 파일처리


동주대학 전산과 C : http://www.dongju-c.ac.kr/~syhong/teaching/c/


----------------------------------------------------------------------------------

C C++ 무료 개발툴 다운로드

----------------------------------------------------------------------------------


MS Visual C++ Toolkit 2003 : http://msdn.microsoft.com/visualc/vctoolkit2003/


볼랜드 BC++ 컴파일러 : http://www.borland.com/products/downloads/download_cbuilder.html


아래의 Compiler 라고 써있는 링크를 클릭하면 다운로드 받을 수 있음.

Compiler Windows 5.5 08/24/2000 8.7 Mb

 







Posted by 나비:D
:

난 게임을 만들고 싶은 사람이다.


예전부터 컴퓨터 게임을 할 때마다 '내가 이런 게임을 만들어 보면 어떨까' 하고 생각했었다.


나름대로 수많은 pc게임을 접해오면서 느낀건


"버그 없이, 빠르게 잘 돌아가야 한다" 는 것이었다.


게임은 아무리 잘만들어도 느리면 소용없다. 하고 싶은 맘이 싹 달아달게 분명하다.


이런 이야기를 하는 이유는 오늘 이야기 할 것이 바로


"참조자로 매개변수에 객체 전달" 이기 때문이다.


이런 말들은 정말 많이 들어보셨으리라 믿는다.


Call by reference

Call by value


설명하자면...

하나는 값으로 전달하는 방법이고, 하나는 참조로 전달하는 방법이다.


값으로 전달하는 놈은 복사를 행하고,

참조로 전달하는 놈은 단순히 원래 객체에 이름표만 붙인다는 점이 다른것이다.


아직 무슨말인지 모르시겠다면 다음을 보면서 이야기 하겠다.



위에서 CData형 클래스는 멤버변수로 int형 배열을 가지고 있다.

그리고 생성과 동시에 복사가 일어났을 경우에 콘솔창에서 직접 확인하기 위해

복사생성자를 재정의 해주었다

이 클래스로 객체를 생성했을 경우 그 객체의 사이즈는 4byte(int) * 10 = 40byte인 것이다.


자 이제 이 클래스형을 매개변수로 받는 함수 FuncA를 작성해보자.


지금 현재 이 함수 FuncA에서는 그다지 하는 일이 없지만,

우리는 이 함수가 1프레임에 100번이상 호출되는 중요한 함수라고 가정하자.



메인에서 이런식으로 FuncA 함수를 사용하였다. 콘솔창에 출력되는 결과값은 어떻게 될까.

한번 예상해보고 아래쪽을 보시기 바란다.



생성과 동시에 복사가 이루어질 경우만 호출되는 복사생성자가 함수 한번 실행에

무려 3번!이나 호출되었다.


한번은 당연히 CData형 객체 temp가 생성됨과 동시에 같은 타입의 _data를 복사하기 때문에

복사생성자가 호출되었다.


그렇다면 나머지 두번은 어디에서 호출되는것일까.


답은

하나는 매개변수에서 호출되고

다른 하나는 리턴할 때 호출된다는 것이다.


위와같은 코드가 있을 경우 컴파일러는 이런 코드를 생성해낸다.


(FuncA함수의)  CData _data((main함수의)oData); -> 매개변수에서의 코드

...

CData abcd(_data) 을 main함수내에 생성 -> 리턴에서의 코드

(여기서 abcd는 임의의 변수 이름)


이렇듯 FuncA 함수내의 temp객체가 생성되는 과정 이외에도 2번의 복사가 더 일어나는 것이다.


자 그럼 이것이 뭐 어쨌다는 것인가.


생각해보자. 40byte짜리 객체를 3번 복사하는건 120byte정도의 복사비용이 든다.

뭐 이정도도 컴퓨터가 워낙빠르기 때문에 감당할 수 있다고 하자.

그런데 우리가 이 함수를 사용하려는 게임에서는 프레임당 이 함수를 100번이상 호출한다고 해보자.

그러면 상황은 달라진다. 1프레임당 12,000byte의 복사가 계속해서 이루어지는 것이다.

그렇게 되면 게임은 우리가 의도한것과는 다르게 느려지게 되는 것이다.


그럼 우짜란 말인가.


아 일단 이 글을 읽으시는 분이 참조자나 포인터에 대해서

어느정도 잘 알고 계신다고 믿고 설명하는것이다.


이제 값에 의한 전달이 아닌 참조에 의한 전달을 해야 할 순간이 온 것이다.


자 이제 복사가 일어나려는 부분을 수정해보자.


일단 매개변수에서의 복사를 없애야 할 것이다.



이제 위의 값에 의한 전달에서 행하여 지는 일과 비교를 해보자.


(FuncA함수의)  CData& _data = (main함수의)oData; -> 매개변수에서의 코드


CData의 참조자 _data를 만들어 줌과 동시에 oData를 참조하고 있다.

참조자는 생성과 동시에 반드시 초기화 되어야 하는데,

매개변수는 생성과 동시에 모든일을 진행하므로 참조자로 넘겨주는 것이 가능하다는 이야기다.


그렇다면 이제 다시한번 결과를 보자



이제 40byte의 복사 비용 하나를 줄였다.


그리고 리턴에도 참조자를 적용해보자.


결과는 또 아래와 같다.


오오...이제 80byte의 복사비용을 절감한 것이다.

복사를 하지 않고 참조자를 이용해서 이름표를 붙여줌으로써 정말 확실한 효과를 봤다.


그러나 한가지 걱정되는건, 매개변수로 넘겨온 값을 사용은 하되, 그 참조되는 실제 객체의

값 자체는 바꾸고 싶지 않을 때다. 그것도 문제가 될 것이 없다. 넘겨오는 매개변수의 참조자를

상수화시키면 된다.



이제는 함수내에서 그 넘겨온 참조자 객체의 값을 모르고 변경할 위험에서도 벗어나게 되었다.

하지만 이코드는 오류를 하나 뿜어낼 것이다.

왜냐하면 매개변수에서 상수화를 시켜서 값 변경이 불가능하게 했는데

리턴할때는 값이 변경 가능한 참조자로 바꾸려고 해서다.

그래서 리턴값도 상수화가 필요하니 리턴 타입 앞에 const를 붙이면 땡이다.


이렇게 매개변수에서의 참조자는 간단하지만 정말 초강력한 기능을 발휘한다는 점이 참 멋지다.


리턴에서는 또 리턴 값 최적화라는 컴파일러에서 많이 지원되고 있으므로 그 부분이 궁금한

사람들은 또 전문서적이나 인터넷을 뒤져서 읽어보는것도 많이 도움이 될 듯하다.


그럼 모두모두 즐코딩!


작성자 : kaltznnnyyy

Posted by 나비:D
:
출처 : http://kwon37xi.egloos.com/2521260
Subversion svn+ssh PuTTY Subclipse/TortoiseSVN 설정
Subversion svn+ssh 방식으로 설정해서 PuTTY/Subclipse/TortoiseSVN으로 접속하기

Subversion을 써볼까 하여 테스트 중이다.
Subversion은 CVS에 비해서 장점이 많다.
1. 파일명 변경이 히스토리에 남는다.(CVS는 기존 파일을 삭제한 것으로 간주해버린다)
1. 원자적 커밋(모든 파일이 커밋되면 되는거고 아니면 모두 롤백)
1. 커밋 단위별 버저닝.(CVS는 각 파일별로 버전을 메기지만 SVN은 커밋단위로 버전을 메기기 때문에, 직전 커밋상태로 모든 파일을 되돌리는 것이 가능하다)
뭐 대충 이런 장점들이 있다.

하지만 Subversion을 지금 바로 우리 회사 프로젝트에 도입하는 것은 흠.. 아직 CVS를 갈아 엎고 도입하기에는 무리 같다. Subversion 자체가 문제가 아니라 현재의 Eclipse용 Subversion Client인 Subclipse(1.0.3) 때문이다.
CVS Client에서 안보이던 버그들 때문에 다른 개발자들이(나부터도) 짜증 날 듯 하다.
기존에 CVS가 없었고, 처음으로 버전 관리 시스템을 도입하려 한다면, 도입해도 무관할 듯하다. 버그가 있다고 해도 (이미 CVS클라이언트에 익숙하지 않다면)그렇게 짜증날 정도는 아닌 것 같다.

참조

 * http://tortoisesvn.sourceforge.net/?q=book/print/5&PHPSESSID=856b2d1ca0e8ec705ff96309ac6ffcff
 * http://subclipse.tigris.org/servlets/ReadMsg?list=users&msgNo=3334
 * KLDP Wiki Subversion

서버측 설정

서버는 Linux, Unix, Cygwin 을 사용하고, SSH를 통해 보안이 강화된 접속을 사용한다.

지난번에 CVS는 pserver로 보안이 안되는 접속방식을 사용했는데, Subversion은 SSH를 사용하는 이유는, 첫째는 SSH를 사용하는 것이 안쓰는 것보다는 여러모로 좋다는 사실엔 이견의 여지가 없으며, Subversion은 SSH를 사용하지 않고 svnserver를 직접 사용할 경우 각 사용자와 사용자의 비밀번호를 지정할 때 전혀 CVS와 같은 방식의 비밀번호 암호화 조차도 하지 않기 때문에 좋지 아니하다~

Subversion 패키지와 openssh 패키지를 설치해 두면 되며, 대부분의 배포판이 패키지를 제공하므로 설치상의 어려움이 전혀 없다.

* 키 생성하기
각 사용자 별로 Linux/Unix에 계정을 만들고 자신만의 키를 생성해야 한다. 즉, 아래 작업은 각 사용자별로 다 해야하는 것이다.

$ ssh-keygen -b 1024 -N mypassword -f kwon37xiKey
mypassword는 Passphrase라고 부르며 비밀번호 같은 것으로 자신만 알도록 임의로 만든다.

kwon37xiKey(개인키), kwon37xiKey.pub(공개키) 파일 생성된다.

공개키를 자기 Unix/Linux 계정에 등록한다.
$ mkdir ~/.ssh
$ cp kwon37xiKey.pub ~/.ssh/authorized_keys

그리고 kwon37xiKey(개인키) 파일을 자신의 컴퓨터(Eclipse 등을 실행하는)로 다운 받는다.

* 리포지토리 생성
$ cd
$ svnadmin create repos --fs-type fsfs

결과 /home/username/repos 리포지토리가 생성되었다.
리포지토리의 경우 해당 리포지토리를 여러 사용자가 공유하기 위해서는 Group을 만들고 그 Group에 대해 rwx 권한을 줘야 한다.
그리고, 그 리포지토리를 사용할 사용자들은 모두 해당 Group에 속해야 한다.

클라이언트 측 설정

* Subclipse 설치
Eclipse에서 Subclipse를 사용한다.
Subclipse 설치문서를 참조하여 설치한다.

* TortoiseSVN을 다운로드한다.
TortoiseSVN은 Windows 용 SVN 클라이언트로, 탐색기를 이용해서 Subversion을 매우 편리하게 이용할 수 있다. Eclipse에서 Subclipse를 사용해서 SVN을 접속할텐데 TortoiseSVN을 일부러 설치하는 이유는? 아래에 나온다.

* PuTTY 설정
영문판 PuTTY 혹은 한국어판 PuTTY를 설치한다.

PuTTY는 SSH/Telnet 접속도구이고, SSH 키 관리를 하는 기능과 SFTP를 이용한 안전한 파일 송수신 기능 등을 갖고 있다. 우리가 사용할 기능은 SSH 키 관리 기능이다.

클라이언트에 개인키 설정

개인키를 사용하기 위해서는 PuTTY가 인식할 수 있는 형태로 변환하는 것이 필요하다.
puttygen을 실행하고 메뉴에서 "Conversions -> Import Key"를 선택한다. kwon37xiKey 파일을 선택하고서 Passphrase로 아까 키 생성시 지정했던 "mypassword"를 입력한다. "Save private key" 버튼을 클릭해서 kwon37xiKey.PPK 정도의 이름을 줘서 저장한다. 확장자는 PPK이다.

C:\Documents and Settings[user_name]Application Data\Subversion\config 파일을 열어서 아래와 같이 PuTTY의 PLINK경로를 가리키도록 변경한다. Eclipse의 SVN 플러그인인 Subclipse나 TortoiseSVN이 PLINK를 이용해서 SSH접속을 하도록 하는 것이다. 헌데, 여기서는 PuTTY의 PLINK가 아니라 TortoiseSVN의 PLINK를 사용했다.
[tunnels]
ssh = C:/Program Files/TortoiseSVN/bin/TortoisePlink.exe

TortoisePlink.exe는 PuTTY의 plink.exe를 변경한 것이라고 한다. PuTTY의 plink를 사용하지 않은 이유는 PuTTY의 plink는 SSH관련 작업이 있을 때마다 귀찮은 화면이 자꾸뜨는데, TortoisePlink는 그렇지 않다.
그리고 경로를 지정할 때 유닉스 식으로 지정했음에 주의하라. 디렉토리 구분은 /이고, 경로에 공백이 나올 때는 을 이용해서 이스케이핑을 해야 한다.

PuTTY Pagent를 실행하면 시스템 트레이에 아이콘이 생기는데, 해당 Pagent 아이콘의 Add Key 메뉴를 통해 이용해서 개인키(아까 저장한 kwon37xiKey.PPK) 를 저장한다. 개인키 저장시 키를 만들지 지정한 Passphrase를 물어보면 그것을 입력한다.

Pagent를 "시작 프로그램"에 등록하여 항상 시작되게 해 두면 이제부터 PuTTY를 쓰거나 Eclipse의 Subclipse를 이용할 때 해당 서버에 로그인 시도시 자동으로 로그인 된다.

그리고 Pagent의 개인키는 Pagent를 새로 시작할 때마다 다시 지정해야 한다.

Subclipse

Subclipse의 SVN Repository Perspective로 전환하여 svn+ssh://username@yourhostname.com/home/username/repos를 새로운 리포지토리로 등록한다.

1. 프로젝트를 생성하고, 해당 프로젝트를 SVN에 import 할 때(프로젝트를 최초로 SVN에 올릴 때) 프로젝트명에서 오른쪽 단추를 클릭해서 "Team -> Share Project"를 통해 Import를 한다.
2. Repository Type에서 SVN을 선택한다.
3. SVN 리포지토리의 폴더 네임을 선택하는 항목에서 "Use specified folder name"을 선택하고, 폴더명을 "Project명/trunk"로 지정한다. 이렇게 하지 않으면 Branch나 Tag를 생성할 수가 없다. (약간 짜증난다..)

기타 참조할 점으로,
CVS에서 "add to .cvsignore" 와 같이 특정 파일을 리포지토리에 등록하지 않도록 지정하려면, "Team -> Add to svn:ignore"을 하면된다. 이것은 "svn:ignore" 프라퍼티를 지정하는 것으로, 이렇게 할경우에는 프로젝트를 Commit 해야 이에 관한 사항이 SVN 리포지토리에 전달된다. 그래서 좀 헷갈린다. CVS처럼 .cvsignore 파일 같은 것을 커밋하는게 아니라 프로젝트를 선택해서 Commit 해야한다.

지금까지 Subclipse(1.0.3)를 사용한 결과는, 아직은 약간 불안정하다는 것이다. 뭔지 모를 파악 안되는 행동들을 가끔씩 한다.
그래도 사용을 못할 정도의 문제는 없는 것 같다.

그외에 Subversive 라는 것도 있다. SSH를 이용한 접속에는 아예 실패하여 그냥 포기했다. Subversive의 경우 메일링 리스트를 보니 Eclipse 공식 프로젝트로 진입하기 위한 노력을 하고 있는 것으로 보인다.
Posted by 나비:D
:

출처 : http://www.dalbong2.net/46

프로덕트 XML 파일


부트스트래퍼(Bootstrapper)는 ClickOnce 애플리케이션이 구동되기 전에 애플리케이션에서 필요로 하는 필수 프로그램(prerequisties)이 먼저 설치되어 있는지를 확인하는 작은 부피의 프로그램을 말한다. Visual Studio.NET 2005에는 내장된 부트스트래퍼 기능이 있다. 우리는 이 기능을 사용하여 ClickOnce 애플리케이션이 실행되기전에 필요한 다른 컴포넌트를 설치할 수 있다.
달봉이는 지금까지 알고 있는 방법중에서 이전의 COM 컴포넌트나 .NET 어셈블리나 가리지 않고 클라이언트로 배포를 할 수 있는 가장 쉬운 방법중의 하나로 여기고 있다. 단점은 ClickOnce에서만 가능하다는 것이다.[현재 2006.09.16]

VS.NET의 부트스트래퍼 기능을 사용하기 위해서는 우선 컴포넌트를 설치하는 설치 프로그램(.exe or .msi)을 작성해야 한다. 그런 다음 이 설치 프로그램을 부트스트래퍼에 등록해야 한다. 그러기 위해서는  XML형식의 프로덕트 파일(product file)을 제작해야 한다.  

프로덕트 파일
(파일을 클릭하면 선명한 그림이 뜹니다)

프로덕트 파일은 ClickOnce 프로그램이 실행되기 전에, 어떤 필수 프로그램들이 설치되어 있어야 하는지를 설명해주는 부트스트래퍼용 manifest 파일을 생성해준다. 프로덕트 파일에는 ClickOnce 애플리케이션이 필요로하는 필수 컴포넌트들을  설치하는 설치프로그램들에 대한 정보를 여러개 포함시킬 수 있다.
이 그림처럼 프로덕트 파일을 생성해서 설치 프로그램과 같이 적절한 위치에 두면  ( 달봉의 경로는 다음과 같다. C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages ) 아래 그림처럼 VS.NET의 게시 디자이너에서 필수 구성 요소 버튼을 클릭했을때 선택할 수 있는 박스에 나타나게 된다. 이제 필요한 프로그램을 선택해서 게시를 하면 된다.

VS.NET에서 필수 구성 요소 선택
(파일을 클릭하면 선명한 그림이 뜹니다)

이제 이 프로덕트 XML 파일을 제작하는 방법을 알아본다.

프로덕트 파일 제작

프로덕트 파일을 제작하기 위해서는 부트스트래퍼가 이해할 수 있는 규칙에 맞도록 작성해야 한다. 이런 XML 스키마는 다음 링크에서 찾아볼 수 있다.
Product and Package Schema Reference - msdn
http://msdn2.microsoft.com/en-us/library/ms229223.aspx(새 창으로 열기)

그렇지만 이 스키마를 이해하고 직접 손으로 작성하라고 하면 MS에 짜증이 날것이다. 이런 스키마가 있다면 이런 것을 제작할 수 있는 편집기도 주면 좋잖은가. 근데 아직 공식적으로 출시된 유틸 프로그램은 없는 것으로 안다. 다행히도 이 XML 파일을 생성해주는 편집 툴을 제공하는 훌륭한 분이 계시다.

프로덕트 파일 생성 툴
ClickOnce Bootstrapper Manifest Generator

자세한 내용은 Powertoys blog(새 창으로 열기)에서 볼 수 있다.

이제 이 툴을 사용하는 방법을 소개한다. 툴을 실행시키고 File->New를 선택한다.

(파일을 클릭하면 선명한 그림이 뜹니다)

Package Manifest 프로젝트 타입을 선택한다.

(파일을 클릭하면 선명한 그림이 뜹니다)

(파일을 클릭하면 선명한 그림이 뜹니다)

그림처럼 package 노드가 하나 기본적으로 생성되면 적절하게 package 이름을 입력한다. 이 이름은 C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages 아래에 생성되는 폴더명이 될 것이다.

(파일을 클릭하면 선명한 그림이 뜹니다)

그런 다음 위 그림처럼 "Add Install File" 버튼을 클릭하면 아래처럼 설치파일을 추가할 수 있는 창이 뜬다.


적절한 설치파일을 검색해서 선택한다. 이 설치 파일은 ClickOnce 애플리케이션이 실행되기 전에 미리 설치되어 있어야 하는 컴포넌트를 클라이언트 PC에 설치하게 될 것이다. 달봉이는 임시로 iis60rkt.exe라는 파일을 선택하고 있다. ClickOnce 애플리케이션과는 전혀 상관없는 셋업 파일이긴 하지만.

(파일을 클릭하면 선명한 그림이 뜹니다)

그런 다음 적절한 display 명을 준다. 이 이름은 VS.NET의 필수 구성요소 선택하는 창에 출력될 것이다.

(파일을 클릭하면 선명한 그림이 뜹니다)

그런 다음 System Checks 탭을 선택한다. 이 탭에서는 이 컴포넌트가 이미 설치되었는지를 체크하는 로직을 선택할 수 있다. 설치 여부를 체크하는 로직은 여러가지를 제공하고 있다. 그림의 아이콘에 커서를 올려놓으면  설치 여부를 체크하는 로직으로
"File Check",
"Registry Check",
"Registry File Check",
"MSI Product Check",
"External Check",
"Assembly GAC Check"

등이 있음을 알 수 있다. File Check라는 것은 앞의 그림처럼 "어떤 경로의 폴더에 지정한 파일이 있으면 이미 이 PC에는 원하는 셋업이 이뤄져있다"는 것으로 간주하겠다는 것이다. 레지스트리에 특정 값이 있는지를 판단해서 설치여부를 판단할 수도 있다. 시스템 체크 로직에 대한 다른 구체적인 방법에 대해서는 앞에서 알려준 MSDN 링크 페이지(새 창으로 열기)를 통해서 알아보길 바란다.
달봉이는 단순히 그림과 같은 경로에 iisTools.chm 파일이 있는지를 판단해서 그 결과값을 IIS60rktInstalled에 받아 두도록 하고 있다.

(파일을 클릭하면 선명한 그림이 뜹니다)

다음은 Install Conditions 탭을 선택한다. 이곳에서는 System Checks 탭에서 시스템의 상태를 체크한 값을 이용해서 값에 따라서 어떻게 할 것인지를 설정할 수 있다. 그림은 앞에서 설정된 IIS60rktInstalled 값이 0보다 크거나 같으면 그냥 설치를 통과하도록 설정하고 있다. IIS60rktInstalled 같은 변수에 어떤 값이 저장될 지는 시스템 체크 로직에 따라 다르다. 이런 구체적인 값도 앞에서 알려준 msdn 링크(새 창으로 열기)를 참조하기 바란다.

(파일을 클릭하면 선명한 그림이 뜹니다)

다음은 Exit Codes 탭을 선택한다. 설치 파일이 exit code를 리턴하고 그것에 따라 실패, 성공, 재부팅들을 설정해줄 수가 있다. 달봉은 exit code에 대한 설정을 해 주지 않고 있다. 다만 아래 부분을 보면 "Use Default System Exit Codes"가 선택되어 있고 결과값으로 Fail이 선택되어 있는데, 이것은 설치 후 상태를 기본적으로 설치 실패로 설정하겠다는 것이다. 우리는 이것의 체크를 없애 줘야 한다.  

(파일을 클릭하면 선명한 그림이 뜹니다)

그런 다음 저장 버튼을 클릭하면 지금까지 설정한 내용을 저장할 수 있다. 이때 저장된 내용은 우리가 원하는 xml 형식의 프로덕트 파일은 아니다. 이렇게 저장된 내용은 언제든지 다시 불러와서 재 편집을 할 수 있다(근데, 이 기능이 아직은 제대로 작동하지 않는듯하다)

(파일을 클릭하면 선명한 그림이 뜹니다)

우리가 원하는 xml의 프로덕트 파일을 최종적으로 만들어 내기 위해서는 위 그림처럼 "Project->Build" 메뉴를 선택해야 한다. 이 메뉴를 선택하고 나면 아래 그림처럼 결과가 나타난다.

(파일을 클릭하면 선명한 그림이 뜹니다)

이 그림은 최종적으로 프로덕트 파일이 저장된 경로(기본적으로 C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages )와 프로덕트 파일을 생성하는과정에 남긴 로그를 보여주고 있다. 프로덕트 파일의 저장 경로는 "Project->Properties"에서 변경할 수 있다.

이렇게 해서 최종적인 프로덕트 파일이 생성되었고 적절한 폴더에 위치시켰다. 이제 VS.NET을 실행시키고 게시 디자이너를 통해서 필요한 설치 프로그램을 선택한 후 게시를 하면 된다.

--------------------------------------------------------------------------------

참조 문서

Product and Package Schema Reference - msdn
http://msdn2.microsoft.com/en-us/library/ms229223.aspx(새 창으로 열기)
ClickOnce Deployment Technology - Peter Bromberg
http://www.wise.com/Library/ClickOnce.pdf(새 창으로 열기)
ClickOnce : Bringing Ease and Reliability to SmartClient Deployment
http://www.code-magazine.com/article.aspx?quickid=0601041&page=1(새 창으로 열기)
msdn : Deploying applications
http://msdn2.microsoft.com/en-us/library/6hbb4k3e(VS.80).aspx(새 창으로 열기)

Posted by 나비:D
:
메시지 필터를 이용하여 F1, F2, F3 .. 키 입력을 후킹하기.
 
 
public class MessageFilter : System.Windows.Forms.IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        switch(m.Msg)
        {
            case 256 : // WM_KEYDOWN    
 
<==== windows message 를 C# 형태로 쓰고 싶었지만..
딱히 만들어져있는게 없더군요 그래서 인터넷에서 windows.h 파일을 검색해서 찾았습니다. WM_KETDOWN = 256 번이더군요.
 
                System.Console.WirteLine(m.LParam.ToInt32());      
                // 이걸로 F1 부터 여러가지 키를 차례데로 눌러본 값들이
                if( m.LParam.ToInt32() == 3866625 ) // F1 Key            
                // <===  이 값들입니다. 3866625 가 F1 이군요.. 이런식으로 Key 값을 찾아서
                {                                                                            
                // 계속 추가하면 키보드 후킹.. 그다지 어려운건 아닐거 같군요 ^^;;
                    System.Console.WriteLine("F1 Press");
                    return true;
                }
                else if( m.LParam.ToInt32() == 3932161 )    // F2 Key
                {
                    System.Console.WriteLine("F2 Press");
                    return true;
                }
                else if( m.LParam.ToInt32() == 3997697 )    // F3 Key
                {
                    System.Console.WriteLine("F3 Press");
                    return true;
                }
                break;
        }
        return false;
    }
}
 
//
//     만들어 놓은 MessageFilter 는 반드시 AddMessageFilter 메서드를 통해 추가해줘야 합니다.
//    static void Main 함수는 기본 Form 에 포함되어 있습니다.  :) 아시죠?
 
static void Main()
{
    Application.AddMessageFilter(new MessageFilter());
    Application.Run(new JapExamples());
}
 
 
아래 있는 것은 windows.h 파일에 정의된 windos message 들입니다. windows.h 파일은 visual studio 안에 INCLUDE_ROOT 에 있습니다.
어딘지는 아시죠?
 
 
WA_ACTIVE 1
WA_CLICKACTIVE 2
WA_INACTIVE 0
WM_ACTIVATE 6
WM_ACTIVATEAPP 28
WM_AFXFIRST 864
WM_AFXLAST 895
WM_APP 32768
WM_ASKCBFORMATNAME 780
WM_CANCELJOURNAL 75
WM_CANCELMODE 31
WM_CAPTURECHANGED 533
WM_CHANGECBCHAIN 781
WM_CHAR 258
WM_CHARTOITEM 47
WM_CHILDACTIVATE 34
WM_CLEAR 771
WM_CLOSE 16
WM_COMMAND 273
WM_COMMNOTIFY 68
WM_COMPACTING 65
WM_COMPAREITEM 57
WM_CONTEXTMENU 123
WM_COPY 769
WM_COPYDATA 74
WM_CREATE 1
WM_CTLCOLORBTN 309
WM_CTLCOLORDLG 310
WM_CTLCOLOREDIT 307
WM_CTLCOLORLISTBOX 308
WM_CTLCOLORMSGBOX 306
WM_CTLCOLORSCROLLBAR 311
WM_CTLCOLORSTATIC 312
WM_CUT 768
WM_DEADCHAR 259
WM_DELETEITEM 45
WM_DESTROY 2
WM_DESTROYCLIPBOARD 775
WM_DEVICECHANGE 537
WM_DEVMODECHANGE 27
WM_DISPLAYCHANGE 126
WM_DRAWCLIPBOARD 776
WM_DRAWITEM 43
WM_DROPFILES 563
WM_ENABLE 10
WM_ENDSESSION 22
WM_ENTERIDLE 289
WM_ENTERMENULOOP 529
WM_ENTERSIZEMOVE 561
WM_ERASEBKGND 20
WM_EXITMENULOOP 530
WM_EXITSIZEMOVE 562
WM_FONTCHANGE 29
WM_GETDLGCODE 135
WM_GETFONT 49
WM_GETHOTKEY 51
WM_GETICON 127
WM_GETMINMAXINFO 36
WM_GETOBJECT 61
WM_GETTEXT 13
WM_GETTEXTLENGTH 14
WM_HANDHELDFIRST 856
WM_HANDHELDLAST 863
WM_HELP 83
WM_HOTKEY 786
WM_HSCROLL 276
WM_HSCROLLCLIPBOARD 782
WM_ICONERASEBKGND 39
WM_IME_CHAR 646
WM_IME_COMPOSITION 271
WM_IME_COMPOSITIONFULL 644
WM_IME_CONTROL 643
WM_IME_ENDCOMPOSITION 270
WM_IME_KEYDOWN 656
WM_IME_KEYLAST 271
WM_IME_KEYUP 657
WM_IME_NOTIFY 642
WM_IME_REQUEST 648
WM_IME_SELECT 645
WM_IME_SETCONTEXT 641
WM_IME_STARTCOMPOSITION 269
WM_INITDIALOG 272
WM_INITMENU 278
WM_INITMENUPOPUP 279
WM_INPUTLANGCHANGE 81
WM_INPUTLANGCHANGEREQUEST 80
WM_KEYDOWN 256
WM_KEYFIRST 256
WM_KEYLAST 264
WM_KEYUP 257
WM_KILLFOCUS 8
WM_LBUTTONDBLCLK 515
WM_LBUTTONDOWN 513
WM_LBUTTONUP 514
WM_MBUTTONDBLCLK 521
WM_MBUTTONDOWN 519
WM_MBUTTONUP 520
WM_MDIACTIVATE 546
WM_MDICASCADE 551
WM_MDICREATE 544
WM_MDIDESTROY 545
WM_MDIGETACTIVE 553
WM_MDIICONARRANGE 552
WM_MDIMAXIMIZE 549
WM_MDINEXT 548
WM_MDIREFRESHMENU 564
WM_MDIRESTORE 547
WM_MDISETMENU 560
WM_MDITILE 550
WM_MEASUREITEM 44
WM_MENUCHAR 288
WM_MENUCOMMAND 294
WM_MENUDRAG 291
WM_MENUGETOBJECT 292
WM_MENURBUTTONUP 290
WM_MENUSELECT 287
WM_MOUSEACTIVATE 33
WM_MOUSEFIRST 512
WM_MOUSEHOVER 673
WM_MOUSELEAVE 675
WM_MOUSEMOVE 512
WM_MOUSEWHEEL 522
WM_MOVE 3
WM_MOVING 534
WM_NCACTIVATE 134
WM_NCCALCSIZE 131
WM_NCCREATE 129
WM_NCDESTROY 130
WM_NCHITTEST 132
WM_NCLBUTTONDBLCLK 163
WM_NCLBUTTONDOWN 161
WM_NCLBUTTONUP 162
WM_NCMBUTTONDBLCLK 169
WM_NCMBUTTONDOWN 167
WM_NCMBUTTONUP 168
WM_NCMOUSEMOVE 160
WM_NCPAINT 133
WM_NCRBUTTONDBLCLK 166
WM_NCRBUTTONDOWN 164
WM_NCRBUTTONUP 165
WM_NEXTDLGCTL 40
WM_NEXTMENU 531
WM_NOTIFY 78
WM_NOTIFYFORMAT 85
WM_NULL 0
WM_PAINT 15
WM_PAINTCLIPBOARD 777
WM_PAINTICON 38
WM_PALETTECHANGED 785
WM_PALETTEISCHANGING 784
WM_PARENTNOTIFY 528
WM_PASTE 770
WM_PENWINFIRST 896
WM_PENWINLAST 911
WM_POWER 72
WM_POWERBROADCAST 536
WM_PRINT 791
WM_PRINTCLIENT 792
WM_QUERYDRAGICON 55
WM_QUERYENDSESSION 17
WM_QUERYNEWPALETTE 783
WM_QUERYOPEN 19
WM_QUEUESYNC 35
WM_QUIT 18
WM_RBUTTONDBLCLK 518
WM_RBUTTONDOWN 516
WM_RBUTTONUP 517
WM_RENDERALLFORMATS 774
WM_RENDERFORMAT 773
WM_SETCURSOR 32
WM_SETFOCUS 7
WM_SETFONT 48
WM_SETHOTKEY 50
WM_SETICON 128
WM_SETREDRAW 11
WM_SETTEXT 12
WM_SETTINGCHANGE 26
WM_SHOWWINDOW 24
WM_SIZE 5
WM_SIZECLIPBOARD 779
WM_SIZING 532
WM_SPOOLERSTATUS 42
WM_STYLECHANGED 125
WM_STYLECHANGING 124
WM_SYNCPAINT 136
WM_SYSCHAR 262
WM_SYSCOLORCHANGE 21
WM_SYSCOMMAND 274
WM_SYSDEADCHAR 263
WM_SYSKEYDOWN 260
WM_SYSKEYUP 261
WM_TCARD 82
WM_TIMECHANGE 30
WM_TIMER 275
WM_UNDO 772
WM_UNINITMENUPOPUP 293
WM_USER 1024
WM_USERCHANGED 84
WM_VKEYTOITEM 46
WM_VSCROLL 277
WM_VSCROLLCLIPBOARD 778
WM_WINDOWPOSCHANGED 71
WM_WINDOWPOSCHANGING 70
WM_WININICHANGE 26

출처 : 데브피아

Posted by 나비:D
:
 

안녕하세요. 굿띠입니다...

 이번 포스트는 Property에 대해 얘기를 해보고 활용방법에 대해 간단하게 정리를 해볼까 합니다... 이것도 팁이 될수 있을까 모르겠네요..^^

Property는 어떤 구조로 되어 있다는거는 누구나 다 아실 겁니다.. 하지만 어떤 property를 얘기하는거지??? 라고 말하시는 분도 있을수도 있기 때문에 한번 다음과 같이 간단하게 소스를 만들어보도록 하겠습니다.


  class TestProperty
  {
    private string m_Test;

    public string Test
    {
      get
      {
        return m_Test;
      }
      set
      {
        m_Test = value;
      }
    }

    public TestProperty()
    {
    }
  }


 아~ 이것은 프로그램 하신 분이라면 누구나 많이 보던 소스아닙니까??? 그쵸??^^ 그럼 제가 한번 정리 해보겠습니다.

일반적으로 필드가 public이면 다른 개체가 해당 필드에 직접 액세스가 가능하고 수정 할 수 있지만 위와 같은 Property는 다른 개체를 통해 수정할수는 있으나 해당 필드를 소유하는 개체에 접근하지 못 하도록 합니다. 그리고 필드의 전용값을 읽고 쓰고 융통성 있는 메커니즘을 제공하는 멤버입니다. 이 Property는 멤버변수 처럼 사용할 수 있지만 실제로는 접근자를 통해 구현이 가능 한것이죠! 접근자는 위의 소스내용을 보시면 get, set을 생성하여 private 데이터에 엑세스 한다는것을 보실수 있습니다.


하지만 여기서 Property와 필드의 명확한 구분이 필요할 것 같습니다. 이 Property와 필드는 모두 개체에 정보를 저장하고 검색합니다. 이런 두개의 속성과 필드 기능의 유사성으로 인해 다음과 같은 경우에 서로 구분하여 프로그래밍 방식을 결정합니다. 다음 내용은 MSDN의 한 부분을 발췌했습니다.


다음 경우는 Perperty를 사용합니다.

  • 값이 설정되고 검색되는 시기와 방법을 제어해야 하는 경우

  • 속성에 유효성을 검사해야 하는 잘 정의된 값 집합이 들어 있는 경우

  • IsVisible 속성처럼 값을 설정했을 때 개체의 상태가 크게 변경되는 경우

  • 속성을 설정했을 때 다른 내부 변수나 다른 속성의 값으로 변경되는 경우

  • 속성을 설정하거나 검색하기 전에 일련의 작업 단계를 수행해야 하는 경우


    다음 경우에 필드를 사용합니다.

  • 값이 자체적으로 유효성을 검사하는 형식인 경우. 예를 들어, Boolean 변수에 True 또는 False 이외의 값이 할당되면 오류가 발생하거나 자동 데이터 변환이 수행됩니다.

  • 데이터 형식에서 지원하는 범위의 값이 유효한 경우. Single 또는 Double 형식의 여러 속성에도 적용됩니다.

  • 속성이 String 데이터 형식이고 문자열의 크기나 값에 대해 제약 조건이 없는 경우

     

    링크 : http://msdn2.microsoft.com/ko-kr/library/9d65as2e(VS.80).aspx




    다음으로 Property의 접근자에 대해서 한번 알아보도록 합시다. get 접근자는 속성 값을 반환하는 데 사용되고, set 접근자는 데이터를 저장할때 사용합니다. 여기서 get접근자는 방금 말씀드렸다시피 Property를 정의할때도 사용되지만 인덱서 요소를 검색하고 정의할때 사용되기도 합니다. 인덱서의 자세한 내용은 여기를 참조하시면 될거 같습니다.^^ http://msdn2.microsoft.com/ko-kr/library/6x16t2tx(VS.80).aspx

     

     

     

    활용 : Property를 활용하여 TextBox의 DataBindings속성을 구현하자(따라하기)

     

    그럼 한번 Property를 이용하여 TextBox컨트롤과 데이타바인딩을 한번 시켜보겟습니다. Control.DataBindings속성은 필드의 데이터와는 바인딩이 되지 않지만 Property와는 데이터 바인딩이 가능하기 때문에 코드의 가독성과 효율적인 프로그래밍을 할 수 있습니다.



    1. 먼저 응용프로그램 프로젝트를 하나 만듭니다. 이름은 TextDataBinding으로 합니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    2. 다음 폼디자인 화면에서 다음과 같이 컨트롤을 배치합니다. 이름의 텍스트 박스 컨트롤의 네임은 txt_name, 나이의 텍스트 박스 컨트롤의 네임은 txt_age로 지정합니다.




    3. 다음 두개의 텍스트박스와 데이터 바인딩 되는 Property를 만듭니다. 소스는 다음과 같습니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    4. 폼 로드 이벤트에 텍스트박스와 Property가 데이터 바인딩 될수 있도록 다음과 같이 작성합니다.

     

     

     

     

    Add메서드의 3개의 인자중 첫번째는 데이터 바인딩 되는 속성을 말합니다. 저는 텍스트 박스의 Text속성과 데이터바인딩을 하기위해 Text라고 적었습니다. 2번째 인자는 데이터 소스와 3번째 인자 데이터 멤버이므로 현재 클래스의 this와 Property이름을 넣었습니다.




    5. 버튼 컨트롤을 더블 클릭하여 Click이벤트를 등록하고 다음과 같이 작성합니다.

     

     

     

     



    그럼 전체 소스를 보여드리고 테스트를 한번 해보겠습니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    테스트를 해볼까요??? ^^ 프로그램을 실행한뒤 텍스트박스에 이름과, 나이를 입력하고 확인을 눌러봅시다.




     

     

     

     

     

     

     

     

     

     

     

     

     

    짠~~ 올바른 결과가 나왔네요...

    정리 : 버튼을 눌렀을경우 Property를 출력하라고 했습니다.  어때요??  Property는 TextBox와 데이터 바인딩이 되어 있기 때문에 Property를 통해 TextBox의 Text의 내용을 간단하게 출력할 수 있는 것입니다. 더 이상 정리는 필요 없을 것 같군요..

     

    한번 여러분도 따라 해보세요...^^!!

     

     

     

    TIP : VS2005의 리페터링으로 Property를 쉽게 만들자!!!

    여러분은 Property를 처음부터 끝까지 입력하시는건 아니죠??? Property를 10개나 만든다고 생각해보세요. 코딩 제대로 못하고 반복되는 Ctrl + C,V를 하면서 고친다면 프로그래밍의 재미를 보기전에 흥미를 잃어버릴수도 있을 겁니다. 저도 처음에는 열심이 입력했답니다.^^

    VS2005 이상 에서는 이러한 귀찮은 작업을 쉽게 만들수 있도록 도와주는 기능이 있습니다. 바로 리펙터링이라는 기능중에 필드 캡슐화라는 기능 인데요. 사용법은 다음과 같습니다.

     

    1. 먼저 private 멤버변수를 하나 만듭니다.








     

     

    2. private 멤버변수에서 우클릭 -> 리펙터링 -> 필드 캡슐화를 선택합니다.



     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    3. 다음 아래 그림과 같이 필드 이름을 적어주고 확인을 눌러줍니다.


    4. 짜잔~~! Property가 쉽게 만들어지는걸 볼 수 있습니다.


     VS2005는 이러한 반복적인 작업을 최소화 하기 위해 여러가지의 리펙터링 기능이 존재합니다. 이러한 리팩터링 작업을 사용하면 기존 필드에서 신속하게 속성을 만든 다음 문제 없이 코드를 새 속성에 대한 참조로 구현할 수 있습니다.^^

  • Posted by 나비:D
    :

    윈도우를 종료
    System.Diagnostics.Process.Start("cmd.exe","ShutDown.exe -s -f -t 00");


    윈도우를 재부팅

    System.Diagnostics.Process.Start("cmd.exe","ShutDown.exe -r -f -t 00");

     

    특정 폴더 열기
    System.Diagnostics.Process.Start("explorer.exe", "C:\Temp");

    특정 사이트 열기
    System.Diagnostics.Process.Start("explorer.exe", "http://www.naver.com");

     

    도스명령어 실행

    System.Diagnostics.Process.Start("cmd.exe","/c dir");

    // cmd 옵션에 대해 더 알고싶으면.. c:>help cmd

     

    Process.Start 메서드 사용형식
     

    using System.Diagnostics;

    //System.Diagnostics 네임스페이스는 시스템 프로세스, 이벤트 로그 및 성능 카운터와 상호 작용할 수 있는 클래스를 제공합니다.

     

    public bool Start();
    //이 Process 구성 요소의 StartInfo 속성으로 지정된 프로세스 리소스를 시작하거나 다시 사용하여 구성 요소에 연결합니다.

     

    Process myProcess = new Process();
    string myDocumentsPath =   Environment.GetFolderPath(Environment.SpecialFolder.Personal);
    myProcess.StartInfo.FileName = myDocumentsPath + "
    \MyFile.doc";
    myProcess.StartInfo.Verb = "Print";
    myProcess.StartInfo.CreateNoWindow = true;
    myProcess.Start();

     

    public static Process Start( ProcessStartInfo startInfo);
    // ProcessStartInfo : 파일 이름 및 모든 명령줄 인수를 포함하여 프로세스를 시작하는 데 사용되는 정보
    // 시작할 프로세스의 파일 이름 같은 프로세스 시작 정보가 포함된 매개 변수에 의해 지정된
    // 프로세스 리소스를 시작하고 해당 리소스를 새 Process 구성 요소에 연결합니다

     

    ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
    startInfo.WindowStyle = ProcessWindowStyle.Minimized;
    startInfo.Arguments = "
    www.naver.com";
    Process.Start(startInfo);

     

    public static Process Start(string fileName);
    // fileName : 프로세스에서 실행될 응용 프로그램 파일 이름입니다.

    //문서 또는 응용 프로그램 파일 이름을 지정하여 프로세스 리소스를 시작하고 해당 리소스를 새 Process 구성 요소에 연결합니다

     

    Process.Start("IExplore.exe");

     

    public static Process Start(string fileName, string arguments);
    // arguments : 프로세스를 시작할 때 전달할 명령줄 인수입니다

    //응용 프로그램 이름 및 명령줄 인수 집합을 지정하여 프로세스 리소스를 시작하고 해당 리소스를 새 Process 구성 요소에 연결합니다.

     

    Process.Start("IExplore.exe", "C:\myPath\myFile.htm");
    Process.Start("IExplore.exe", "C:\myPath\myFile.asp");

     

     

    Process 클래스

    Process 구성 요소는 컴퓨터에서 실행 중인 프로세스에 대한 액세스를 제공합니다. 간단히 말해 프로세스란 실행 중인 응용 프로그램을 말합니다.

     

    Process 구성 요소는 응용 프로그램의 시작, 중지, 제어 및 모니터링을 위한 유용한 도구입니다.
    Process 구성 요소를 사용하면 실행 중인 프로세스의 목록을 얻거나 새로운 프로세스를 시작할 수 있습니다. 또한 Process 구성 요소를 사용하여 시스템 프로세스에도 액세스할 수 있습니다.
    Process 구성 요소를 초기화한 후에는 해당 구성 요소를 사용하여 실행 중인 프로세스에 대한 정보를 얻을 수 있으며 그러한 정보에는 스레드 집합, 로드된 모듈(.dll 및 .exe 파일), 프로세스가 사용하고 있는 메모리 양과 같은 성능 정보 등이 포함됩니다.

     

    프로세스 구성 요소는 속성 그룹에 대한 정보를 한 번에 가져옵니다. Process 구성 요소가 특정 그룹의 한 멤버에 대한 정보를 가져올 때 해당 그룹의 나머지 속성 값이 캐싱되므로 Refresh 메서드를 호출하지 않는 한 그룹의 다른 멤버에 대한 새로운 정보를 가져오지 않습니다. 따라서 속성 값이 Refresh 메서드를 마지막으로 호출하여 얻은 속성 값과 같을 수 있습니다. 이러한 그룹 명세는 운영 체제에 따라 다릅니다.

     

    더 자세한 사항은 Microsoft Visual Studio .NET 2003 도움말에서 Process 클래스를 참고하세요.

     

     

    도스명령수행 프로그램 


     

    [전체소스]


    using System;

    using System.Drawing;

    using System.Collections;

    using System.ComponentModel;

    using System.Windows.Forms;

    using System.Data;

    using System.Diagnostics;

    using System.IO;

    using System.Threading;


    namespace mouseEvents

    {


        public class Form1 : System.Windows.Forms.Form

        {

            private System.Windows.Forms.TextBox textBox1;

            private System.Windows.Forms.Label label2;

            private System.ComponentModel.IContainer components;

            private System.Windows.Forms.TextBox tbComm;

            private System.Windows.Forms.Button btnExec;



            public Form1()

            {

                InitializeComponent();

            }


            protected override void Dispose( bool disposing )

            {

                if( disposing )

                {

                    if (components != null)

                    {

                        components.Dispose();

                    }

                }

                base.Dispose( disposing );

            }


            #region Windows Form Designer generated code

            /// <summary>

            /// Required method for Designer support - do not modify

            /// the contents of this method with the code editor.

            /// </summary>

            private void InitializeComponent()

            {

                this.label2 = new System.Windows.Forms.Label();

                this.tbComm = new System.Windows.Forms.TextBox();

                this.btnExec = new System.Windows.Forms.Button();

                this.textBox1 = new System.Windows.Forms.TextBox();

                this.SuspendLayout();

                //

                // label2

                //

                this.label2.Location = new System.Drawing.Point(8, 8);

                this.label2.Name = "label2";

                this.label2.Size = new System.Drawing.Size(72, 17);

                this.label2.TabIndex = 5;

                this.label2.Text = "도스명령어:";

                //

                // tbComm

                //

                this.tbComm.Location = new System.Drawing.Point(80, 8);

                this.tbComm.Name = "tbComm";

                this.tbComm.Size = new System.Drawing.Size(355, 21);

                this.tbComm.TabIndex = 6;

                this.tbComm.Text = "";

                //

                // btnExec

                //

                this.btnExec.Location = new System.Drawing.Point(440, 8);

                this.btnExec.Name = "btnExec";

                this.btnExec.Size = new System.Drawing.Size(104, 25);

                this.btnExec.TabIndex = 1;

                this.btnExec.Text = "실행";

                this.btnExec.Click += new System.EventHandler(this.button2_Click);

                //

                // textBox1

                //

                this.textBox1.AcceptsReturn = true;

                this.textBox1.AcceptsTab = true;

                this.textBox1.Location = new System.Drawing.Point(8, 32);

                this.textBox1.Multiline = true;

                this.textBox1.Name = "textBox1";

                this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;

                this.textBox1.Size = new System.Drawing.Size(528, 312);

                this.textBox1.TabIndex = 2;

                this.textBox1.Text = "";

                //

                // Form1

                //

                this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);

                this.ClientSize = new System.Drawing.Size(547, 350);

                this.Controls.Add(this.tbComm);

                this.Controls.Add(this.label2);

                this.Controls.Add(this.textBox1);

                this.Controls.Add(this.btnExec);

                this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;

                this.MaximizeBox = false;

                this.Name = "Form1";

                this.Text = "Process Class";

                this.ResumeLayout(false);


            }

            #endregion


            [STAThread]

            static void Main()

            {

                Application.Run(new Form1());

            }


            private void button2_Click(object sender, System.EventArgs e)

            {

                this.start();

            }


            private void start()

            {


                //Network 변수

                StreamWriter DosWriter;

                StreamReader DosRedaer;

                StreamReader ErrorReader;

               

                //프로세스 생성및 초기화

                Process DosPr = new Process();

               

                ProcessStartInfo psI = new ProcessStartInfo("cmd");

                psI.UseShellExecute = false;

                psI.RedirectStandardInput = true;

                psI.RedirectStandardOutput = true;

                psI.RedirectStandardError = true;

                psI.CreateNoWindow = true;



                //명령 실행

                DosPr.StartInfo = psI;

                DosPr.Start();

                DosWriter = DosPr.StandardInput;

                DosRedaer = DosPr.StandardOutput;

                ErrorReader = DosPr.StandardError;


                DosWriter.AutoFlush = true;


                DosWriter.WriteLine(tbComm.Text);

               

                DosWriter.Close();


                //출력

                textBox1.Text = DosRedaer.ReadToEnd();

                textBox1.Text += ErrorReader.ReadToEnd();


            }

        }

    }



      작성자 : HOONS(박경훈)
      이메일 : tajopkh@hanmail.net

    출처 : http://www.cyworld.com/nowy/192742

    Posted by 나비:D
    :

    출처 : http://tjstory.tistory.com/120

    Visual Studio Setup and Deployment


    여기저기 포스트를 뒤져보는데 셋업에 관련한 포스트는 없는 듯 하군요..
    못찾는 것인지.. 
    제가 사용하는 범위 내에서 셋업 프로젝트에 관해 알아보고자 합니다.
    중간 중간 링크되는 URL 은 관련사항에 대한 문서입니다. 대부분이 MSDN 일텐데..
    입맛에 안맞으신다거나 좀더 깊히 들어가고 싶으신분들은 참조 하시면 좋겠습니다.
    혹 궁금한 사항이 있으시다면 글 남겨주시면 답변 드리겠습니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

    환경 : VS 2008, .Net 2.0

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    프로젝트 생성

    MSDN .Net 을 이용하여 설치 패키지를 만드는 방법
    http://support.microsoft.com/kb/307353

    사용자 삽입 이미지

    사용자 삽입 이미지

    셋업 프로젝트에서 제공되는 기능들에 대해서는 View 영역에서 확인하실 수 있습니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

    프로젝트 속성
    사용자 삽입 이미지
    프로젝트 선택후 속성 창의 모습입니다.
    [Localization] 은 기본 English 인데 , 이부분을 Korean 으로 바꿔 줍니다.
    이부분을 영어로 했을경우 프로젝트내에 한글 인식이 안됩니다.
    [Manufacture] 항목은 회사명으로 배포시 설치되는 경로가 됩니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    파일 포함하기
    사용자 삽입 이미지
    Application Folder : 응용프로그램 설치 폴더에 포함되는 파일들
    User's Desktop : 바탕화면에 포함되는 파일들
    User's Programs Menu : 시작 메뉴에 포함되는 파일들

    [Application Folder]  항목에서 우클릭 메뉴를 확인하면, 파일을 추가 할 수가 있습니다.
    이곳에 추가되는 파일들은 설치 응용프로그램 폴더에 포함됩니다.

    바로가기 아이콘 만들기
    http://support.microsoft.com/kb/307358/
    [Application Folder] 에 포함된 파일중 바로가기 아이콘을 생성하고자 하는 실행 파일을 선택합니다.
    실행파일 우클릭 메뉴를 확인하시고, 바로가기 아이콘을 생성합니다.
    바로가기 아이콘은 같은 카테고리 안에 생성됩니다.
    생성된 아이콘을 마우스 드래그 하여 User's Desktop, User's Programs Menu 항목에 추가 할 수 있습니다.
    생성된 아이콘의 프로퍼티를 조정하여 Icon을 설정 하실 수 있습니다.
    사용자 삽입 이미지
    [Icon] [Browser] 클릭하여 Icon  파일을 연결합니다.

    설치 경로 셋팅하기
    이상태로 빌드를 한후, 설치를 해보게 되면 설치 되는 폴더의 경로가 Program Files \ Default Company로 설정될 것입니다.
    이 경로에 대한 설정은 [Application Folder]의 프로퍼티에서 변경 할 수 있습니다.
    사용자 삽입 이미지

    DefaultLocation의 경로를 보게되면, [Manufacturer] 이라는 부분이 있는데 이부분이 회사명에 해당되는 곳입니다.
    [Manufacturer]에 해당되는 곳에 회사 명을 포함하여 설치 경로를 조정할 수 있습니다.
    예> [ProgramFilesfolder]MyCompany\[Productname]

    여기까지의 진행만으로도 파일과 바로가기가 포함된 간단한 셋업 파일을 만들 수 있겠군요.


    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

    UI Interface
    사용자가 응용프로그램을 설치 할 때 보게 되는 다이얼로그의 UI에 해당하는 사항을 설정할 수 있는 부분입니다.
    간단하게 메세지를 표현 할 수도 있고, CheckBox 등의 컨트롤을 추가할 수 있습니다.
    http://msdn2.microsoft.com/en-us/library/ecaca8zb(VS.80).aspx
    사용자 삽입 이미지

    트리의 각 항목들의 프로퍼티값을 조정하여 UI를 설정할 수 있습니다. 몇가지만 살펴보면..
    [Welcome] CopyrightWarning, WelcomeText 설치 시 첫 페이지에 해당 메세지 들이 표시 됩니다.
    [Finished] UpdateText 설치 종료시 표시되는 메세지 입니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    CustomAction

    [CustomAction]은 설치 도중 사용자에 의해 행해지는 작업을 의미 합니다.
    예를 들어 응용프로그램이 실행 되기 위해서 닷넷 2.0 이 설치 되어 있어야 한다면,
    개발자는 배포시에 닷넷 2.0 또한 같이 배포 되길 원할 것입니다.
    CustomAction 에는 4개의 카테고리(Install, Commit, Rollback, Uninstall)가 존재합니다.
    각 카테고리는 설치 단계를 의미 합니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓

    사용자 선택에 따른 조건부 설치 설정

    http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vsintro7/html/vxwlkwalkthroughpassingdatatocustomaction.asp

    Condition 라는 속성 값을 통해서 프로그램의 배포시에 특정 파일을 포함 시키거나
    혹은 특정 CustomAction 을 행하느냐 하지 않느냐를 결정 할 수 있습니다.
    사용자 삽입 이미지
    Filesystem 에 두개의 임의로 제작한 실행 파일을 등록 하였습니다.

    사용자 삽입 이미지

    [User Interface] [Start] 우클릭 메뉴에서 2개의 라디오 버튼을 포함하는 다이얼로그를 추가 합니다.
    다이얼로그를 Welcome 항목 밑에 위치 시킵니다.
    <참조> 모든 사용자 지정 대화 상자는 설치 폴더 대화 상자 또는 웹 설치 프로젝트의 설치 주소 대화 상자 앞에 와야 합니다.

    사용자 삽입 이미지

    추가된 다이얼로그의 프로퍼티 창 입니다.
    두개의 라디오 버튼중 1번째 버튼은 Yes 항목  2번째 버튼은 No 항목으로 설정 하였습니다.
    ButtonProperty 프로퍼티의 BUTTON2  값은 변수와 같은 개념으로 이 값을 통해 선택된 라디오 버튼을 확인합니다.
    사용자 삽입 이미지

    FileSystem 에서 추가한 exe 실행 파일을 Custom Actions 에서 Actions 으로 추가합니다.
    추가된 실행 파일의 프로퍼티 창을 보면 Condition 항목을 확인 할 수 있습니다.
    사용자 삽입 이미지

    Arguments 항목을 /Install 로 설정합니다.
    Conditions 항목을 BUTTON2=1 로 설정합니다. 눈치 채셨겠지만 추가된 다이얼로그의 버튼 항목입니다.
    BUTTON2 항목이 1값으로 선택되었을 경우 작동 합니다.
    그냥 조건문이라 생각하시면 되겠군요
    InstallerClass 항목을 False 로 설정 합니다.


    사용자 삽입 이미지

    Yes 선택시 CustomAction.exe 가 실행되고, No를 선택시 무시 됩니다.
    이처럼 사용자의 선택에 따라 Custom Action을 지정할 수 있지만, 또한 응용프로그램에 포함되는 파일을 설치시 추가 제거 할 수 있습니다.
    앞전에 FileSystem 에서 추가한 Setup_Application.exe 의 Condition 항목에 BUTTON2=1 이라고 설정하였다면
    No를 선택시 CustomAction.exe가 설치 되지 않을 뿐만아니라
    설치가 종료되고 해당 폴더를 확인하면 Setup_Application.exe가 포함되지 않았음을 알 수 있습니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    VerSionNT

    http://www.tarma.com/support/tin3/0100-using/0035-symbols/0200-variables/versionnt.htm

    조건부 설치 항목에서 Condition 속성에 대해서 알아 봤습니다.
    Condition 속성을 이용하면 운영체제에 따른 조건부 설치를 진행 할 수 있습니다.
    예를 들어 Condition 속성에  VersionNT>=500 값을 설정 합니다.
    VersionNT 는 OS 의 버젼에 따른 값으로 아래와 같습니다.
    사용자 삽입 이미지

    이 표를 볼때 500 이상이라는 값은 Windows 2000 이상의 버젼을 의미 하겠군요

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    .Net의 재배포, 시작조건
    http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vsintro7/html/vxwlkwalkthroughpassingdatatocustomaction.asp

    배포하려는 프로그램이 .Net의 특정 버젼을 필요로 한다면 개발자는 .Net을  같이 배포 하길 원할 것입니다.
    Microsoft Data Access Componets 를 이용하여 시작 조건을 검사 .Net 을 배포 할 수 있습니다.

    사용자 삽입 이미지

    셋업 프로젝트의 우클릭 메뉴 속성 창을 열어 보면 우측 하단에 Prerequisites 을 발견 할 수 있습니다.
    이는 셋업이 진행 되기 전에 필요한 MDAC 를 추가 하는 창으로거 필요한 컴포넌트에 체크를 하시면 됩니다.

    체크 박스 리스트 아래 쪽으로 컴포넌트를 다운로드 하는 방법에 대해서 지정할 수 있는데요.
    웹을 통해서, 로컬 경로를 통해서 등... 3가지 경우를 선택 할 수 있습니다.

    2번째에 위치한 "응용프로그램과 같은 로컬 경로"를 선택 하였습니다.

    이렇게 설정하신후 빌드를 하게 되면 셋업 파일 이외에 시작조건에 필요한 컴포넌트들이 포함된 폴더가 생성이 되는군요.

    사실 Vista에서 .Net 3.0 은 Windows 기능으로 포함 되어 있어.. 실행 파일 형식으로 제공되는 .Net의 설치는 할 수 없었습니다.
    설치를 시도 할경우 경고 메세지를 띄우게 되죠.
    빌드후 생성된 파일은 EnableDotNet 이라는 파일이군요. 이 파일은 실제적으로 닷넷을 설치 하는 것이 아니라.
    플렛폼에서 닷넷을 사용할 수 있도록.. 설치가 필요하면 설치를.. 혹은 기능의 추가를.. 해주나 봅니다.
    그래서!! Vista 에서 무리 없이 동작하는 군요.

    현재 MDAC 는 2.1 sp1 버젼까지 업데이트 되어 있군요.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    시작조건 검사

    http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vsintro7/html/vxwlkwalkthroughpassingdatatocustomaction.asp
    배포의 시작시에 특정 프로그램의 설치 여부를 확인 할 수 있다면, 이를 확인하여 프로그램을 배포할 수가 있습니다.
    WMP11 을 같이 배포 해야 했기에 이에 대해서 알아 보도록 하겠습니다.
    [보기][시작조건] 을 클릭 하면 시작 조건 창을 열 수 있습니다.
    사용자 삽입 이미지

    팝업 메뉴를 보면 파일, 레지스트리, 윈도우 인스톨러, 닷넷, 서비스 등의 시작 조건을 검사 할 수 있습니다.
    레지스트리 시작조건을 추가 해보면 [Search Target Machine]  [Luanch Conditions] 에 각각 레스스트리 탐색과, 시작 조건노드가 생성 됩니다.
    말그대로 레지스트리 탐색은 레지스트리내 특정 키 값을 할당하고 프로퍼티화 합니다.
    생성된 컨디션은 이 프로퍼티의 값을 비교 하여 특정 작업을 시행합니다.

    WMP11의 버전을 확인 하여 없을 경우 설치 하는 작업을 진행 해보면..

    사용자 삽입 이미지
    Root 의 vsdrrHKLM 은 HKEY_LOCAL_MACHINE 를 뜻한다.
    RegKey에 검색할 키 값을 채워준다.
    Value 에 레지스트리 이름을 준다.
    Property 는 외부로 노출되는 변수와 같은 개념으로 특정한 이름을 명명한다.
    사용자 삽입 이미지
    생선된 컨디션의 Condition 에 방금 생성한 레지스트리 탐색의 프로퍼티 값을 주고 값을 비교합니다.
    "11,0,5721,5145"는 필자가 넣은 값으로 WMP11의 XP버젼의 레지스트리 값입니다.
    위 조건을 만족하지 않는 경우에 Message 항목을 출력하고 InstallUrl의 경로를 실행합니다.
    InstallUrl에 필자는 상대 경로를 주었는데.. 위 폴더는 빌드 Release 에 포함되어 있습니다.
    CD 로 배포시에 이런 방법이 유용하고, 실제로 유효한 Web 주소를 주어도 해당 웹페이지를 실행 시켜 줍니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    파일 형식

    http://msdn.microsoft.com/library/kor/default.asp?url=/library/KOR/vsintro7/html/vxwlkwalkthroughpassingdatatocustomaction.asp

    배포 되는 실행파일에 연결되는 문서 형식을 지정하는 곳입니다.
    예를 들어 .hwp 파일을 클릭하면 한글이 실행되듯이..

    사용자 삽입 이미지
    우측에 [FileType on Target Marchine]의 우클릭 메뉴로 파일 타입을 생성 할 수 있습니다.
    좌측은 생성된 파일 타입의 프로퍼티 창입니다.
    Extension 란에 확장자를 넣어 주시면 되구요, 세미콜론(;)을 이용하여 여러개를 지정할 수 있습니다.

    참고 파일 형식은 설치된 실행 파일 하나에만 연결할 수 있습니다.
    두 개 이상의 실행 파일을 파일 형식과 연결하려면 먼저 각 실행 파일에 대한 조건을 지정하여 지정된 설치에 대해 하나만 설치되도록 해야 합니다.

    〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓〓
    마치며..

    제가 직접 해보면서 작성한 포스트라 순서가 순차적이지 않을 수가 있습니다. 이해를 ^^;;
    레지스트리 편집기에 대해선 알아보지 않았군요. 사용하진 않았지만 특별히 어려운 사항은 없으리라 생각합니다.
    포스트중 제가 잘못 알고 있거나 놓친 부분이 있다면 댓글을 남겨주시면 감사하겠습니다
    Posted by 나비:D
    :

    BLOG main image
    by 나비:D

    공지사항

    카테고리

    분류 전체보기 (278)
    Programming? (0)
    ---------------------------.. (0)
    나비의삽질 (5)
    Application (177)
    SQL (51)
    Web (27)
    etc. (14)
    Omnia (0)
    ---------------------------.. (0)

    최근에 올라온 글

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함

    달력

    «   2024/12   »
    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 31
    Total :
    Today : Yesterday :