블로그 이미지
Every unexpected event is a path to learning for you. blueasa

카테고리

분류 전체보기 (2797)
Unity3D (853)
Programming (479)
Python (8)
TinyXML (5)
STL (13)
D3D (3)
MFC (1)
C/C++ (54)
C++/CLI (45)
C# (251)
WinForm (6)
WPF (5)
Math (10)
A.I. (1)
Win32API (11)
Algorithm (3)
Design Pattern (7)
UML (1)
MaxScript (1)
FMOD (4)
FX Studio (1)
Lua (2)
Terrain (1)
Shader (3)
boost (2)
Xml (2)
JSON (4)
Etc (11)
Monad (1)
Html5 (4)
Qt (1)
Houdini (0)
Regex (14)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (61)
3DS Max (3)
Game (12)
Utility (68)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday

트리뷰 추가하기

treeView1.Nodes.Add("Main Server");             //노드 추가하기 0번째부터 시작!!

treeView1.Nodes[0].Nodes.Add("Main Server"); //0번째 노드에 자식노드 추가하기

 

트리뷰 삭제하기

treeView1.Nodes.RemoveAt(인덱스값_정수형);

 

하위 트리뷰까지 처음부터 활성화하기

treeView1.ExpandAll();

 

트리뷰 아이콘 넣기

 

ImageList myimageList = new ImageList();

myimageList.Images.Add(Image.FromFile(@"Clienticon_nateon.bmp"));//imageindex 0

myimageList.Images.Add(Image.FromFile(@"Clienticon_starc.bmp")); //imageindex 1

 

treeView1.ImageList = myimageList;

 

treeView1.Nodes.Add("Main Server");

treeView1.Nodes[0].ImageIndex = 1;   //트리뷰의 0번째의 이미지 설정

 

treeView1.Nodes[0].Nodes.Add("Node");

treeView1.ImageIndex = 0;            //트리뷰의 노드 전체의 이미지 설정

 



출처] [C#] 트리뷰(treeview) 추가(add),삭d제(remove), 아이콘(icon) 설정하기|작성자 한아랑

반응형
Posted by blueasa
, |
1) Key, Value Binding
    comboBox.DataSource = new BindingSource(Dictionary, null);

2) Key Binding
    comboBox.DataSource = new BindingSource(Dictionary.Keys, null);

3) Value Binding
    comboBox.DataSource = new BindingSource(Dictionary.Values, null);


반응형
Posted by blueasa
, |

C#에서는 C++에서 사용하던 memset, memcpy 등의 함수를 사용할 수 없다.

 

 

배열을 초기화 하기 위해서는 아래의 함수를 사용

Array.Clear(array, index, length);

 

public static void Clear (
   
Array
array,  // 포함된 요소를 지울 Array입니다.
    int index,     // 지울 요소 범위의 시작 인덱스입니다.
    int length    // 지울 요소의 개수입니다.
)

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

 

배열카피는 아래의 함수 이용

Array.Copy(SourceArray, SourceIndex, DestinationArray, DestinationIndex, Length);

 

public static void Copy (
    Array sourceArray,        // 복사할 데이터가 들어 있는 Array입니다.
    int sourceIndex,           // 복사가 시작되는 sourceArray의 인덱스를 나타내는 32비트 정수입니다.
    Array destinationArray, // 데이터를 받는 Array입니다.
    int destinationIndex,     // 저장이 시작되는 destinationArray의 인덱스를 나타내는 32비트 정수입니다.
    int length                    // 복사할 요소의 개수를 나타내는 32비트 정수입니다.
)

출처 : http://rockset76.blog.me/10078890919

반응형
Posted by blueasa
, |

public class BaseForm : Form
{
새로운 기능에 정의되는 멤버 변수 ;
새로운 기능에 정의되는 메서드();
}


실제 윈도우 폼을 생성하시고

public partial class Form1 : BaseForm
{

}
이렇게 하시면 됩니다.

그리고 BaseForm은 abstruct 걸면 디자이너가 안뜹니다.

BaseForm에 메서드같은경우 가상메서드로 선언해두시면

폼마다 오버라이드로 재정의해서 쓸수 있습니다. ^^;;


