유돌이

calendar

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

Notice

2008. 12. 20. 12:04 ATL / WTL

순수하게 win32 만으로 할려니까...  어렵네요...

간단하게 atl 로 dialog 에 web browser 띄우는 것을 해 보겠습니다.
차례대로 따라 하세요.

1. AtlCom Object Wizard 로 들어갑니다. (이름을 마음대로 만드세요)
2. type 은 DLL, (실행, 서비스)EXE 가 있는데... 실행 EXE 하세요.
3. 프로젝트가 생성 되었고, Menu/insert/New ATL Object 를 선택하시면
 3번째 분류에 Dialog 라는 것이 있습니다. 
 short name 만 지정하시고 만듭니다.
4. 다이얼로그가 생성되는데 여기다가 오른쪽 클릭후 Insert ActiveX 에서 
   Microsoft 웹 브라우저를 선택해서 추가합니다.  적당하게 Dlg 를 눌려주세요
5. 다이얼로그의 OnInitDialog()를 다음과 같이고치세요.

LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
  HRESULT     hr;
  CComPtr spIE;
  
  m_IEHost = GetDlgItem(IDC_EXPLORER1);
  hr = m_IEHost.QueryControl(IID_IWebBrowser2,(PVOID *)&spIE);
  
  hr = spIE->put_Visible(VARIANT_TRUE);
  hr = spIE->GoHome();
  
  return 1;  // Let the system set the focus
}

6. CAxWindow m_IEHost; 를 .h 에 추가하세요.
7. _tWinMain 부분을 다음과 같이 고치세요.
    if (bRun)
    {
      _Module.StartMonitor();
#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
      hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
        REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED);
      _ASSERTE(SUCCEEDED(hRes));
      hRes = CoResumeClassObjects();
#else
      hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
        REGCLS_MULTIPLEUSE);
#endif
      _ASSERTE(SUCCEEDED(hRes));
      
      C????Dlg dlg;
      
      dlg.DoModal();
      
      /*        MSG msg;
      while (GetMessage(&msg, 0, 0, 0))
      DispatchMessage(&msg);*/
      
      _Module.RevokeClassObjects();
      Sleep(dwPause); //wait for any threads to finish
    }
8. 컴파일 하면 dlg 가 뜨고, 초기 홈페이지를 Load 합니다.

더 자세한 것은 또 문의 하세요... (될수 있으면 E-Mail 은 피해 주세요)

