2011. 8. 17. 04:02

WebBrowser Control 에서 스크립트에 COM Object 노출하기

출처: http://support.microsoft.com/kb/188015/en-us/

WebBrowser 컨트롤, CHtmlView 또는 CDHtmlDialog 등을 이용하여 HTML 호스팅을 사용하는 경우, 스크립트상에서 특정 COM Object  를 노출하여 기능을 확장하고 싶을 때가 있습니다. 이렇게 하기 위한 Microsoft 에서 소개하는 공식적인 방법은  GetExternal 을 구현하는 것입니다.

1. IDocHostUIHandler 구현
2. IDocHostUIHandler::GetExternal 메소드 구현, IDispatch 파라미터에 노출하려고 하는 인터페이스를 설정합니다.
STDMETHOD(GetExternal)(IDispatch** ppDispatch)
{
   // Assumes you inherit from IDispatch
   *ppDispatch = (IDispatch*)this;
   (*ppDispatch)->AddRef();

   return S_OK;
}

3.  GetIDsOfNames 에서 메소드 또는 속성의 DISPID 를 반환합니다. 마법사를 이용하여 메소드 또는 속성을 추가하였다면, 자동으로 생성됩니다.
4. IDispatch::Invoke 에 해당 DISPID 를 가지는 메소드 또는 속성을 구현합니다.
STDMETHODIMP CAtlBrCon::Invoke(DISPID dispidMember, REFIID riid,
                               LCID lcid, WORD wFlags,
                               DISPPARAMS* pDispParams,
                               VARIANT* pvarResult,
                               EXCEPINFO* pExcepInfo, UINT* puArgErr)
{
   switch (dispidMember)
   {
      case DISPID_MYMETHOD_OR_PROPERTY:
         // Do something here

      default:
         return E_INVALIDARG;
   }

   return S_OK;
}	

5. 스크립트에서 아래와 같은 형식으로 메소드 또는 속성을 호출합니다. 
 <SCRIPT LANGUAGE="VBScript">
    Sub SomeControl_OnClick
       window.external.yourMethod
    End Sub
 </SCRIPT>