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 아몰라

COM   - MS에서 소프트웨어(컴포넌트) 를 만들 때 지켜져야할 규칙 혹은 명세
(A와 통신하기 위해서는 어떠한 통신하기위한 약속(Com)이 필요하다.)

컴포넌트 : 소프트웨어를 구성하는 모듈

CoClass : 인터페이스를 실제 구현하는 코드(소프트웨어 컴퓨넌트를 구현하는 기본단위)

COM 오브젝트 : CoClass가 인스턴스화 되어 메모리에 생성된 것을 말한다.

예.

생성할때는
 
1. XX상속 받아야한다.
     2. XX 함수를 구현
     3. XX Key값을 가져야 한다.

이런 규칙들을 정해놓는다.

가져올때는

1. xx 통해 생성
2. xx 포인터는 xx 통해서 가져온다.


인터페이스(통신할수있는 규약) == 가상함수테이블

레고(COM)
{
Virtual 꼽힌다() = 0;
Virtual 꼽다()  = 0;
}

레고가 꼽히는게 아니라 레고에서 상속받은 나무나 사람이 꼽히는 것이다.
레고에서 상속받은 모든 것들은 공통적으로 가상함수테이블에 2개의 함수를 가지고있다.
여기서 꼽힌다꼽다인터페이스가 된다.

COM 에서는 아래 3개의 함수가 인터페이스이다.

QueryInterface();
Addref();
Release();

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

Registry  (0) 2010.03.15
COM이론2장  (0) 2010.03.13
메모리 비트맵  (0) 2010.03.11
SDK와 MFC  (0) 2010.03.11
프로퍼티시트 적용&도움말 지우기  (0) 2010.03.11
Posted by 아몰라
메모리 DC

일반적으로 DC는 화면에 그래픽을 출력하기 위해 사용하지만,  프린터나 플로터 같은 출력 장치에 그래픽을 출력할 때

도 DC를 사용한다. 하지만 BitBIt함수를 이용하여 비트맵 블록을 전송하기 위해 화면 윈도우에서 얻어진 DC와 호환되는

메모리 DC를 사용하는 건 어떠한 출력 장치와도 연결되어 있지 않고, 순수히 메모리에 존재하는 DC이다.


메모리비트맵 - 화면에는 보이지 않고 메모리 상에만 존재 하는 비트맵



메모리 비트맵의 유용성

그래픽 데이터 저장

- 화면에서 얻어진 DC에 비트맵을 선택한 후 그림을 그리면 화면에도 그려지지만 비트맵에도 그려진다.
나중에 이 비트맵만 가지고 있으면, 이것을 다른 윈도우에 출력 할 수도 있고, 화면이 지워진 후에 이를 이용해 화면을 복원 할 수 도있다.

고속 그래픽 출력을 위한 버퍼

- 그림을 그리기 위해 그래픽을 함수를 호출하면 선과 원을 이용해 도형을 그린다고 하면 한장의 그림을 그리기 위해
여러번의 그래픽 함수가 호출되고 화면이 그려지는 과정이 드러나면서 화면이 깜빡거린다. 이런 경우에, 메모리 비트맵을 사용하면좋다. 메모리 DC를 만들고, 여기에 메모리 비트맵을 선택한다. 그런 다음 메모리 DC를 참조하여 여러가지 그래픽 작업을 수행하면 된다.

메모리 비트맵에는 그림이 그려지지만 아직까지 화면에 보이는 것은 아니다. 화면 구성이 끝나면, 메모리 비트맵블록을 화면의 DC로 전송한다. 비트맵을 블록 단위로 전송하는 것은 아주 고속으루 수행 되기 때문에, 깨끗한 출력 결과를 얻을수 있다.



CBitmap - 비트맵 데이터를 읽어오고 관리하는 기능을 한다.

CDC - 메모리 DC

CClientDC - 윈도우의 클라이언트 영역으로 한정되는 DC




