BHO에 접근하기 위한 방법은 여러가지가 있습니다.

그중 가장 크게 나눈다면 타 프로세스에서 IE에 접근하는 방법과 IE내부(BHO 설치 후)에서 접근하는 방법으로 나눌수 있을것 같습니다.


그 중 개인적으로는 가장 구현하기 편하고, 응용하기도 편한 타 프로세스에서 IE에 접근하는 방법을 포스팅하겠습니다.


포스팅할 내용은 주요 코드 위주로 설명하며 세부적인 응용은 포스팅하지 않겠습니다.


일단....가장먼저 IE의 PID를 알아야겠죠.

PID를 얻어오는 방법은 생략하겠습니다. 뭐 직접 입력해줘도 되는거니깐요.


PID를 얻었다면

DWORD dwPID;

HWND hwnd = GetWinHandle(dwPID);

로 IE의 핸들을 얻어옵니다. 해당 핸들을 이용하여 다음은 접근할 IE를 찾아야하는데, 요세 나오는 브라우져들 특징은 탭기능이 있다는겁니다. 그 많은 탭중에서 현재 사용하고 있는 탭을 찾아야합니다. 저같은 경우는 모든 핸들을 출력해주고, 원하는 핸들을 선택하도록 했는데 이 방법은 다음에 포스팅 하도록 하겠습니다.


외부에서 BHO에 접근하는 방법도 여러가지가 있는데 이번엔  ObjectFromLresult을 이용하여 접근하는 방법입니다.

HINSTANCE hins = ::LoadLibrary(_T("OLEACC.DLL"));

위와 같이 OLEACC.DLL의 인스턴스를 얻어옵니다.

이 후 얻은 인스턴스를 이용하여 ObjectFromLresult 함수의 주소를 얻습니다.

LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hins , "ObjectFromLresult" );

ObjectFromLresult함수에 대한 설명은 MSDN을 참고하시면될것같습니다.

ObjectFromLresult의 2번째 인자값을 IID_IHTMLDocument2 로 주시면 4번째 인자값이 OUT으로써 IHTMLDocument2 의 주소값을 받아옵니다. 간단히 작성하면, 

IHTMLDocument2* pIhtmldocument2;

HRESULT hresult = (*pfObjectFromLresult)( Lresult , IID_IHTMLDocument2 , 0 , ( void**) pIhtmldocument2 );

IHTMLdocument2를 얻어왔다면 접근은 다 했네요. 

이후에 1,2,3 왔다 갔다 하시면서 원하시는 기능을 추가하시면됩니다. 


적어놓고 보니 생각보다 간단하네요.

첨부로 MSDN에 나온 ObjectFromLresult함수 내용입니다. 

http://msdn.microsoft.com/en-us/library/windows/desktop/dd373605(v=vs.85).aspx

STDAPI ObjectFromLresult(

  _In_   LRESULT lResult,
  _In_   REFIID riid,
  _In_   WPARAM wParam,
  _Out_  void **ppvObject
);


Parameters

lResult [in]

Type: LRESULT

A 32-bit value returned by a previous successful call to the LresultFromObject function.

riid [in]

Type: REFIID

Reference identifier of the interface to be retrieved. This is IID_IAccessible.

wParam [in]

Type: WPARAM

Value sent by the associated WM_GETOBJECT message in its wParam parameter.

ppvObject [out]

Type: void**

Receives the address of the IAccessible interface on the object that corresponds to the WM_GETOBJECTmessage.


Posted by Nvdark
,

일단 BHO에 접근하여 IHTMLDocument2를 얻었다는 가정하에 시작.

IHTMLDocument2  *pHTMLDoc2


BSTR ValueChange;

BSTR TagID;

ValueChange = CStringToBstr(g_BhoTagValueChange);

TagID = CStringToBstr(g_BhoTagID);


CComQIPtr <IHTMLDocument3> pDocu3_ValueChange(pHTMLDoc2);

CComPtr <IHTMLElement> pElement_ValueChange;


pDocu3_ValueChange->getElementById(TagID, &pElement_ValueChange);


CComQIPtr <IHTMLInputElement> pInput_ValueChange(pElement_ValueChange);


if( pInput_ValueChange )

{

pInput_ValueChange->put_value(ValueChange);

}

CStringToBstr()은 Edit Control 에서 입력받은 CString을 BSTR로 변환해주기 위해 사용함.

주요 내용은 

CComQIPtr <IHTMLDocument3> pDocu3_ValueChange(pHTMLDoc2);

로 IHTMLDocument2를 3으로 바꿔주고

pDocu3_ValueChange->getElementById(TagID, &pElement_ValueChange);

입력받은 테그 ID로 해당 엘리먼트를 검색 후

CComQIPtr <IHTMLInputElement> pInput_ValueChange(pElement_ValueChange);

(INPUT테그일경우) IHTMLInputElement로 변환함

정상적으로 변환되었다면 put_value함수를 이용해 값을 변경할 수 있음.

반대로 get_value를 사용하면 해당값을 얻어올 수 있다.

Posted by Nvdark
,

1.6.11.42 Update

MemGet Project 2012. 10. 15. 09:40

1.6.11.42 Update

+수정내용

 - BHO Form View 기능 추가

 - [UI] 접근 및 옵션 선택으로 구분

+필요 수정 내용

 - Tag ID가 일부 표시 안됨(인젝션된 스크립트와 일부 다르게 출력)

 - 데이터 변조 기능 추가 예정




Posted by Nvdark
,

뭐 얼마나 필요할질 모르겠지만 일단 끄적이기!!!

BHO에 접근해서 사용자가 원하는 스크립트나 값, HTML 등을 수정할 수가 있다 ㅎㅎ


여기선 execScript()를 사용하기 위한 접근만 언급함!  나머지는 차차..시간될때.. ㅎㅎ

뭐 일단 접근만 하면 나머지는 동작만 시키면되는거니....접근방법만 간단히 요약함...


내가 한 방법은, 원하는 웹 브라우져의 IHTMLDocument2를 얻고(일단 얻었다는 가정하에 시작) 

 

IHTMLDocument2 *NvBho_pDocument2; 

으로 선언되어 있다고 한다면

HRESULT hr;

IHTMLWindow2 *NvBho_pWindow2;

hr = NvBho_pDocument2->get_parentWindow(&NvBho_pWindow2);


로 접근 후 

NvBho_pWindow2->execScript() 를 이용하여 스크립트를 실행 할 수 있다. 


실제 스크립트를 삽입하여 실행한 화면++++++++++++++++++++++++++++++++++++++++++++++++++++=

예시)



스크립트는 간단하게 입력폼이나 옵션에 대한 ID와 값을 실시간으로 화면에 뿌려주는 동작을 함.




Posted by Nvdark
,