회사에서 사용하는 특정 사이트의 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}]

@="TestBHO.BHO"

"NoExplorer"=dword:00000001


구현 (대략적인 설명)


  1. 클래스 모듈에서 IObjectWithSite Interface를 구현한다.
  2. ActiveX DLL을 레지스트리에 등록(regsvr32.exe)한다.
  3. 위에서 등록한 DLL의 CLSID 정보를 Browser Helper Objects 레지스트리 위치에 등록한다.
  4. 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}]

@="TestBHO.BHO"

"NoExplorer"=dword:00000001

8) Internet Explorer 실행 후 테스트

[참고] BHO가 실행되지 않으면 IE > 도구 > 추가 기능 관리에서 해당 BHO가 "사용 함"으로 되어있는지 확인한다.



샘플 프로젝트 (VB6)





참고 URL



☞ 본문 출처 : http://www.enjoydev.com/blog/bho(새 창으로 열기)
☞ 담비노트 1.5에서 작성 후 옮긴 글입니다. http://www.dambisoft.co.kr/(새 창으로 열기)

☞ 본인의 글 입니다. 이 글을 다른 곳에 게재하는 경우 본문 출처를 밝혀주시기 바랍니다.

2011/08/17 16:31 2011/08/17 16:31

트랙백 주소 :: http://optant.ismine.net/blog/trackback/173

댓글을 달아 주세요