윈도우즈는 비트맵을 곧바로 화면 DC로 출력하는 함수는 제공하지 않는다. 비트맵을 출력하는 함수라면 아마 다음과 같은 형태를 상상할 수 있을 것이다.
OutBitmap(hdc,x,y,비트맵 이름);

이런 함수가 있다면 무척 편리하게 비트맵을 출력할 수 있겠지만 안타깝게도 이런 함수는 없다. 왜냐하면 비트맵은 크기가 큰 데이터 덩어리이며 따라서 출력 속도가 형편없이 느리기 때문에 화면으로 곧바로 출력할 경우 여러 가지 꼴사나운 현상이 발생할 수 있기 때문이다. 게다가 다른 좋은 대안이 있기 때문에 직접 화면으로 출력하는 방법은 쓰지 않는다. 그 대안이 바로 여기서 논하고자 하는 메모리 DC이다.

 

메모리 DC란 화면 DC와 동일한 특성을 가지며 그 내부에 출력 표면을 가진 메모리 영역이다. 메모리에 있기는 하지만 화면 DC에서 사용할 수 있는 모든 출력을 메모리 DC에서도 할 수 있다. 선, 면, 원 등의 작도 함수는 물론 화면 DC에서는 불가능한 것까지도 가능하다. 그래서 메모리 DC에 먼저 그림을 그린 후 사용자 눈에 그려지는 과정은 보여주지 않고 메모리 DC에서 작업을 완료한 후 그 결과만 화면으로 고속 복사하는 방법을 많이 사용한다.

 

 

사용자 눈에 화면이 그려지는 과정을 보여주는 것은 그리 깔끔한 모양은 아니다. 여기서 우리가 하고자 하는 비트맵 출력을 위해서도 반드시 메모리 DC를 사용해야 한다. 비트맵도 일종의 GDI 오브젝트이지만 화면 DC에서는 선택할 수 없으며 메모리 DC만이 비트맵을 선택할 수 있다. 그래서 메모리 DC에서 먼저 비트맵을 읽어온 후 화면 DC로 복사하는 것이다. 메모리 DC를 만들 때는 다음 함수가 사용된다.

 

HDC CreateCompatibleDC( HDC hdc );

인수로 화면 DC의 핸들을 주면 이 화면 DC와 동일한 특성을 가지는 DC를 메모리에 만들어 그 핸들값을 리턴해 준다. 동일한 특성을 가진다(=호환된다)는 말은 사용하는 색상수, 색상면(plane)이 같다는 뜻이다. 호환되지 않는 DC끼리는 정보를 공유할 수 없기 때문에 화면 DC와 호환되는 메모리 DC를 만들어야 한다.

 

메모리 DC를 만든 후에는 비트맵을 읽어온 후 이 비트맵을 메모리 DC에 선택해 준다. 선택하는 방법은 여타의 GDI 오브젝트와 마찬가지로 SelectObject 함수를 사용하며 비트맵을 읽어올 때는 LoadBitmap 함수를 사용한다.

 

HBITMAP LoadBitmap( HINSTANCE hInstance, LPCTSTR lpBitmapName );

첫번째 인수는 비트맵 리소스를 가진 인스턴스의 핸들이며 두번째 인수는 비트맵 리소스의 이름이다. 읽어온 비트맵을 SelectObject 함수로 메모리 DC에 선택하면 메모리 DC의 표면에는 리소스에서 읽어온 비트맵이 그려져 있을 것이다.
이제 남은 일은 메모리 DC에 그려진 비트맵을 화면으로 복사하기만 하면 된다.


 

출처 : http://www.winapi.co.kr

참조 : visual c++ 완벽가이드 

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

