2011. 8. 17. 04:02
WebBrowser Control 에서 스크립트에 COM Object 노출하기
2011. 8. 17. 04:02 in 3. Implementation/Internet Explorer
출처: http://support.microsoft.com/kb/188015/en-us/
WebBrowser 컨트롤, CHtmlView 또는 CDHtmlDialog 등을 이용하여 HTML 호스팅을 사용하는 경우, 스크립트상에서 특정 COM Object 를 노출하여 기능을 확장하고 싶을 때가 있습니다. 이렇게 하기 위한 Microsoft 에서 소개하는 공식적인 방법은 GetExternal 을 구현하는 것입니다.
1. IDocHostUIHandler 구현
2. IDocHostUIHandler::GetExternal 메소드 구현, IDispatch 파라미터에 노출하려고 하는 인터페이스를 설정합니다.
3. GetIDsOfNames 에서 메소드 또는 속성의 DISPID 를 반환합니다. 마법사를 이용하여 메소드 또는 속성을 추가하였다면, 자동으로 생성됩니다.
4. IDispatch::Invoke 에 해당 DISPID 를 가지는 메소드 또는 속성을 구현합니다.
5. 스크립트에서 아래와 같은 형식으로 메소드 또는 속성을 호출합니다.
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>