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.