COM이론2장  (0) 2010.03.13
COM이론(Component Object Model)  (0) 2010.03.12
SDK와 MFC  (0) 2010.03.11
프로퍼티시트 적용&도움말 지우기  (0) 2010.03.11
디버그모드 & 릴리즈모드  (0) 2010.03.10
Posted by 아몰라
2010. 3. 11. 16:59
SDK 는 C언어 형태로 제공되는 라이브러리 이고,
MFC 는 이를 클래스 형태로 캡슐화하여 만든 클래스 라이브러리이다.

주의
SDK에서 제공하는 모든 기능들을 MFC에 다 캡슐화 해놓지는 않았는데 예를 들어  GlobalAlloc이라는 함수가 있는데
메모리를 할당하는 일은 특정 클래스에서만 하는 것이 아니라, 언제 어디서든 사용 할 수있기때문에 이런 함수는
SDK형태로 사용한다.

SDK
HDC hDC;
hDC = BeginPaint(hWnd, &ps);
DrawText(hDC, "마우스", ...);
EndPaint(hWnd, &ps);


MFC
CPaintDC dc(this);
dc.DrawText("마우스",...);

MFC는 dc라는 인스턴스명에 의하여 어떠한 윈도우를 사용할지 구별되고있고 CDC클래스는 멤버변수로서
HDC형 변수인 m_hDC를 가지고 있고, DrawText 멤버 함수는 이를 이용하여 SDK함수를 호출한다.
또한, Beginpaint는 생성자에서 Endpaint가 소멸자에 있음으로 틀에 박힌 작업을 프로그래머가 하지 않아도 된다.

클래스와 핸들의 연계성

위에서 예를 들자면  MFC클래스를 SDK로 작성된 프로그램에 넘겨주려면  HDC형 멤버변수를 직접 넘겨주거나 이를 반환하는 함수 GetSafeHdc가 있다.

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

COM이론(Component Object Model)  (0) 2010.03.12
메모리 비트맵  (0) 2010.03.11
프로퍼티시트 적용&도움말 지우기  (0) 2010.03.11
디버그모드 & 릴리즈모드  (0) 2010.03.10
사운드출력함수  (0) 2010.03.10
Posted by 아몰라

 m_psh.dwFlags |= PSH_NOAPPLYNOW;    // 적용버튼 없애기

    m_psh.dwFlags &= ~PSH_HASHELP;        // 프로퍼티시트의 헬프버튼 없애기


    m_Page1.m_psp.dwFlags &= ~PSP_HASHELP;    // 이건 시트 위의 페이지마다 하셔야합니다

    m_Page2.m_psp.dwFlags &= ~PSP_HASHELP;

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

메모리 비트맵  (0) 2010.03.11
SDK와 MFC  (0) 2010.03.11
디버그모드 & 릴리즈모드  (0) 2010.03.10
사운드출력함수  (0) 2010.03.10
좌표가 영역안에 있는지 확인  (0) 2010.03.10
Posted by 아몰라
프로젝트를 컴파일하여 실행 파일을 만드는 방법에는 디버그/릴리즈 두 가지가 있다.

 디버그 빌드와 릴리즈 빌드에서 서로 실행 결과가 다른 경우, 특기 디버그 빌드에서는 괜찮은데 릴리즈 빌드에서만 오류가 발생하여 프로그램이 죽는 경우가 있는데 이런 경우는 대부분 메모리가 깨진 경우에 발생한다. 두 모드에서 동적으로 메모리를 할당하면 힙 영역에 요청한 크기만큼 메모리를 할당 받게 되는데 그 초기값이 다르다.

릴리즈 빌드의 경우 할당된 메모리 영역을 초기화하지 않는 경우 바로 할당되기 직전의 쓰레기 값이 그대로 사용되는 반면 디버그 빌드의 경우 디버거로 디버깅하는데 블록을 구분하기 위해 0xCC, 0xDD와 같은 값으로 초기화된다.

 

