'2010/03'에 해당되는 글 33건

  1. 2010.03.25 AS, IS
  2. 2010.03.25 Catch(Exception)
  3. 2010.03.25 Delegate
  4. 2010.03.24 Foreach문
  5. 2010.03.24 사칙연산 프로그램
  6. 2010.03.24 MFC 시험
  7. 2010.03.24 COM시험 (컴포넌트 이용해서 채팅하기)
  8. 2010.03.15 컴포넌트 생성및 접근
  9. 2010.03.15 Registry
  10. 2010.03.13 COM이론2장
2010. 3. 25. 20:25

            is  - 형변환 가능 여부를 bool로 반환해준다. 형변환 가능하면 true를 반환해준다.
예제 

            if ((man is Teacher) || (man is TeacherStu))
            {
                return false;
            }

사람이 선생님 또는 공부하는선생님이면 false를 반환해준다.


예제  

    
     as - 형변환 가능 여부를 확인하고 가능하면 형변환 시켜준다. 형변환이 불가능하면 Null을 반환해준다.


                  Man a = mem as Man;

                if (a != null)
                {
                    if (a.Name == _name)
                        return cnt;
                }

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

Delegate-2  (0) 2010.03.27
직렬화  (0) 2010.03.27
Catch(Exception)  (0) 2010.03.25
Delegate  (0) 2010.03.25
Foreach문  (0) 2010.03.24
Posted by 아몰라
2010. 3. 25. 19:57

try
{
        SB sb = new SB();
}
catch(Exception e)
{
        Console.WriteLine(e.Message);
}
어떠한 에러가 날라오는지 확인할수 있다.

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

직렬화  (0) 2010.03.27
AS, IS  (0) 2010.03.25
Delegate  (0) 2010.03.25
Foreach문  (0) 2010.03.24
사칙연산 프로그램  (0) 2010.03.24
Posted by 아몰라
2010. 3. 25. 10:47

1. 개념

 만약 어떤 기능을 실행하는 메소드를 호출할 필요가 있을때, 그냥 직접적으로 호출하는 형식입니다.

 델리게이트는 호출하는코드랑 호출되는메서드 사이에 있다고 생각하면 됩니다.

 

어떤 메소드를 호출한다고할때.

델리게이트 사용       : 메소드호출 ---> 델리게이트 ---> 호출당하는 메소드

일반적인메소드호출 : 메소드호출 ---> 호출당하는 메소드

 

즉. 메소트호출쪽은 호출되는메소드를 직접 부르는 것이 아니고 델리게이트를 대신 부르게 됩니다.

 

이처럼 중간자(대리자)역활을 합니다.

 

2. 왜 사용하는지

한마디로 유연성입니다.

저도 첨에책으로만 볼땐 그래서 머! 걍호출하면 되지 웨 써 복잡하게라고 생각했었습니다.

예를들어 폼위에 버튼을 올려놓고 클릭을 하게 되면 클릭이벤트로 가게되죠?

이건 마소에서 처음 .net을 개발할때 버튼콘트롤 소스하고 버튼클릭이벤트메소드(예:button1_Click)

를 델리게이트로 연결했기 때문에 우리가 볼땐 콘트롤을 누르면 이벤트메소드로 가는것처럼 보이는겁니다.

뒤에서는 델리게이트가 중간에 연결을 해주고 있죠!

좀이해가 안가시죠. 그럼 어디에 사용하는지 한번 보죠.

 

3. 어디에 사용하는지

이걸 응용하자면 엄청 많을 것 같은데..

1..한번에 10개의 매소드를 실행하고 싶을때.

    10개의 메소드를 전부 호출하는 것이 아니고.

    델리게이트를 걸어서 델리게이트를 한번호출합니다.

  

2..비동기처리에 사용합니다.

    예를들어 어떤 이벤트가 발생되서 실행되는

    A라는 메소드가 있는데 이놈은 한번 실행하면 최소 10분이상걸리는 놈입니다.]

    보통 델리게이트를 사용하지 않았을 경우 이놈이 끝날때까지 기다린후,다른 처리를 하게되는데.

    델리게이트걸어 비동기화 시켜주게되면 일단 실행이 되고,

    실행이 끝나던말든 다음처리를 할수 있습니다.

    이걸,멀티캐스팅이라고 하나요.

 

  ↓비동기처리의 예  

 using System;

