회사에서 사용하는 특정 사이트의 UI가 너무나 불편한데, 개선이 쉽지 않아 자바스크립트로 가공(?)해서 사용하기 위해 오랫만에 VB6으로 BHO를 만들어봤습니다.
사용중인 BHO 소스는 회사 업무와 관련된 내용이 있어 공개 할 수 없지만, BHO를 만들면서 수집했던 자료를 정리해서 공개합니다.
BHO(Browser Helper Object)란?
http://en.wikipedia.org/wiki/Browser_Helper_Object
MS Internet Explorer에서 작동하는 플러그인 형태의 DLL로, IE의 인스턴스가 실행 될 때마다 로딩된다.
또한 Windows Explorer에서도 작동한다.
레지스트리 정보
다음의 레지스트리 위치에 BHO에 해당하는 DLL의 CLSID를 키로 추가한다.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects
ex) 레지스트리 예제
|
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\{0AFD85AC-EBCE-4502-AAAA-E6098B71DCFC}] "NoExplorer"=dword:00000001 |
구현 (대략적인 설명)
- 클래스 모듈에서 IObjectWithSite Interface를 구현한다.
- ActiveX DLL을 레지스트리에 등록(regsvr32.exe)한다.
- 위에서 등록한 DLL의 CLSID 정보를 Browser Helper Objects 레지스트리 위치에 등록한다.
- Internet Explorer를 실행해서 확인한다.
구현 (VB6)
1) 새 프로젝트 만들기
프로젝트 > 속성 > 구성요소에서 "버전 호환성"을 "이진 호환성"으로 선택
[참고] 프로젝트 버전호환성3가지(호환없음,프로젝트,이진)용도 http://support.microsoft.com/kb/600844/ko
2) 프로젝트 > 참조에 추가
- Microsoft HTML Object Library
- Microsoft Internet Controls
- VB IObjectWithSite Interface (또는 VBSHELL.TLB.tlb 등의 IObjectWithSite Interface를 포함하고 있는 TLB 사용)
3) 클래스 모듈 추가 (Class1)
4) Class1 모듈에 다음 문장 추가
|
' IObjectWithSite Interface 구현을 위한 선언 Implements IObjectWithSiteTLB.IObjectWithSite ' 클래스 모듈 변수 Private WithEvents m_ie As InternetExplorer ' BHO를 로드한 IE Browser Object Private m_Site As IUnknownVB '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' GetSite / BHO Interface '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub IObjectWithSite_GetSite(ByVal priid As IObjectWithSiteTLB.GUIDPtr, ppvObj As IObjectWithSiteTLB.VOIDPtr) m_Site.QueryInterface priid, ppvObj End Sub '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' SetSite / BHO Interface '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub IObjectWithSite_SetSite(ByVal pSite As IObjectWithSiteTLB.IUnknownVB) Set m_Site = pSite Set m_ie = pSite End Sub |
5) m_ie를 이용한 이벤트 핸들러 추가
m_ie 변수를 WithEvents로 선언했으므로 InternetExplorer 이벤트를 받을 수 있다.
|
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' DocumentComplete Event '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Sub m_ie_DocumentComplete(ByVal pDisp As Object, URL As Variant) ' MsgBox "m_ie_DocumentComplete => " & URL ' MsgBox "m_ie_DocumentComplete => " & m_ie.LocationURL End Sub |
6) 파일 > DLL 만들기 실행
7) Browser Helper Objects 레지스트리 등록
[참고] CLSID는 레지스트리 HKEY_CLASSES_ROOT 위치에서 프로젝트명으로 검색하면 후 클래스명 하위 Clsid 키 값에서 알 수 있다.
|
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects] [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Browser Helper Objects\{0AFD85AC-EBCE-4502-AAAA-E6098B71DCFC}] "NoExplorer"=dword:00000001 |
8) Internet Explorer 실행 후 테스트
[참고] BHO가 실행되지 않으면 IE > 도구 > 추가 기능 관리에서 해당 BHO가 "사용 함"으로 되어있는지 확인한다.
샘플 프로젝트 (VB6)
참고 URL
- [MSDN > Technical Articles] Browser Helper Objects: The Browser the Way You Want It http://msdn.microsoft.com/en-us/library/bb250436.aspx
- [MSDN] IObjectWithSite Interface http://msdn.microsoft.com/en-us/library/aa768220.aspx
- [MSDN] Browser Extensions http://msdn.microsoft.com/en-us/library/Aa753587.aspx
☞ 본문 출처 : http://www.enjoydev.com/blog/bho
☞ 담비노트 1.5에서 작성 후 옮긴 글입니다. http://www.dambisoft.co.kr/
☞ 본인의 글 입니다. 이 글을 다른 곳에 게재하는 경우 본문 출처를 밝혀주시기 바랍니다.
댓글을 달아 주세요