디버그 모드

 실행 파일에 디버깅 정보를 삽입하여 언제든지 디버깅을 할 수 있도록 하며 프로젝트 디렉토리 아래에 Debug 서브 디렉토리에 실행 파일을 만들어 준다. 디버깅 정보가 들어가 있기 때문에 실행 파일의 상태를 확인할 수 있다.

 

릴리즈 모드

 일체의 디버깅 정보를 삽입하지 않을 뿐만 아니라 코드를 최적화하여 실행 파일 크기를 최대한 줄여준다. 릴리즈 모드로 만든 실행 파일로는 디버깅을 할 수 없지만 속도나 크기면에서는 디버그 모드로 만든 실행 파일보다 월등히 유리하다. 모든 버그를 잡고 개발이 완료되었을 때는 릴리즈 모드로 컴파일해야 한다.

 

 

출처 www.winapi.co.kr

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

SDK와 MFC  (0) 2010.03.11
프로퍼티시트 적용&도움말 지우기  (0) 2010.03.11
사운드출력함수  (0) 2010.03.10
좌표가 영역안에 있는지 확인  (0) 2010.03.10
UpdateData함수  (0) 2010.03.08
Posted by 아몰라
BOOL PlaySound(
LPCSTR pszSound,
HMODULE hmod,
DWORD fdwSound );


#pragma comment(lib, "winmm")
#include <mmsystem.h>

/* 경로를 설정하여, wave 파일을 재생하고자 할때 */
PlaySound("c:\test.wav" , NULL, SND_ASYNC);
/* wave 파일을 리소스에 등록 후, 재생하고자 할 때  */
PlaySound((LPCSTR)MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_ASYNC | SND_RESOURCE);


SND_NODEFAULT - 파일이 없을때 경고음 안울리게!!

정지
PlaySound(NULL, NULL, NULL);

첫번째 인자 : 연주할 파일 이름
두번째 인자: 연주할경우 리소스를 가진 실행파일의 핸들
세번째 인자: 기타 옵션을 지정
SND_ASYNC - 비동기화된연주를 하는겁니다,,예를 들어서 음악이 재생돼면서 다른작업을 동시에 할때이것을 쓴다. SND_SYNC -  동기화된연주 즉 이렇게설정을 하면 프로그램은 이곡이 끝나기전까지는 아무반응을 안한다.
SND_LOOP - 반복연주한다는 뜻
SND_RESOURCE - 리소를 사용할때 사용한다.

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

프로퍼티시트 적용&도움말 지우기  (0) 2010.03.11
디버그모드 & 릴리즈모드  (0) 2010.03.10
좌표가 영역안에 있는지 확인  (0) 2010.03.10
UpdateData함수  (0) 2010.03.08
각 클래스에서 객체 얻기  (0) 2010.03.04
Posted by 아몰라
rect에

CRect rect;
 GetDlgItem(IDB_BITMAP2)->GetWindowRect(&rect);
 ScreenToClient(&rect);

이런식으로 일정 영역을 구해놓고

확인해보고싶은 좌표를 인자로 넣어주면

rect.PtInRect(point);

영역안에 들어가는지 안들어가는지

bool로 반환해준다.

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

프로퍼티시트 적용&도움말 지우기  (0) 2010.03.11
디버그모드 & 릴리즈모드  (0) 2010.03.10
사운드출력함수  (0) 2010.03.10
UpdateData함수  (0) 2010.03.08
각 클래스에서 객체 얻기  (0) 2010.03.04
Posted by 아몰라



DDX로 에디트와 변수를 묶어주고 UpdateData로 True를 줬을때는 변수로 false일 때는 에디트로 업데이트를 해준다.

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

프로퍼티시트 적용&도움말 지우기  (0) 2010.03.11
디버그모드 & 릴리즈모드  (0) 2010.03.10
사운드출력함수  (0) 2010.03.10
좌표가 영역안에 있는지 확인  (0) 2010.03.10
각 클래스에서 객체 얻기  (0) 2010.03.04
Posted by 아몰라