delegate void ShowMessageDelegate(string msg);

class Callable {
  internal void ConcreteShowMessage(string msg) {
    System.Threading.Thread.Sleep(5 * 1000);
    Console.WriteLine(msg);
  }
}

class Caller {
  internal ShowMessageDelegate ShowMessage;

  internal IAsyncResult CallDelegate() {
 
    IAsyncResult ret
        = ShowMessage.BeginInvoke("hello, from delegate!",
            new AsyncCallback(Callback), ShowMessage);
    return ret;
  }

  internal void Callback(IAsyncResult ar) {
    ShowMessageDelegate usedDelegate
        = (ShowMessageDelegate)ar.AsyncState;
    usedDelegate.EndInvoke(ar);
  }
}

class App {
  static void Main() {
    Callable callable = new Callable();
    Caller caller = new Caller();

    caller.ShowMessage
        = new ShowMessageDelegate(callable.ConcreteShowMessage);

    IAsyncResult ar = caller.CallDelegate();

    while(!ar.IsCompleted) {
      System.Threading.Thread.Sleep(500);
      Console.Write(".");
    }
    Console.WriteLine("Done.");
  }
}



출처 : 네이버 아이디: dgnom878

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

직렬화  (0) 2010.03.27
AS, IS  (0) 2010.03.25
Catch(Exception)  (0) 2010.03.25
Foreach문  (0) 2010.03.24
사칙연산 프로그램  (0) 2010.03.24
Posted by 아몰라
2010. 3. 24. 16:46
Foreach

배열과 같은 컬렉션(컨테이너)에 있는 각 요소에대해 특정한 구문을 반복
배열, System.Collenctions, IEnumerable, System.Collections.Generic, IEnumerable<T>


ArrayList list;

private static void ExamForeach()        
            
            foreach (Object o  in list) 
            {
                Console.WriteLine(o.Tostring()); //리스트안에 모든 객체들의 Tostring 함수가 실행된다.
            }
        }

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

직렬화  (0) 2010.03.27
AS, IS  (0) 2010.03.25
Catch(Exception)  (0) 2010.03.25
Delegate  (0) 2010.03.25
사칙연산 프로그램  (0) 2010.03.24
Posted by 아몰라
2010. 3. 24. 16:03

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
           
            Calculator cal = new Calculator();

            Console.WriteLine("수를입력하시오");
            int a = int.Parse(Console.ReadLine());

 //Console.ReadLine은 문자열을 읽어오기때문에 int의 속성에 있는 함수를 통해 형 변환을 시켜준다. 그리고 변수에 대입해준다.

            Console.WriteLine("수를입력하시오");
            int b = int.Parse(Console.ReadLine());

            Console.WriteLine("더하기는~{0}",cal.Add(a, b));
            Console.WriteLine("빼기는~{0}",cal.Sub(a, b));
            Console.WriteLine("나누기는~{0}", cal.Div(a, b));
            Console.WriteLine("곱하기는~{0}", cal.Mul(a, b));
         }
    }
}


namespace test
{
    class Calculator
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
        public int Sub(int a, int b)
        {
            return a - b;
        }
        public int Div(int a, int b)
        {
            return a / b;
        }
        public int Mul(int a, int b)
        {
            return a * b;
        }
    }
}

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

직렬화  (0) 2010.03.27
AS, IS  (0) 2010.03.25
Catch(Exception)  (0) 2010.03.25
Delegate  (0) 2010.03.25
Foreach문  (0) 2010.03.24
Posted by 아몰라
2010. 3. 24. 15:09

'API & MFC > MFC & COM' 카테고리의 다른 글

멀티미디어 Dshow 시험  (0) 2010.03.28
COM시험 (컴포넌트 이용해서 채팅하기)  (0) 2010.03.24
컴포넌트 생성및 접근  (0) 2010.03.15
Registry  (0) 2010.03.15
COM이론2장  (0) 2010.03.13
Posted by 아몰라
                                                                       컴포넌트
 
 
                                                                       클라이언트

'API & MFC > MFC & COM' 카테고리의 다른 글

멀티미디어 Dshow 시험  (0) 2010.03.28
MFC 시험  (0) 2010.03.24
컴포넌트 생성및 접근  (0) 2010.03.15
Registry  (0) 2010.03.15
COM이론2장  (0) 2010.03.13
Posted by 아몰라

