2011. 8. 17. 05:08

WebBrowser 응용 프로그램에서 스크립트 함수 호출

출처: http://support.microsoft.com/kb/q185127/

 웹 페이지에 포함된 스크립트 함수를 호출하려면 IDispatch를 사용해야 합니다. 웹 페이지에 포함된 스크립트 함수를 Visual C++ 응용 프로그램에서 호출하려면 아래 단계를 수행합니다.
  1. HTML 문서의 IDispatch를 구합니다.
  2. IDispatch::GetIDsOfNames를 호출하여 스크립트 함수의 ID를 구합니다.
  3. IDispatch::Invoke를 호출하여 함수를 실행합니다.
아래의 Visual C++ 소스 코드는 사용자의 응용 프로그램에서 이를 구현하는 방법을 보여줍니다. 이 코드에서는 #import 문에서 생성된 스마트 포인터를 사용합니다. 소스 코드 파일 중 하나(Stdafx.h 파일이 가장 적합)에 이 #import 문을 포함해야 합니다. 

#import "C:\winnt\system32\mshtml.tlb" // location of mshtml.tlb

   void CMyClass::ExecuteScriptFunction()
   {
      // m_WebBrowser is an instance of IWebBrowser2
      MSHTML::IHTMLDocument2Ptr spDoc(m_WebBrowser.GetDocument());

      if (spDoc)
      {
         IDispatchPtr spDisp(spDoc->GetScript());
         if (spDisp)
         {
            // Evaluate is the name of the script function.
            OLECHAR FAR* szMember = L"evaluate";
            DISPID dispid;

            HRESULT hr = spDisp->GetIDsOfNames(IID_NULL, &szMember, 1,
                                           LOCALE_SYSTEM_DEFAULT, &dispid);

            if (SUCCEEDED(hr))
            {
               COleVariant vtResult;
               static BYTE parms[] = VTS_BSTR;

               COleDispatchDriver dispDriver(spDisp);

               dispDriver.InvokeHelper(dispid, DISPATCH_METHOD, VT_VARIANT,
                                       (void*)&vtResult, parms,
                                       "5+Math.sin(9)");
            }
         }
      }
   }


아래는 evaluate 함수를 포함하는 웹 페이지의 HTML입니다. 

<HTML>
  <HEAD>
    <TITLE>Evaluate</TITLE>

    <SCRIPT>
      function evaluate(x)
      {
         alert("hello")
         return eval(x)
      }
    </SCRIPT>
  </HEAD>

  <BODY>
  </BODY>
</HTML>