[출처 : 데브피아 EDIT 


posted by 유돌이
2008. 12. 20. 12:03 ATL / WTL

Browser Helper Object라고 하는 놈은 Internet Explorer의 인스턴스에 연결되어 Explorer의 액션을 제어하고 발생되는 이벤트들을 알아내는 역할을 해줍니다.

 

BHO이 구동되는 원리는

 

Explorer이 구동될때 특정 레지스트리에 등록에 CLSID에 값을 읽어서 Load하게끔 되어 있는데...

 

HKLM

{

    SOFTWARE

    {

        Microsoft

        {   

            Windows

            {

                CurrentVersion

                {

                    Explorer

                    {

                        'Browser Helper Objects'

                        {

 

이 위치가 됩니다.

 

물론 여기에 등록만 되어 있다고 해서...등록된 Dll들이 Load되서 이벤트를 감시하고 제어가 되는건 아닙니다.

일정 규약에 맞게끔 인터페이스가 지원되야 하고 규정된 메써드를 밖으로 노출시켜야 합니다.

 

그 규정된 인터페이스가 IObjectWithSite라는 놈이고...IObjectWithSite인터페이스에 있는 SetSite메써드를 Explorer에서 호출하게끔 되어 있는겁니다.

 

HRESULT Cbhotest::SetSite(IUnknown *pUnkSite)

{

    m_spWebBrowser2 = pUnkSite;

 

    if (m_spWebBrowser2 == NULL)

        return E_INVALIDARG;

    

    m_spCPC = m_spWebBrowser2;

 

    if (m_spCPC == NULL)

        return E_POINTER;

    RetrieveBrowserWindow();

 

    return Connect();

}

 

질문하셨듯이.. Connect()함수는 Explorer에서 SetSite는 자동으로 불려져서 호출됩니다.

 

그 다음부터는 Invoke함수에서.... Explorer에서 발새오디는 이벤트를 감지/제어가 가능해 지는거죠.

아니면 Explorer에 윈도우 메세지를 후킹해서...샘플에서 종료를 막는다거나.,.. 하는 일들을 하게되는거죠...

 

ExDisPID.h

이 파일을 한번 열어 보셨으면 금방 아실텐데요...아쉽....

이건 Explorer의 이벤트 ID가 정의되어 있는 헤더파일입니다.

 

다른 궁금하신 사항들 검색을 해보시거나... 아님 관련 서적을 찾으시면 금방 아실 수 있는 내용이구요.

 

되도록이면 com관련 서적을 한번 보시는 것을 추천합니다...


posted by 유돌이
2008. 12. 20. 12:02 ATL / WTL
출처 AmesianX 님의 블로그 | 아메시안
원문 http://blog.naver.com/amesianx/50002572812

BHO 란 Browser Helper Object 의 약자로 우리가 많이 사용하는 인터넷 익스플로어를 띄우면

BHO 와 같이 작동이 된다. 즉, 인터넷 익스플로어에 DLL 형태로 같이 낑겨들어가는데 하는 행동은

인터넷 브라우저를 제어할 수 있다. 흔히 생각하면 스파이웨어나 인터넷 돌아당기다가 악성코드가

걸려서 시작페이지가 성인사이트로 바뀌어서 뜬다거나 하는 놈이 이 BHO 의 능력을 악용한 거다.

BHO 는 레지스트리에 기록되며 인터넷 익스플로어가 작동될때는 이 레지스트리에 있는 값을 이용

해서 BHO 프로그램을 로딩하고 같이 올라가는데 일단 BHO 가 뜬 상태에서는 BHO 가 전적으로

브라우져를 통제하게 되므로 사용자 개인정보를 훔친다던지 아니면 성인사이트 광고를 한다던지

온갖 잡짓(?)을 다 할 수 있다. 그렇기 때문에 레지스트리에서 시작페이지를 고쳤는데 계속 시작

페이지가 안바뀐다고 울지말자. BHO 를 레지스트리에서 삭제하면 되니까.. ㅎㅎ

이런 BHO 는 ATL 로 개발될수도 있고 MFC 로 개발될 수도 있다. ATL 이 퍼포먼스 면이나 용량면

에서 MFC 보다 좀 낫다고 한다. 그리고 국내에서는 대부분 MFC 로 개발하는 것보다는 ATL 로

COM 을 제작하는 것이 압도적으로 많은 것 같고 일반화된 것 같다. MFC 로 개발하면 상대적으로

쉬운데 국내 분위기는 인정을 안하는 건지 굳이 어려운 ATL 이 더 정보가 많다. 외국은 1:1 인것

같다. 이번에 BHO 를 ATL 로 만들면서 참고한 사이트와 개발하면서 겪은 고난의 역사를 올려본다.

참고로 나는 ATL 의 A 자도 모르고 시작해서 약 3 일 정도 걸려 개념을 잡기위한 참고자료들을

모았다. 그리고 대략 5일정도 되서 개념을 잡고 코드들을 주무를 수 있었다.

페이지의 크기가 제한되어 있는지라 ATL 개발의 완벽한 지식을 주었던 개발백서는 다른 사이트에

올리고 링크를 달려고 한다. 여기에 있는 참고 사이트는 그 개발백서를 제외한 나머지이다.

다음에 올리는 글에 개발백서를 올리려고 한다.. 그 개발백서만 있으면 아마도 ATL 프로그래밍을

처음 시작하는 사람도 2~3일만에 개념을 다 잡을 수 있지 않을까 생각된다..

 

[BHO 를 만들기 위한 설명]
상대적으로 BHO 를 만들기 위한 내용을 잘 설명해 놓았다. 외국 사이트라서
영어인 점을 제외하면 BHO 를 만들기 위해서 어떻게 인터넷 브라우져가 작동하기 때문에
어떻게 해서 작동을 시켜야 한다는 내용이 잘 정리되어 있고 처음 접하는 사람이 읽어볼만 하다.
물론 ATL 로 만드는 것을 설명하고 있다.
http://newssearch.looksmart.com/p/articles/mi_zdpcm/is_200009/ai_ziff7872/pg_2

[팝업 블록커]
팝업 방지기능이 있는 BHO 를 만들 수 있는 법을 설명한다.
그런데 중상급자용 강좌인것고 너무 어렵다. 알아듣기도 힘들고.. 소스 자체만 가치가 있는것 같다.
http://www.codeproject.com/atl/PopupBlocker.asp

[ThumbNailer Visual C++ Image Processing plug-in Tutorial]
그럭저럭 ATL 에 대한 튜토리얼이나 초보자가 참고하기는 좀 그렇다.
http://www.smalleranimals.com/thumbnailer/thumbimgtut.htm

[Example of Handling HTML Element Events in Microsoft Internet Explorer]
MFC 용 코드 이기 때문에 ATL 사용자가 쓰기는 좀 그렇다.. 초보자에게 그다지 도움이 많이 되지 않는다.
http://lists.w3.org/Archives/Public/w3c-wai-ua/2000JanMar/att-0287/htmlevent.htm

[Objvw is a sample that illustrates using Internet Explorer's Automation model and scripting interfaces from within a contained ATL control.]
잘 모르지만 브라우저를 다루는 소스이다. ATL 로 되어있고 참고소스이다.
http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/samples/internet/components/objvw/default.asp


[DEVPIA 질답 모음]

- 이벤트 사용법 -
http://www.devpia.com/Forum/BoardView.aspx?no=518183&ref=518183&page=3&forumname=VC_QA&stype=&KeyW=bho&KeyR=title

- BHO 와 MSHTML 의 차이 -
http://www.devpia.com/Forum/BoardView.aspx?no=497131&ref=497131&page=4&forumname=VC_QA&stype=&KeyW=bho&KeyR=title

- BHO 사용방법 (접근방법) -
http://www.devpia.com/Forum/BoardView.aspx?no=486404&ref=486292&page=4&forumname=VC_QA&stype=&KeyW=bho&KeyR=title

- 브라우져를 여러개 띄워도 한개의 BHO 만 실행시킬 수 있나? -
http://www.devpia.com/Forum/BoardView.aspx?no=466840&ref=466840&page=5&forumname=VC_QA&stype=&KeyW=bho&KeyR=title

- BHO 로 프레임의 주소와 소스 뽑아오기(불완전) -
http://www.devpia.com/Forum/BoardView.aspx?no=457244&ref=457244&page=5&forumname=VC_QA&stype=&KeyW=bho&KeyR=title

- BHO 로 Document 의 HTML 소스 뽑아오기 -
http://www.devpia.com/Forum/BoardView.aspx?no=334979&ref=334969&page=10&forumname=VC_QA&stype=&KeyW=bho&KeyR=title

- 브라우저 닫힐때 BHO 가 알수있는 방법 -
http://www.devpia.com/Forum/BoardView.aspx?no=466020&ref=447181&page=5&forumname=VC_QA&stype=&KeyW=bho&KeyR=title

- 인터넷 익스플로어의 기본 경로 저장 레지스트리 키 -
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\IEXPLORE.EXE

- BHO에서.. SetSite와 Translate.. 사용시 문제점 -
http://www.devpia.com/Forum/BoardView.aspx?no=456390&ref=456390&page=6&forumname=VC_QA&stype=&KeyW=bho&KeyR=title

- [BHO초보]Atladvise,invoke 를 구현하니까, 기존에 작성한 함수가 동작을 안합니다.(참고할만한 소스존재) -
http://www.devpia.com/Forum/BoardView.aspx?no=422640&ref=422640&page=7&forumname=VC_QA&stype=&KeyW=bho&KeyR=title

- BHO 에서 Invoke 재구현으로 이벤트 처리법
http://www.devpia.com/Forum/BoardView.aspx?no=522323&ref=522323&forumname=VC_QA&stype=VCF&KeyW=bho+%c0%cc%ba%a5%c6%ae&KeyR=title

- DISPID_DOCUMENTCOMPLETE가 여러번 불리는 이유 -
http://www.devpia.com/Forum/BoardView.aspx?no=422044&ref=422044&page=1&forumname=VC_QA&stype=&KeyW=dispid&KeyR=title

[블로그 검색]

- ActiveX 에서 이벤트 싱크하기 -
http://blog.naver.com/zzoouc?Redirect=Log&logNo=20312485

- BHO 로 브라우저 요리할 수 있는 완벽한 참고서 -
http://blog.naver.com/jeonghj66?Redirect=Log&logNo=140021348390


[디버깅 참고]
http://www.debuglab.com/knowledge/filetrace.html

 

>> 암복호화 OpenSSL 관련 <<

[암복호화 에 관련된 CryptoAPI 에 관한 글 및 HTML 을 MSHTML 의 도움으로 파싱하는 Moniker 방법]
http://haje.kaist.ac.kr/~oedalpha/tips/WindowsProgramming/

[Subversion 구축과 사용버 OpenSSL 사용법이 존재]
http://www.devpia.com/forum/BoardView.aspx?no=7273&ref=7273&page=1&forumname=vc_lec&stype=

>> 정규 표현식 라이브러리 참고 사이트 <<

[Boost regex 사용법]
http://blog.naver.com/redsusia?Redirect=Log&logNo=60002340337

[참고:누군가 댓글에 Boost 보다 GRETA 가 성능이 더 좋다고 적어놓았음]
http://madchick.egloos.com/302213

[MS 의 GRETA 엔진 사이트]
MS 의 연구원이 개발한 것으로 사용법이 편하고 속도가 빠르다고 함
http://research.microsoft.com/projects/greta/

[가지 각색의 쓸만한 정규표현식 라이브러리를 소개하는 곳]
http://www.oobdoo.com/directory/Computers/Programming/Languages/RegularExpressions/CandC++/

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

[개발 히스토리: 문제점 봉착에 관한 고찰]

[문제점1]

Invoke 함수를 사용하는 방법을 쓰려고 하였으나 dispid 값이 자꾸 -525 가 나오는데 그 이유는 제대로
커넥션 포인터를 얻어내지 못하는 것이 아닌가 생각된다. 다음의 정보에서 dispid 값이 -525 이면
DISPID_READYSTATE 값이라는 것을 알 수 있고 브라우져가 아닌 컴포넌트(객체)의 상태값이며 브라우져의
아이디 값이 아닌 것을 추측할 수 있다. 그렇다면 이벤트가 연결이 되지 않은 것이라고 판단되었다.

(dispid 참고 링크)
http://hyons.hp.infoseek.co.jp/ref/dispid.shtml
http://www.4programmers.net/bin/SHDocVw_TLB.pas

문제점을 알기 위해서 SetSite 에 디버깅을 걸었으나 함수에 들어가지지 조차 않는 문제점이 발견되었다.
이와 같은 문제점을 다른 사람도 겪고 있는 것을 데브피아에서 발견하였다.

(데브피아 글)
http://www.devpia.com/Forum/BoardView.aspx?no=543797&ref=491741&page=1&forumname=VC_QA&stype=&KeyW=SetSite&KeyR=titlecontent

SetSite 함수에 들어가지지 않으면 윈도우의 핸들을 얻어올수 없기 때문에 커넥션이 제대로 맺어지지 않아
자기 자체의 객체 dispid 값을 얻어와서 -525 가 들어오는 것으로 판단되었다. 내가 원하는 값은 100 이므로
이 값이 들어와야 문서의 다운로드 완료 시점을 알 수있다.

(해결책 추측제시 1)
레지스트리에 BHO 관련 설정 값을 셋팅하지 않아서 SetSite 함수 안으로 안들어가는 것이 아닌가?
테스트 중...
http://www.devpia.com/Forum/BoardView.aspx?no=520529&ref=520484&page=2&forumname=VC_QA&stype=&KeyW=SetSite&KeyR=titlecontent
다음의 글에서 어떤 사람이 레지스트리에 BHO 를 등록했냐고 물어온다.. ㅡ.ㅡ; 나는 등록 안했는데 등록을 얼렁 해야 겠다...
http://www.devpia.com/Forum/BoardView.aspx?no=486404&ref=486292&page=3&forumname=VC_QA&stype=&KeyW=SetSite&KeyR=titlecontent
나와 똑같이 SetSite 가 콜이 되지 않아서 몸살을 알고 있는 사람이 또 있다니...
http://www.devpia.com/Forum/BoardView.aspx?no=319724&ref=319689&page=5&forumname=VC_QA&stype=&KeyW=SetSite&KeyR=titlecontent


(해결책)
염병헐... 드디어 해결책 발견.. rgs 파일에 레지스트리를 추가해줘야 하는데 하질 않아서 문제가 발생한 거였다..
역시 언제나 나의 육감은 항상 적중한다.. ㅋㅋㅋ ㅡ.ㅡ;

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects

클래스 CLSID 를 기록만 해주면 끝난다..

http://www.devpia.com/Forum/BoardView.aspx?no=455356&ref=454567&page=2&forumname=VC_QA&stype=&KeyW=BHO+%b5%ee%b7%cf&KeyR=titlecontent


(제일 참고에 많이 도움이 된 사이트.. 역시 MSDN)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ietechcol/dnwebgen/bho.asp

마지막 문제점 다이얼로그를 만들어서 트레이에 심어야 하는데 다이얼로그 만들었더니 초기화 에러가 나네.. 썅..

느긋히 서치를 때려보니 야후 뮤직 플레이어를 다이얼로그로 만들어서 플러그인화 시키는 몬가가 있었다..

http://mep.music.yahoo.com/plugins/docs/helloworldplugin_page.html

ㅎㅎㅎ... 위의 ATL 개발백서에서는 듬성듬성 건너뛰고 넘어간 다이얼로그 생성 추가에 관련된 ATL 프로그래밍이
상세히 적혀있다. 이것으로 다이얼로그도 해결이 됐다..


[문제점2]

이미 한번 만들어서 잘 작동되는 프로그램을 다시 만들고 나니 Invoke 함수로 들어가지지 않는다.

(해결책 추측제시 1)
아마도 이벤트를 연결해주는 connect(개인함수) 함수를 임의적으로 제거해서 그런것이 아닌가...

(해결책)
connect(개인함수)를 사용하여 DWebBrowserEvents2 이벤트를 커넥션 시키지 않아서 Invoke 가 호출되지 않았었다.
이벤트를 연결하여 Invoke 를 호출 시키는 것을 해결하였다.

[문제점3]

ActiveX 와 BHO 를 분리 시키는 것으로 확정하고 다시 프로그래밍을 하여 구조를 잡았는데 이런 빌어먹을 정규표현식
라이브러리 GRETA 가 VC 6.0 에서밖에 컴파일이 안되는 거지같은 경우가 생겨버렸다. 이잡듯이 구굴을 뒤져서 엄청나게
많은 글을 뒤져봤지만 VC 7.0 이나 8.0 에서 typename 을 쓰라고 써놨다.. 하지만 VC 7.0 에서는 될지 몰라도 나는
VC8.0 으로 개발하고 있었기 때문에 어쩔수 없었다. 더 골때리는 것은 VC 7.0 에서 조차도 컴파일이 제대로 되지 않는지
컴파일 안된다는 사람이 나말고도 한둘이 아니다.. 왠만하면 수정해서 사용할려고 했지만 대부분이 MS 의 VC++ 이 표준
컴파일러를 지키지 않기 때문에 나타나는 현상이라며 차라리 VC 6.0 을 사용하라고 회의적인 반응이었다.
어쩔수 없이 프로젝트를 VS 2005 (VC 8.0) 에서 VC 6.0 으로 옮겨야 된다.. 젠장.. VC 6.0 으로 시작한 것이 VC 7.0 으로
다시 VC 8.0 에서 처음 시작인 VC 6.0 환경까지 오게 되었다.. 이 어찌 기가 막히고 코가 막히는 시츄에이션인가..
매번 개발툴을 발표할때마다 컴파일러를 개같이 만드는 MS 에 혐오감이 생긴다.. 차라리 델파이로 가는게 낫겠다는 생각이..

GRETA 정규표현식 라이브러리를 BHO 에 합치기 위해서 GRETA 컴파일을 시도하닌 다음처럼 무수한 경고가 뿌려지며 컴파일이
완료되었다. 난생 처음보는거라 기가 막혀서 찾아보니 또 버그란다..
VC++ 에서 템플릿 명을 이빠이 길게 늘여쓰면 다음과 같이 경고가 무지막지 하게 튀어나온다...
그 이유는 255자가 넘어가면 네임 맹글링이 될수 없다는 것이다. 네임 맹글링은 VC 에서만 사용하는 특이한 명명자를 만드는
방법인데 템플릿으로 클래스를 길게 늘여쓰니깐 네임 맹글링때도 255자가 넘어가서 짤린다는 경고인 것이다.
그래서 다음처럼 해결하려고 하였다.
#pragma warning( disable : 4786)
이렇게 하면 경고가 안나올것이라고 생각했으나 역시나 경고가 쏟아져 나온다.. 찾아 봤더니 아예 MS 에서 이 경고를 무시하려고
pragra 를 썼을때 조차도 경고가 나오는건 자기네들의 버그라고 한다..
어이가 없다.. 정말로.. 돌아가실 지경이다.. 어쩔 수 없이 그냥 경고를 볼 수밖에... 대부분의 사이트의 그루(GURU)들이 말하길
코드 자체에는 이상이 없으니 무시하란다.. 쩝.. ㅡ.ㅡ; 디버깅할때만 좀 안될거란다.. 다음처럼 써있었다...

Microsoft has confirmed that this is a bug in the Microsoft products that are listed in the "Applies to" section.

This problem was corrected in Microsoft Visual C++ .NET.
 Back to the top

MORE INFORMATION
This warning can be ignored. However, the identifier may not be accessible or viewable in the debugger.

위에서 MS 가 하는 말로 골때리는 부분이 있다.. "Visual C++ .NET 에서 이 문제가 해결되었다." 개새끼들이다.. 정말로..
패치가 있을 줄 알았더니 닷넷버젼에서 버그가 해결되었으니 닷넷쓰라 이런 똥배짱을 부린다.. 내가 닷넷 쓰다가 지금 VC 6.0 으로
돌아왔는데 장난하냐 새끼들아.. 라고 한 소리 해주고 싶다.

warning C4786:
'std::rb_tree<CAiSpanningTree<State,std::less<State>>::TransClosureNode, CAiSpanningTree<State,std::less<State>>::
TransClosureNode,std::ident<Cai SpanningTree<State,std::less<State>>::TransClosureNode,CAiSpanningTree<S tate,std::
less<State>>::TransClosureNode>,std::less<CAiSpanningTree<Stat e,std::less<State>>::TransClosureNode>>' :
identifier was truncated to '255' characters in the debug information


[MS 사이트: BUG: You still receive a "warning C4768" message even if you use the warning pragma to disable
            the warning in Visual C++ ]
http://support.microsoft.com/?id=167355


posted by 유돌이
2008. 12. 20. 12:01 ATL / WTL

출처 내꺼 블로그 새거 | 불이
원문 http://blog.naver.com/vulee/60023156023

ATL COM을 이용한 ICommand만들기(3)

- 전시간에 만들어진 프로젝트를 ArcMap에서 사용하기 위한 준비를 해보겠습니다.

1. ArcObjects사용하기 위한 Com Objects를 Import하기

   1) Hello.h 상단의 Import부분을 잘라내기 한다.

 

 

 

   2) StdAfx.h를 열고 붙여넣기를 하고 아래와 같이 편집한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2. 버튼에 쓰일 아이콘 만들기

  1) Resource 탭에서 Bitmap을 Import한다음 16X16형태의 이미지를 만들고 저장한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

  2) Hello.h에서 HBITMAP을 선언한다.

 

 

 

 

  3) 생성자에서 아이콘을 로딩하고 소멸자에서 Delete 한다.

 

 

 

 

 

 

 

 

 

 

 

  4) Hello.cpp에서 get_Bitmap을 구현한다.

 

 

 

 

 

 

 

 

 

 

 

3. 버튼이 활성화 : get_Enalbed

 

 

 

 

 

 

 

 

 

 

 

 

4. 버튼이 눌린상태 : get_Checked

 

 

 

 

 

 

 

 

 

 

5. 버튼의 이름 : get_Name

posted by 유돌이
2008. 12. 20. 12:00 ATL / WTL
출처 내꺼 블로그 새거 | 불이
원문 http://blog.naver.com/vulee/60018758415

ATL COM을 이용한 ICommand만들기(1)
- 전시간에는 비어있는 Interface를 만들어 보았습니다.
  이번 시간에는 ICommand를 Implement하는 방법을 설명하겠습니다.
 
1. Workspace의 ClassView에서 해당클래스를 마우스오른쪽버튼을 클릭한다음
   Implement Interface를 클릭
 
2. Browse Type Library에서 ESRI SystemUI를 체크한 뒤 OK
 
3. Implemant Interface에서 ICommand를 체크한뒤 OK
 
4. Hello.h 파일을 보면 ICommand가 소스에 추가되었음을 알 수 있다.
 
5. Hello.h에서 ICommand부분을 헤더(Hello.h)와 소스(Hello.cpp)로 나눈다.
   . 수정된 Hello.h 모습
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
   . Hello.cpp에 헤더의 내용을 붙여놓고 아래와 같이 편집한다.

posted by 유돌이
2008. 12. 20. 11:59 ATL / WTL
출처 내꺼 블로그 새거 | 불이
원문 http://blog.naver.com/vulee/60018626702
ATL COM을 이용한 ICommand만들기(1)
- 이번에는 Visul studio6.0 C++을 이용하여 ATL프로젝트를 생성하고
  인터페이스를 만드는 데까지 설명하겠습니다.
 
1. Visual Studio6.0 C++ 실행

 

2. 새 프로젝트 만들기(projects에서 ATL COM을 선택)

 

3. 새 ATL 객체만들기(Workspace에서 New ATL Object 선택)

 

4. SimpleObject를 선택

 

5. names에서 인터페이스 이름 설정

 

6. attributes에서 Custom과 Supprt ISupportErrorInfo를 선택


posted by 유돌이
2008. 12. 20. 11:58 ATL / WTL
출처 시간을 건너는 소녀。 | 하란
원문 http://blog.naver.com/farewell06/140036441525

<COM 기술을 이용하는 시나리오>

1. '밥짓는 로봇'이 필요하여 로봇을 하나 생산하도록 결정.

2. '공장''밥 짓는 용도'의 로봇 생산을 의뢰. 이때 '로봇 생산에 사용할 원료'를 지정해 줌.

   공장은 로봇을 생산한 후 로봇과 함께 '밥 짓는 명령'을 지시할 수 있는 '리모콘'을 전달.

3. '리모콘의 밥 짓기 버튼'을 눌러 밥 짓는 명령을 지시하고, 로봇은 밥을 짓는다.

4. 리모콘에는 밥 짓기 버튼 외에 '기본 용도' 라고 쓰여진 공간에 세 개의 또 다른 버튼이 있다.

   세 개의 버튼에는 각각 '묻기 버튼', '활성화 버튼' 그리고 '비활성화 버튼'이라는 이름이 붙어있음.

5. 밥짓는 로봇에게 쉬는 동안 청소도 시켰으면 하는 바람이 생겼다. 리모콘의 '묻기 버튼'을 눌러 로봇에게

  '청소 용도'로 사용할 수 있는지 물어본다. 청소도 할 수 잇으면 청소 명령을 지시할 수 있는 리모콘을 전달.

6. 리모콘을 복제하여 필요한 가족에게 전달한다. 리모콘을 전달받은 사람은 '리모콘의 활성화 버튼'을 눌러

   로봇에게 자신이 사용하겠다는 의사를 전달함.

7. 로봇이 더 이상 필요 없는 사람은 '리모콘의 비활성화 버튼' 을 누른다. 이때 활성화된 리모콘이 하나도 

   없으면 로봇은 자신을 사용하는 사람이 더 이상 없음을 알고 스스로 자폭하여 사라짐.

 

<시나리오 용어에 해당하는 COM 기술 용어>

공장                                    - COM 팩토리 컴포넌트

생산에 사용할 원료                  -  COM 컴포넌트

로봇                                     - COM 객체

로봇 생산                              - COM 객체 생성

로봇 자폭                               - COM 객체 소멸

용도                                     - COM 인터페이스

밥 짓는 용도                            - 밥 짓는 기능을 갖는 COM 인터페이스

청소 용도                               - 청소 기능을 갖는 COM 인터페이스

밥 짓는 로봇                            - 밥 짓는 기능의 COM 인터페이스를 갖고 있는 COM 객체

리모콘                                  - COM 인터페이스 포인터

리모콘 버튼                             - COM 인터페이스 내의 함수

리모콘의 특정 버튼 누르기             - COM 인터페이스의 해당 함수 호출

기본 용도                               - 모든 COM 인터페이스의 기본 기능의 IUnknown 인터페이스

리모콘의 듣기 버튼                     - IUnknown 인터페이스의 QueryInterface()함수

리모콘의 활성화 버튼                 - IUknown 인터페이스의 AddRef() 함수

리모콘의 비활성화 버튼               - IUknown 인터페이스의 Release() 함수

 

1. 로봇 생산과 CoCreateInstance() 함수

- 공장에 생산을 의뢰할 때는 CoCreateInstance() API 함수를 사용.

- 첫번째 매개변수는 원료를 지정하는 항목으로 COM 컴포넌트의 CLSID(class ID)를 입력한다.

- 네번째 매개변수에는 사용할 용도를 기술. 즉 시나리오에서의 밥 짓느 ㄴ용도로 사용할 로봇.

- 다섯번째 매게변수는 리모콘을 얻어오는 곳. 리모콘을 건네받아야 하므로 포인터를 먼저 건네준 후 건네받음.

- 'COM 컴포넌트'란 일종의 C++ 클래스.

- COM 컴포넌트는 특정 내용을 모두 구현해 놓은 대상이지만 메모리에 존재하지 않는 개념.

- COM 객체는 COM 컴포넌트를 new 연산자 등을 이용해 직접 메모리에 생성해둔 모듈을 의미.

- COM 인터페이스도 COM 컴포넌트처럼 추상적인 개념으로, COM 컴포넌트는 이 COM 인터페이스를 구현한 모듈.

- COM 컴포넌트가 COM 객체로 구체화되면 그 COM 인터페이스 포인터를 얻을 수 있으며, COM 인터페이스 포인터는 COM 객체에서 해당 인터페이스를 구현한 부분을 가리킴.

-> COM 컴포넌트나 COM 인터페이스 자체에 명령을 내리는 것은 있을 수 없으며, COM 객체나 COM 인터페이스 포인터에 명령을 내린다는 것이 올바른 표현이다.

 

2. 리모콘 버튼과 인터페이스 함수 호출

 

- 리모콘은 인터페이스 포인터를 의미하고, 리모콘 버튼은 그 인터페이스 내에 있는 함수를 의미한다.

- 인터페이스 포인터를 통해 직접 함수를 호출한다.

- 함수를 호출하는 순간 원하는 작업이 수행되고, 함수의 특징에 따라 그 결과를 전달받게 된다.

 

3. 기본 명령과 IUnknown 인터페이스

 

- 기본 용도는 COM 기술에서 IUnknown 인터페이스에 해당된다.

- COM 인터페이스라고 하면 반드시 이 인터페이스를 상속받아야 하기 때문에, 사용자는 모든 COM 인터페이스에 대해 IUnknown 인터페이스를 기대할 수 있다.

- IUnknown 인터페이스는 QueryInterface(), AddRef(), Release() 함수를 포함하고 있으며, 이 함수들은 각각 묻기 버튼, 활성화 버튼, 비활성화 버튼에 해당한다.

 

4. 묻기 버튼과 QueryInterface() 함수

 

- QueryInterface() 함수를 이용해 필요한 용도를 수행할 수 있는지 물어본다.

- 만약 COM 객체가 그러한 용도를 수행할 수 있다면 그에 맞는 인터페이스 포인터를 건네줄 것이고, 그렇지 않다면 오류 코드를 리턴하면서 아무 것도 건네주지 않을 것이다.

- QueryInterface() 함수를 호출하면서 첫번째 매개변수에 용도를, 두번재 매개변수에 그 용도에 해당하는 리모콘의 포인터를 입력. (CoCreateInterface() 함수에서 사용했던 네번째, 다섯번째 매개변수와 일치함)

 

5. 활성화 버튼과 AddRef() 함수

- 복제된 리모콘은 활성화 버튼을 누른 후에야 로봇에게 다른 명령을 수행할 수 있다.

- 새로운 인터페이스를 선언한 후 리모콘을 복제하고, 복제된 인터페이스 포인터도 결국 같은 메모리 공간을 가리키므로 그대로 명령을 수행할 수 있다.

- 어디서 얼마나 많은 인터페이스 포인터를 복제하여 COM 객체를 소멸시킬 시기를 알 수 없게 되므로, COM 기술에서는 COM 객체를 자동소멸 시키는 방식을 채택.

- COM 객체가 관리하는 개수를 '참조 개수'라고 하며, 참조 개수가 0일대 자동 소멸한다.

- AddRef() 함수는 'Add Reference count', Release() 함수는 'Release reference count' 라는 의미.

-  AddRef() 함수의 호출은 매개변수가 없기 때문에 간단하다.

- CoCreateInstance() 나 QueryInterface() 함수를 통해 받은 인터페이스는 이미 참조 개수가 증가된 상태이기 때문에, 따로 AddRef() 함수를 사용할 필요가 없다.

 

6. 비활성화 버튼과 Release() 함수

- 비활성화 명령이 로봇에게 전달될 때마다 로봇은 리모콘과의 연결을 끊고 아직 남아 있는 연결이 있는지 확인.

- 남아있는 연결이 있다면 로봇은 계속 명령에 대기하지만, 남은 연결이 하나도 없다면 로봇은 자폭을 결정하고 소멸하게 된다.

- COM 객체는 Release() 함수를 호출하여 참조 개수가 0이 될때 delete 연산자 등을 이용해 스스로 소멸.

- AddRef() 함수와 Release() 함수는 반드시 짝을 이루어 사용된다.

 

7. HRESULT와 매크로

 

- COM 기술에서 대부분의 함수는 HRESULT라는 자료형을 리턴.

- 함수 호출의 성패 여부를 알아내기 위해 최상위 비트를 확인 (0이면 성공, 1이면 실패 의미)

- 대부분 미리 정해놓은 HRESULT 값을 사용.

- 성공한 코드는 'S_(SUCCESS)'를 포함하고, 실패한 코드는 'E_(ERRPR)'를 포함한다.

- 정의된 코드값을 보면 성공한 코드는 대부분 0으로 시작하고, 오류 코드는 모두 8로 시작한다.

 

[출처 : DirectShow 멀티미디어 프로그래밍 (한빛미디어)]


posted by 유돌이
2008. 12. 20. 11:57 ATL / WTL

COM관련 라이브러리를 사용하려면

CoInitialize(NUUL)를 먼저 호출해서 초기화 함


posted by 유돌이
prev 1 next