DllGetclassobject을 호출해서 직접 객체를 만듬

팩토리를 통해서 간접적으로 객체를 만듬.


                                                                  동작원리


                                                                       예제

'API & MFC > MFC & COM' 카테고리의 다른 글

MFC 시험  (0) 2010.03.24
COM시험 (컴포넌트 이용해서 채팅하기)  (0) 2010.03.24
Registry  (0) 2010.03.15
COM이론2장  (0) 2010.03.13
COM이론(Component Object Model)  (0) 2010.03.12
Posted by 아몰라
2010. 3. 15. 10:49

Regsvr32 유틸리티 - 이 유틸리티를 이용하여 DLL을 레지스트리에 등록한다.


등록 : DLL의 export된 DllRegisterServer함수를 수행한다.

해제 : DLL의 export된 DllUnregisterServer함수를 수행한다.

 
실행 방법 -  regsvr32 “DLL파일경로”
                 Option : DLL 해제 : /u

Com Library

COM Library를 사용하여 반복되는 일련의 과정을 편리하게 사용가능(등록,객체생성,interface 포인터획득)

함수 앞에 Co가 붙으면 Com Library이다.

COM Library의 초기화
 HRESULT CoInitialize( LPVOID pvReserved  //Reserved; must be NULL );

COM Library의 해제
 void CoUninitialize( );


STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, LPVOID * ppv);
CLSID를 넘겨주면 그 CLSID와 연결된 ClassFactory를 리턴한다


클라이언트에서 서버의 IClassFactory의 인터페이스의 포인터를 얻을 수 있다.
내부적으로 DllGetClassObject를 호출한다.

IUnknown* pIUnknown=NULL;
 HRESULT hr = CoGetClassObject(
  CLSID_COMPONENT,    //clsid
  CLSCTX_INPROC_SERVER,          //context
  NULL,    //this machine
  IID_IUnknown,   //interface id
  (LPVOID*) &pIUnknown);  //interface pointer


첫번째 : 생성하고자 하는 CoClass의 CLSID
두번째 : COM 서버를 IN서버로 할것인지 OUT서버로 할 것인지
세번째 : NULL
네번째 :  IID_IUnknown을 얻어오겠다.
마지막 : 매개변수로 넣어준 포인터에 이 CoClass를 생성하는데 사용되는 클래스 팩토리의 인터페이스 포인터를 넘겨 받는다.


'API & MFC > MFC & COM' 카테고리의 다른 글

COM시험 (컴포넌트 이용해서 채팅하기)  (0) 2010.03.24
컴포넌트 생성및 접근  (0) 2010.03.15
COM이론2장  (0) 2010.03.13
COM이론(Component Object Model)  (0) 2010.03.12
메모리 비트맵  (0) 2010.03.11
Posted by 아몰라
2010. 3. 13. 10:59
Iunknown Interface
 
인터페이스 중에서 최상위 인터페이스이며, 모든 COM 컴포넌트가 상속 받아야 할 Interface

//unknwn.h 파일에 선언됨

interface IUnknown

{

  virtual HRESULT __stdcall QueryInterface(REFIID riid, void **ppv)=0; //Interface 얻어오기 !!

  virtual ULONG  __stdcall AddRef()=0; //개체 참조 카운트 증가 !!

  virtual ULONG  __stdcall Release()=0;  // 개체 참조 카운트 감소 !!

}


// __stdcall : 지역변수를 호출된쪽에서 소거!
// __declspec : 지역변수를 호출하는쪽에서 소거!
 
QueryInterface : Component가 구현하고 있는 인터페이스의 포인터를 얻어오는 역할 수행, 클라이언트 입장에서 객체에 접근하기 위한 중요한 기능
AddRef : 메모리 상의 Component 객체의 참조 카운터를 증가 시킴
Release : 메모리 상의 Component 객체의 참조 카운터를 감소 시킴 


User define Interface 

- 개발자에 의해 구성되는 Component에서 상속 받아 재 정의 할 추상기본 클래스


- 최상위 인터페이스인 IUnknown을 반드시 상속 받아야 함

 

- C++에서는 다중 상속이 가능(MFC 에서는 불가)

 

interface ICalcu : IUnknown

{

           virtual int __stdcall Sum() = 0;

};

 

  

 