출처 : http://www.hoons.kr/Board.aspx?Name=QACSHAP&Mode=2&BoardIdx=20382&Key=Title&Value=%ec%83%81%ec%86%8d
반응형

'Programming > C#' 카테고리의 다른 글

Dictionary To ComboBox BindingSource  (0) 2010.09.27
배열 초기화 및 카피 - C ( memset , memcpy)  (0) 2010.09.15
interface(C# 참조)  (0) 2010.09.14
abstract(C# 참조)  (0) 2010.09.14
이벤트 만들기 (초보자)  (0) 2010.09.14
Posted by blueasa
, |

interface(C# 참조)

Programming/C# / 2010. 9. 14. 16:53

인터페이스에는 메서드, 대리자 또는 이벤트의 시그니처만 포함됩니다. 메서드는 다음 예제에서와 같이 인터페이스를 구현하는 클래스에서 구현됩니다.

      interface ISampleInterface
{
    void SampleMethod();
}

class ImplementationClass : ISampleInterface
{
    // Explicit interface member implementation: 
    void ISampleInterface.SampleMethod()
    {
        // Method implementation.
    }

    static void Main()
    {
        // Declare an interface instance.
        ISampleInterface obj = new ImplementationClass();

        // Call the member.
        obj.SampleMethod();
    }
}
설명

인터페이스는 네임스페이스 또는 클래스의 멤버가 될 수 있으며 다음 멤버의 시그니처를 포함할 수 있습니다.

인터페이스는 하나 이상의 기본 인터페이스에서 상속할 수 있습니다.

기본 형식 목록에 기본 클래스와 인터페이스가 있는 경우 기본 클래스가 목록의 처음에 있어야 합니다.

인터페이스를 구현하는 클래스는 해당 인터페이스의 멤버를 명시적으로 구현할 수 있습니다. 명시적으로 구현된 멤버는 클래스 인스턴스를 통해 액세스할 수 없고 인터페이스의 인스턴스를 통해서만 액세스할 수 있습니다. 예를 들면 다음과 같습니다.

명시적 인터페이스 구현에 대한 자세한 내용과 코드 예제는 명시적 인터페이스 구현(C# 프로그래밍 가이드)을 참조하십시오.

예제

다음 예제에서는 인터페이스 구현 방법을 보여 줍니다. 이 예제에서 IPoint 인터페이스에는 필드 값을 설정하고 가져오는 것을 담당하는 속성 선언이 있습니다. Point 클래스에는 속성 구현이 있습니다.

// keyword_interface_2.cs
// Interface implementation
using System;
interface IPoint
{
   // Property signatures:
   int x
   {
      get;
      set;
   }

   int y
   {
      get;
      set;
   }
}

class Point : IPoint
{
   // Fields:
   private int _x;
   private int _y;

   // Constructor:
   public Point(int x, int y)
   {
      _x = x;
      _y = y;
   }

   // Property implementation:
   public int x
   {
      get
      {
         return _x;
      }

      set
      {
         _x = value;
      }
   }

   public int y
   {
      get
      {
         return _y;
      }
      set
      {
         _y = value;
      }
   }
}

class MainClass
{
   static void PrintPoint(IPoint p)
   {
      Console.WriteLine("x={0}, y={1}", p.x, p.y);
   }

   static void Main()
   {
      Point p = new Point(2, 3);
      Console.Write("My Point: ");
      PrintPoint(p);
   }
}

출력

My Point: x=2, y=3
 
출처 : http://msdn.microsoft.com/ko-kr/library/87d83y5b(v=VS.80).aspx
반응형
Posted by blueasa
, |

abstract(C# 참조)

Programming/C# / 2010. 9. 14. 16:50

abstract 한정자는 클래스, 메서드, 속성, 인덱서 및 이벤트에 사용할 수 있습니다. 클래스 선언에 abstract 한정자를 사용하면 해당 클래스가 다른 클래스의 기본 클래스로만 사용됨을 나타냅니다. abstract로 표시된 멤버나 abstract 클래스에 포함된 멤버는 해당 abstract 클래스에서 파생되는 클래스에 의해 구현되어야 합니다.

이 예제에서 Square 클래스는 ShapesClass에서 파생되므로 Area의 구현을 제공해야 합니다.

      abstract class ShapesClass
{
    abstract public int Area();
}
class Square : ShapesClass
{
    int x, y;
    // Not providing an Area method results
    // in a compile-time error.
    public override int Area()
    {
        return x * y;
    }
}

추상 클래스에 대한 자세한 내용은 추상 및 봉인 클래스와 클래스 멤버(C# 프로그래밍 가이드)를 참조하십시오.

설명

추상 클래스에는 다음과 같은 특징이 있습니다.

  • 추상 클래스는 인스턴스화할 수 없습니다.

  • 추상 클래스에는 추상 메서드 및 접근자가 포함될 수 있습니다.

  • 추상 클래스를 sealed(C# 참조) 한정자로 한정할 수 없습니다. 즉, 이 클래스는 상속되지 않습니다.

  • 추상 클래스에서 파생된 비 추상 클래스에는 상속된 모든 추상 메서드 및 접근자의 실제 구현이 포함되어야 합니다.

메서드 또는 속성 선언에 abstract 한정자를 사용하면 해당 메서드 또는 속성에 구현이 포함되지 않음을 나타냅니다.

추상 메서드에는 다음과 같은 특징이 있습니다.

  • 추상 메서드는 암시적으로 가상 메서드입니다.

  • 추상 메서드 선언은 추상 클래스에서만 허용됩니다.

  • 추상 메서드 선언에서는 실제 구현을 제공하지 않기 때문에 메서드 본문이 없습니다. 메서드 선언은 단순히 세미콜론으로 끝나며 시그니처 뒤에 중괄호({ })가 없습니다. 예를 들면 다음과 같습니다.

    public abstract void MyMethod();
    
  • 구현은 비추상 클래스의 멤버인 재정의 메서드 override(C# 참조)에 의해 제공됩니다.

  • 추상 메서드 선언에 static 또는 virtual 한정자를 사용하면 오류가 발생합니다.

추상 속성은 추상 메서드와 비슷하게 작동하지만 선언 및 호출 구문에 차이가 있습니다.

  • 정적 속성에는 abstract 한정자를 사용할 수 없습니다.

  • 상속된 추상 속성은 override 한정자를 사용하는 속성 선언을 포함하는 방법을 통해 파생 클래스에서 재정의될 수 있습니다.

추상 클래스는 모든 인터페이스 멤버에 대한 구현을 제공해야 합니다.

인터페이스를 구현하는 추상 클래스는 인터페이스 메서드를 추상 메서드에 매핑할 수도 있습니다. 예를 들면 다음과 같습니다.

interface I 
{
    void M();
}
abstract class C: I 
{
    public abstract void M();
}
예제

다음 예제에서 DerivedClass 클래스는 추상 클래스 BaseClass에서 파생되었습니다. 이 추상 클래스에는 추상 메서드 AbstractMethod와 두 개의 추상 속성 XY가 포함되어 있습니다.

// abstract_keyword.cs
// Abstract Classes
using System;
abstract class BaseClass   // Abstract class
{
    protected int _x = 100;
    protected int _y = 150;
    public abstract void AbstractMethod();   // Abstract method
    public abstract int X    { get; }
    public abstract int Y    { get; }
}

class DerivedClass : BaseClass
{
    public override void AbstractMethod()
    {
        _x++;
        _y++;
    }

    public override int X   // overriding property
    {
        get
        {
            return _x + 10;
        }
    }

    public override int Y   // overriding property
    {
        get
        {
            return _y + 10;
        }
    }

    static void Main()
    {
        DerivedClass o = new DerivedClass();
        o.AbstractMethod();
        Console.WriteLine("x = {0}, y = {1}", o.X, o.Y);
    }
}

출력

x = 111, y = 161
설명

앞의 예제에서 다음과 같은 문으로 추상 클래스를 인스턴스화하려고 하면

BaseClass bc = new BaseClass();   // Error

컴파일러에서 추상 클래스 'BaseClass'의 인스턴스를 만들 수 없다는 오류가 발생합니다.


출처 : http://msdn.microsoft.com/ko-kr/library/sf985hc5(VS.80).aspx

반응형

'Programming > C#' 카테고리의 다른 글

C#에서 다중 상속 비슷한 기능이 필요할 때..  (0) 2010.09.15
interface(C# 참조)  (0) 2010.09.14
이벤트 만들기 (초보자)  (0) 2010.09.14
STL map == C# Dictionary  (0) 2010.09.13
자동 업데이트 프로그램  (1) 2010.09.10
Posted by blueasa
, |

내개만든 객체를 다른 객체에 이벤트를 사용하게 하기 위해서는 6가지로 나누어 볼수 있읍니다..

 

 이벤트를 발생시키는 객체서는4가지입니다

 이중 1,2는 매개 변수가 없을때 기본생성자를 사용함으로 생락 가능

 

 구독에서는 5,6번으로 폼 이벤트 사용할때 주로 사용을 많이 해봤을것으로 압니다

 

 

 이해 안되면  매개 변수가 있으면 구독 4가지,없으면 2가지 그냥 외우면 됩니다..

그리고 나만의 예제 하나 만들어 보면 모든데 이해 될것으로 생각 됩니다.

 

  

이벤트 사용하기

1.    새로운 데이터 타입 생성 [생락가능]

매개 변수가 없는 이벤트를 생성시 기본 생성자 public delegate void EventHandler(object sender, EventArgs e)를 사용하면 됨으로 생략 ,여기서는 minEventHandler라는 새로은 데이터 타입

public delegate void minEventHandler(object sender,minEventTestArgs e);//델리게이트 선언

 

2. 이벤트 매개 변수를 위한 객체 생성 [생락가능]

     1번의 두 번째 매개 변수에 사용하기 위한 객체로서 매개 변수로 넘길 데이터가 없으면 그냥 EventArg를 사용해도 됨.

public class minEventTestArgs : EventArgs

        {

        public DateTime m_Timer{get;set;}

        public minEventTestArgs(DateTime Timer)

        {

            this.m_Timer = Timer;

        }

  

3. 이벤트 정의 a 1번의 인터페이스

public event minEventHandler minEventTest;  // 이벤트 정의

 

4. 이벤트 발생

public void OnMinEventTest(minEventTestArgs e)  // 이벤트 발생 구독자에게 통보

        {

            if (minEventTest != null)

                minEventTest(this, e);

 }

 

 

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

5. 이벤트 핸들러 메소드

minTimer min;  //       

  private void Form1_Load(object sender, EventArgs e)

  {

            min = new minTimer();

            min.minEventTest += new minEventHandler(min_minEventTest);

 }

 

6. 이벤트 구독

Void min_minEventTest(object sender, minEventTestArgs e)

       {

            textBox1.Text = e.m_Timer.ToLongTimeString();

       }

 

 

=========================================================================================== 

여기서 부터 는  예제

1 minTimer라는 객체를 하나 만들고

이 객체는 1초마다 현재 시간을 알려주는 이벤트를 생성한는일을 함.

2 폼 에서는 minTimer객체 인터페이스를 만들고 이벤트를 구독한다

 

using System;

namespace WindowsFormsApplication1

{  

    public delegate void minEventHandler(object sender,minEventTestArgs e); //새로운 객체

    public class minTimer

    {

        System.Windows.Forms.Timer timer;               //시간을 읽어오는 타이머

      

        public event minEventHandler minEventTest;         //[2] 이벤트 정의

        public void OnMinEventTest(minEventTestArgs e)  //[3] 이벤트 발생 구독자에게 통보

        {

            if (minEventTest != null)

                minEventTest(this, e);

        }

 

        //

        public minTimer()

        {

            timer = new System.Windows.Forms.Timer();

            timer.Interval = 1000;

            timer.Enabled = true;

            timer.Start();

            timer.Tick += new EventHandler(timer_Tick);

        }

 

        //

        void timer_Tick(object sender, EventArgs e)

        {

            DateTime curTime = DateTime.Now;

            minEventTestArgs args = new minEventTestArgs(curTime);

            OnMinEventTest(args);

        }

    }

 

    // [1] 이벤트 인자를 위한 객체

    public class minEventTestArgs : EventArgs

    {

        public DateTime m_Timer{get;set;}

        public minEventTestArgs(DateTime Timer)

        {

            this.m_Timer = Timer;

        }

    }

}

 

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

폼에서

minTimer min; //       

        private void Form1_Load(object sender, EventArgs e)

        {

            min = new minTimer();

            min.minEventTest += new EventHandler(min_minEventTest);

         }

 

        void min_minEventTest(object sender, minEventTestArgs e)

        {

            textBox1.Text = e.m_Timer.ToLongTimeString();

        }

 

 

 

잘못된부분 있으면 정보 공유 차원에서라도

답글 부탁 합니다,


출처 : http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNO=8&no=1831&page=4

반응형

'Programming > C#' 카테고리의 다른 글

interface(C# 참조)  (0) 2010.09.14
abstract(C# 참조)  (0) 2010.09.14
STL map == C# Dictionary  (0) 2010.09.13
자동 업데이트 프로그램  (1) 2010.09.10
간단한 자동 업데이트 프로그램 구현  (0) 2010.09.10
Posted by blueasa
, |

예전 C++에서 사용한 STL의 map을 사용하고 싶었다..
  구글형한테 열심히 물어본결과 C#에는
Dictionary라는 map과 일치하는 라이브러리가 존재한단다..

  사용해보니 Key값과 Value값을 이용하는 아주 전형적인
map이다.
  내부 알고리즘은 안뜯어봐도 거기서 거기일듯 하다..
 
  한가지 다른건 STL map에서는 Key값을 모를때
iteraterfor문을 이용한 순차접근을 했다는것이고..
 
Dictionary에서는 KeyValuePair  foreach문을 이용한 순차접근을 해야한다는 것이다..

  다음은
DictionaryKey값을 모를때 순차접근을 위한 하나의 예이다..

  Dictionary<string,int> _DicSample;
  _DicSample= new Dictionary<string,int>();
  _DicSample.Add( "나이", 32 );
  _DicSample.Add( "키", 180 );

  foreach (KeyValuePair<string, int> each in _Dic )
  {
     string K = each.Key;
     int V = each.Value;
  }
  // 디버깅 해보면 foreach문이 총 2번돌고 K와 V값에는 "나이", 32 다음 "키" 180이 순차적으로
 들어간다.

  Key값을 알고있을때 Value값 찾는건 map과 동일한
  int age = _DicSample["나이"];
 // age에 32가 들어갈것이다.


출처 : http://incoinco.blog.me/70046275252

반응형
Posted by blueasa
, |

變/Portfolio "

사용자 삽입 이미지
 프로그램의 자동 업데이트 기능은 인터넷 보급율이 타의 추종을 불허하는 국내에서는 필수적인 요소가 되어 버렸다. V3, 알약 같은 백신은 물론이고, 곰플레이어 등 사용자 Application에도 모두 포함되어 있다.

2년 전쯤에 간단한 기능의 자동 업데이트 프로그램을 만든 적 있었는데; 지인들도 찾지 않는 내 유령 블로그에서 (사실 나도 거의 하지 않는다..) 가장 인기 게시물이었다; 그 프로그램과 관련해 질문도 많이 받고, 링크 복구 요청도 많이 받아... 마지막으로 다시 올린다.

아래 DLL과 자동 업데이트 프로그램은 Microsoft Visual Studio.NET 2005를 이용해 C#으로 개발하였으며, 사용한 모든 함수는 Microsoft .NET Framework 2.0에 포함되어 있다.

 일단 자동 업데이트 프로그램의 구성은 매우 심플하다.
(1) 프로그램 버전 체크를 위한 DLL과 Configuration 파일
- UpdateChecker.dll
- update.ini

(2) 프로그램 업데이트를 위한 자동 업데이트 프로그램과 Configuration 파일
- SmartUpdater.exe
- start.ini

 프로그램의 자동 업데이트 로직은 간단하다. (물론, 복잡하게 만들려면 복잡하게도 만들 수 있으나, 그건 각자의 특수성에 맞게 고민해야할 문제.)

STEP 1. 프로그램을 실행한다.

STEP 2. 업데이트 서버에 연결하여, 현재 프로그램의 버전과 업데이트 서버가 가지고 있는 업데이트 버전과 비교해서 최신 업데이트가 있으면, 자동 업데이트 프로그램을 실행하고, 현재 프로그램을 종료한다.

 물론, 간혹 이런 경우도 있다. 자동 업데이트 프로그램을 업데이트해야 되는 경우; 그 때는 실행하기 전 자동 업데이트 프로그램의 파일명을 rename해서 변경한 후, 실행하면 된다; 그리고 프로그램 업데이트 후, rename된 자동 업데이트 프로그램을 삭제하면 끝;

(1) 프로그램 버전 체크를 위한 DLL의 함수들
사용자 삽입 이미지

DLL의 함수는 달랑 3개다. (하나는 기본 생성자)

ReadConfigFile은 업데이트 서버의 주소와 버전 정보가 담긴 파일명이 저장된 Configuration 파일(update.ini)을 읽는다. 말이 거창하게 Configuration 파일이지, 실제로 파일을 열어보면 달랑 2줄의 내용이 들어있다.

라인 1: http://www.nohungry.net/UpdateServer/
라인 2: version.txt

라인 1은 Update 서버의 URL이고, (반드시 끝에 /를 붙여줘야 한다.)
라인 2는 버전 정보가 저장된 파일명이다.

IsNewUpdateExists는 인자(parameter)로 현재 프로그램의 버전과 업데이트 서버의 버전 정보 파일(http://www.nohungry.net/UpdateServer/version.txt)에 저장된 버전을 비교하여, 현재 프로그램의 버전이 구버전인 경우, true를 반환하고 아니면 false를 반환한다.

GetLastError는 UpdateCheck 시 발생한 에러 메시지를 반환한다. 예를 들면, 업데이트 서버를 연결할 수 없다거나, 새로운 업데이트 파일이 없다는 내용을 반환한다.

(2) 프로그램 업데이트를 위한 자동 업데이트 프로그램
 자동 업데이트 프로그램은 상기 업데이트 체크 DLL에서 새로운 업데이트가 존재할 경우, 호출되는 프로그램이다. 이 프로그램은 업데이트 서버에서 업데이트 파일들을 다운로드 받고, 설치하는 역할을 한다.

 자동 업데이트 프로그램의 Configuration 파일(start.ini) 역시 DLL과 마찬가지로 단순한 정보를 담고 있다.
라인 1: http://www.nohungry.net/UpdateServer/
라인 2: file_list.txt
라인 3: MyNewProgram.exe

라인 1은 업데이트 서버의 URL
라인 2는 업데이트 파일 목록이 저장된 파일명
라인 3은 업데이트 완료 후, 실행할 파일명

사실 업데이트 서버 URL이나 이런 것들은 보안을 생각한다면, 위에 예처럼 무식하게 텍스트 파일로 쓰는 것은 좋지 않다. 이러한 것들은 바이너리로 저장한다거나 아니면 Configuration 파일이 아닌 레지스트리에 쓴다거나 아니면 기타 각자의 아이디어를 이용하도록 하자.

앞서 언급한 DLL과 자동 업데이트 프로그램을 이용해, 내 프로그램에 자동 업데이트 기능을 구현해보자고 한다면, 다음과 같이 할 수 있다. (예외 처리나 기타 복잡한 내용은 빼고, 심플한 코드)

사용자 삽입 이미지

이 게시물에 언급한 모든 내용 및 소스 코드는 아래 링크에서 다운로드 가능합니다.
http://www.nohungry.net/Data/SmartUpdateChecker.zip

관련 게시물 주소
http://www.nohungry.net/tt1/34

이 소스를 그대로 쓰시든지 수정해서 상용으로 쓰시든지 모든 것이 자유입니다. 단, 수정 요청은 받지 않습니다.
또한, 이 소스를 이용해 발생한 어떠한 문제도 책임지지 않습니다.

끝으로 이 게시물의 소스를 다운로드 받아가시거나, 게시물 내용을 블로그에 퍼가시더라도... 댓글이나 출처는 꼭 남겨주세요!


출처 : http://www.nohungry.net/tt1/category/24
반응형
Posted by blueasa
, |

우리는 근래에 자동 업데이트 프로그램에 둘러쌓여 산다.
Windows XP는 시도 때도 없이.. 새로운 패치가 나왔다고 자동 업데이트 하겠냐고 물어보고.-ㅁ-
카트라이더에 로그인 하면.. 알아서 새로운 버젼이 나왔다고 설치한다.

프로그램 개발자에게 있어 새로운 버젼이 나왔는데, 이걸 사용자에게 어떻게 전해주느냐는 중요한 문제다. 사실 사용자에게 새버젼이 나왔을 때 마다 전화해서 알려줄 수도 없으니..

자동 업데이트 프로그램.. 간지나는 디자인이 어디서 본 듯 하다.



내가 맹근 자동 업데이트 프로그램의 흐름은 심플하다.
프로그램을 실행시키면, 프로그램은 업그레이드 서버에 연결하고, 프로그램 내에 이식된 업데이트 체커는 프로그램의 현재 버젼을 읽어와 업그레이드 서버의 업그레이드 정보 파일(단순한 txt 파일)에서 읽은 버젼과 비교한다.

프로그램의 버젼 정보



비교한 결과, 현재 버젼보다 새로운 버젼이 존재하면.. 자동 업데이트 프로그램을 호출해 업그레이드 서버로부터 최신 파일들을 다운 받아 설치한다.

내가 구현한 자동 업데이트 프로그램의 스펙 및 개략적인 소개를 하면 다음과 같다.
(1) SmartUpdater.exe - C#으로 구현했으며, .NET Framework 2.0이 설치되어 있어야 돌아간다. (소스는 공개하지 않음.)
(2) UpdateCheck.h & UpdateCheck.cpp - 사실 이 소스는 내가 구현한 것이 아니라,  CodeProject란 곳의 Alexander Bischofberger란 아저씨가 구현한 소스를 내 입 맛에 맡게 약간의 수정을 거쳤다.
(3) UpdateChecker.exe - 앞 서 언급한 (1)과 (2)를 이용해 만든 예제 프로그램이다. (소스도 공개한다.)



UpdateCheck.h 파일을 열면 위 그림과 같다.

UpdateCheck.h


수정할 부분은 대략 IDS_UPDATE 부터 IDS_UPDATE_NO 정도까지가 되겠다.
IDS_UPDATE는 업그레이드 정보가 담긴 파일의 URL이다. 이 파일의 형식은 다음과 같다.


앞에 3과 4는은 Major Version과 Minor Version이다. 그러니까 내 프로그램의 버젼이 1.0.0.1 이라면 앞의 1과 0이 Major Version과 Minor Version이라 할 수 있다. 그리고 젤 마지막의 URL은 원래 원저작자는 업데이트 페이지로 연결하도록 구현하였는데, 난 그냥 업데이트 프로그램을 로딩시켜서 설치하도록 하였기 때문에, 마지막 URL은 의미가 없다. 그리고 각 항목의 구분자(delim)는 "|(\ 위에 있는 녀석)" 이다.

그 아래 IDS_UPDATE_AVAILABLE은 새로운 버젼을 찾았을 경우, 설치하겠냐고 묻는 문구이다. 그 이하는 읽어보면 대충 감이 올 것이다. (입맛에 맞게 바꾸도록 하자.)

아, 그리고 참고로 #include <wininet.h> 하면 링크 에러가 뜰 것이다-ㅁ-.. "wininet.lib version.lib" 녀석들을 참조하도록 해야된다.

UpdateCheck 사용


그리고, 실제 사용은.. MyProgramApp 내에 InitInstance() 함수 안에서 위의 내용을 써주면 된다. 이 때 _T("SmartUpdater.exe")는 내가 개발한 자동 업데이트 프로그램(업데이트를 위한 웹 서버에서 Update File List를 읽어와 Update File들을 Local PC로 다운로드 하는 역할을 함.)을 호출하는 부분이므로, 각자가 구현한 자동 업데이트 프로그램을 추가해주면 된다.

어떻게 자동 업데이트 프로그램을 구현하였는지는.. 다음 문서에서 자세히 소개하도록 할 예정이다. (전체 소스를 공개하지는 않지만.. 핵심 부분은 알 수 있다.)

모든 소스 코드를 공개하였습니다. 수정 및 재배포도 모두 허용합니다. 대신, 수정 요청이나 디버깅 요청은 사절입니다.

다운로드 : http://www.nohungry.net/Data/AutoUpdateChecker.zip
참조: http://www.codeproject.com/cpp/updatecheck.asp


출처 : http://www.nohungry.net/tt1/34
반응형
Posted by blueasa
, |