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 질답 모음]
- 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 에 디버깅을 걸었으나 함수에 들어가지지 조차 않는 문제점이 발견되었다.
이와 같은 문제점을 다른 사람도 겪고 있는 것을 데브피아에서 발견하였다.
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 를 기록만 해주면 끝난다..
(제일 참고에 많이 도움이 된 사이트.. 역시 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
'ATL / WTL' 카테고리의 다른 글
ATL로 다이얼로그에 IWebBrowser2 올리기 (0) | 2008.12.20 |
---|---|
BHO 함수란?? (0) | 2008.12.20 |
ATL COM을 이용한 ICommand만들기(3) (0) | 2008.12.20 |
ATL COM을 이용한 ICommand만들기(2) (0) | 2008.12.20 |
ATL COM을 이용한 ICommand만들기(1) (0) | 2008.12.20 |