GUID - 고유한 컴포넌트임을 알려주는 키값 (Guigen을 이용해 생성한다)

 CLSID - CoClass의 GUID ,  IID - 인터페이스의 GUID 

  

typedef GUID IID;

typedef GUID CLSID;

 

 

#define REFIID              const IID &

#define REFCLSID         const CLSID &

 


 

IID CLSID GUID를 재정의 하여 사용하는 것 뿐이다

 
  

// {7D1DA4D3-2DD8-4317-937D-157BF19DE48C}

static const IID IID_ISetVal =

{ 0x7d1da4d3, 0x2dd8, 0x4317, { 0x93, 0x7d, 0x15, 0x7b, 0xf1, 0x9d, 0xe4, 0x8c } };

 

   

// {1BA9514E-9303-4c4d-948A-D1EAA0932A82}

static const IID IID_ICalcu =

{ 0x1ba9514e, 0x9303, 0x4c4d, { 0x94, 0x8a, 0xd1, 0xea, 0xa0, 0x93, 0x2a, 0x82 } };

 

  

IID 값은 IUnknown QueryInterface 구현부에서 다수의   사용자 인터페이스를 구별하여 올바른 포인터 값을 반환할       수 있도록 한다.

 

 

 

 Interface Inheritance

 

class CInsideCom : public ISetVal, ICalcu

{

 public:

 

 

Interface는 구성하고자 하는 Component 클래스에 의해 상속될 수 있다.

Component 클래스는 상속된 Interface Pure Virtual Function에 대하여 그 구현을 제공 해야 한다.

•이렇게 상속된 Interface는 객체 생성시 Virtual Function Table이 구성된다.

  

 

//IUnknown Interface

 

  virtual HRESULT __stdcall QueryInterface(REFIID riid, void **ppv);

  virtual ULONG  __stdcall AddRef();

  virtual ULONG  __stdcall Release();

 

 

 //ISetVal Interface

 

  virtual void __stdcall SetXY(int, int);

  

   //ICalcu Interface

 

  virtual int __stdcall Sum();

 

 

ISetVal ICalcu 인터페이스를 상속 받았고, 순수가상함수에 대하여 재정의 하기 위한

  

 CInsideCom클래스는 아래와 같이 인터페이스(가상함수테이블)가 구성되있겠다.

             QurryInterface, AddRef, ,Relese, Sum, ISetVal

 Qurrrinterface 를 통해서만 외부와 통신 할 수 있다.

- Qurryinterface 에게 IID_X키 값을 가진 놈에 대한 포인터를 가져와라.

 

 

 Com 객체 생성


IUnknown* CreateInstance()

{

           IUnknown *pI=NULL;

           pI = static_cast<ISetVal*>(new CInsideCom());

           return pI;

}

 

- Component를 사용하기 위해서는 객체를 생성해야 한다.

-객체 생성후 클라이언트에서는 Component객체의 IUnknown 인터페이스 포인터가 필요한데, 이는 개발자가
구성한 인터페이스 접근하여 데이터를 조작하기 위한 유일한 수단이기 때문이다.



Com 객체 사용 예제

IUnknown* pIUnknown = NULL;

ISetVal* pISetVal = NULL;

ICalcu* pICalcu = NULL;

pIUnknown = CreateInstance();

if(pIUnknown)

{

           HRESULT hr = pIUnknown->QueryInterface(\

                     IID_ISetVal,(LPVOID*)&pISetVal);

           if(SUCCEEDED(hr)) {

                     pISetVal->SetXY(3,4);

                     hr = pIUnknown->QueryInterface(\

                                IID_ICalcu, (LPVOID*)&pICalcu);

                     cout << "The Sum of x + y : " << pICalcu->Sum() << endl;

           }

}

 

- SUCCEEDED 매크로를 사용하여 함수의 성공 여부를 확인할 수 있다.

 

- FAILED 매크로를 사용하여 실패

'API & MFC > MFC & COM' 카테고리의 다른 글

컴포넌트 생성및 접근  (0) 2010.03.15
Registry  (0) 2010.03.15
COM이론(Component Object Model)  (0) 2010.03.12
메모리 비트맵  (0) 2010.03.11
SDK와 MFC  (0) 2010.03.11
Posted by 아몰라
이전버튼 1 2 3 4 이전버튼