'3. Implementation/Internet Explorer'에 해당되는 글 7건

  1. 2011.08.17 WebBrowser 응용 프로그램에서 스크립트 함수 호출
  2. 2011.08.17 WebBrowser Control 에서 스크립트에 COM Object 노출하기
  3. 2011.07.23 CHtmlView / CDHtmlDialog 에서 MSHTML 엔진 버전 선택하기
  4. 2009.10.22 Automated IE SaveAs MHTML
  5. 2009.06.16 동적으로 Option 엘리먼트 추가하기
  6. 2009.02.22 Debug Script in Internet Explorer
  7. 2008.09.21 How to get IHTMLDocument2 from a HWND
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>
 
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>
2011. 7. 23. 20:50

CHtmlView / CDHtmlDialog 에서 MSHTML 엔진 버전 선택하기

IE8, 9 가 출시되었음에도 불구하고 CHtmlView 와 CDHtmlDialog 의 MSHTML 엔진 버전은 6 또는 7 버전을 사용합니다. MSDN 에는 호환성의 이유로  디폴트로 IE7 Standards Mode 로 실행된다고 명시하고 있습니다.

다음 방법을 이용하여 MSHTML 엔진의 버전을 IE8 또는 IE9 로 명시할 수 있습니다.

HTML 문서에 지정하는 방법

아래처럼 html 에 meta 태그를 선언하면 됩니다.

<!DOCTYPE html>
<html>
  <head>
  	<meta http-equiv="X-UA-Compatible" content="IE=9" >


레지스트리를 이용하는 방법

IE8 Standards Mode 로 실행하는 방법 (IE9 는 9000 입니다)

[(HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE)\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"MyApplication.exe" = dword 8000 (Hex: 0x1F40)


IE7 Standards Mode 로 실행하는 방법

[(HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE)\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"MyApplication.exe" = dword 7000 (Hex: 0x1B58)


IE8 Standards Mode 로 강제하는 방법

[(HKEY_CURRENT_USER or HKEY_LOCAL_MACHINE)\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION]
"MyApplication.exe" = dword 8888 (Hex: 0x22B8)


다음은 T-Set (제가 실험적으로 개발한) 의 Result View 에서 IE9 모드를 지정한 후 HTML 5 의 canvas 요소를 사용한 예입니다. (HTML5 의 canvas 요소는 IE9 에서만 지원되는 것 같습니다.)


다음은 위 그래프 HTML 소스입니다.


위 예제에 사용된 RGraph(http://www.rgraph.net/) 는 상업적 사용시에는 무료가 아니므로 사용에 주의하시기 바랍니다.

참고: 
http://blogs.msdn.com/b/ie/archive/2009/03/10/more-ie8-extensibility-improvements.aspx
http://msdn.microsoft.com/en-us/library/ee330730%28VS.85%29.aspx#browser_emulation  
http://stackoverflow.com/questions/4612255/regarding-ie9-webbrowser-control  
2009. 10. 22. 06:33

Automated IE SaveAs MHTML

MHTML 로 저장하는 훌륭한 방법을 제공한다.



출처 : http://www.codeproject.com/KB/shell/iesaveas.aspx?display=Print
2009. 6. 16. 10:08

동적으로 Option 엘리먼트 추가하기

// Option 엘리먼트를추가하는것이쉽지않다.. (MSDN 처럼동작하지않음)

// 참고: http://www.codeproject.com/KB/COM/htmldocument.aspx

 

 

CComQIPtr<IHTMLDocument2> spHTMLDoc2 =  GetHtmlDocument();

CComQIPtr<IHTMLWindow2> spWindow;

CComPtr<IDispatch> spDispatch;

 

spHTMLDoc2->get_Script(&spDispatch);

spWindow = spDispatch;

 

CComQIPtr<IHTMLOptionElementFactory> spOptionFactory;

spWindow->get_Option(&spOptionFactory);

 

CComQIPtr<IHTMLOptionElement> spOptionElement;

 

_variant_t varSelected = VARIANT_FALSE;

spOptionFactory->create(_variant_t(_T("New Option")), _variant_t(VARIANT_FALSE), _variant_t(VARIANT_FALSE), varSelected, &spOptionElement);

 

CComQIPtr<IHTMLSelectElement> spSelectElement = spHTMLElement;

ASSERT(spSelectElement != NULL);

CComQIPtr<IHTMLElement> spTempElement = spOptionElement;

 

strOptionValue.Format(_T("%d"), nIndex);

 

spTempElement->setAttribute(_T("value"), _variant_t(_bstr_t(_T("Some Value"))), 0 );

spSelectElement->add(spTempElement, _variant_t(1));

 

/*

// MSDN 에서언급한대로하면아래와같은데...동작하지않는다.

CComQIPtr<IHTMLSelectElement> spSelectElement = spHTMLElement;

CComQIPtr<IHTMLElement> spTempElement;

hr = spHTMLDoc2->createElement(_T("option"), &spTempElement);

hr = spSelectElement->add(spTempElement, _variant_t(1));*/


출처 : http://www.codeproject.com/KB/COM/htmldocument.aspx
2009. 2. 22. 02:57

Debug Script in Internet Explorer


인터넷 익스플로어에서 동작하는 스크립트 JavaScript 또는 VBScript를 디버깅하는 방법을 소개한다.

인터넷 익스폴로어에서 동작하는 스크립트를 디버깅하기 위해서는 먼저 디버깅 환경을 제공하는 디버거(Debugger)가 설치되어 있어야 한다.

http://www.jonathanboutelle.com/mt/archives/2006/01/howto_debug_jav.html 를 보면, 디버거로서 3가지를 소개하고 각각에 대해서 다음과 같이 정리하고 있다.

* Microsoft Script Debugger : Pathetic (불충분함)
* Visual Studio .Net : Expensive and overkill (비싸고 좀 오버다~)
* Microsoft Script Editor : The best option (최고다)

라고 하는데, 굳이 Visual Studio가 설치되어 있는데 Microsoft Script Editor 를 이용할 필요는 없을 것이다. 마찬가지로 단지 인터넷 익스플로어에서 동작하는 스크립트만 디버깅하면 된다면 굳이 Visual Studio 보다는 Microsoft Script Editor를 설치하는게 나을 것이다. (Visual Studio는 비싸다~) Microsoft Script Editor 는 Office XP / 2003에는 번들로 제공되기 때문에 이 오피스가 설치되어 있다면 Microsoft Script Editor를 사용할 수 있다. 만약 위 3가지 디버거중에서 아무것도 설치되어 있지 않다면 Microsoft Download Center에서 Microsoft Script Editor를 다운 받길 바란다.

나는 MFC를 이용하여 주로 개발을 하기 때문에 Visual Studio가 이미 설치되어 있다. 그래서 NET 2005 를 사용하여 디버깅하는 모습을 소개할 것이다. (Microsoft Script Editor 를 이용하는 방법은 위에서 소개한 사이트를 참고하자.)

자 이제 디버거가 설치되어 있다면 다음 해야할 일은 스크립트를 디버깅 할 수 있도록 옵션을 설정하는 것이다. 디폴트로 스크립트 디버깅은 아래 그림과 같이 "스트립트 디버깅 사용 안 함"으로 되어 있는 데 이 항목 체크를 해제한 후 확인을 클릭한다.

인터넷 익스플로어(IE) > 도구(Tools) > 인터넷 옵션(Internet option) > 고급 탭 (Advanced)


"스크립트 디버깅 사용안 함"을 해제하면, 인터넷 익스플로어의 보기(View) 메뉴에 스크립트 디버거 항목이 보일것 이다.


자 이제 스크립트가 수행되는 HTML 파일을 열고, 인터넷 익스플로어 메뉴에서 보기 > 스크립트 디버거 > 열기를 선택하면 아래 그림과 같이 디버거를 선택하는 메뉴가 나올 것이다.


원하는 디버거를 선택하자. 예에서는 새 인스턴스 Visual Studio 2005를 선택할 것이다. 선택하면 아래 그림과 같이 HTML 코드가 보이고 <Script > 태그 내에서는 아래 그림과 같이 중단점을 설정할 수 가 있으며, 인터넷 익스플로어에서 함수 수행 시 중단점이 설정되어 있다면 중단점이 있는 곳으로 이동하여 디버거에서 변수값 확인, 단계별 실행등을 수행할 수 있다.


참고로, Script 내에서 중단점을 설정할 수 있는데 debugger 함수를 사용하면 된다. 아래는 Sum 함수 중간에 debugger 함수를 이용하여 중단점을 설정한 예이다.

 function Sum()
  {
    var a=10;
    var b=20;
    var c=a+b;
    debugger;
    alert(c);
  }

이와 같이 디버깅 환경을 이용하면 좀더 편리하게 스크립트를 작성할 수 있을것이다.

참고 사이트 :

* http://www.jonathanboutelle.com/mt/archives/2006/01/howto_debug_jav.html
* http://www.code101.com/Code101/DisplayArticle.aspx?cid=67

2008. 9. 21. 06:01

How to get IHTMLDocument2 from a HWND


SUMMARY

This article shows how to get the IHTMLDocument2 interface from a HWND. If Microsoft Active Accessibility (MSAA) is installed, you can send the WM_HTML_GETOBJECT message to the document's window (with the window class "Internet Explorer_Server") and then pass the result from SendMessage to an MSAA function, ObjectFromLresult, to get a fully marshaled IHTMLDocument2 pointer.

Back to the top

MORE INFORMATION

You must have Active Accessibility components installed on the system for the code described in this section to work. Client developers can use the SDK to develop and update Active Accessibility aids. If you incorporate the latest version of Active Accessibility and distribute new versions of your accessibility aids, you must distribute the runtime components (RDK) for clients that have been developed for Microsoft Windows 95, Windows 98, or Windows NT 4.0 with Service Pack 4 or 5. It's not necessary to include the RDK for clients developed solely for Windows 2000, or for Windows NT 4.0 with Service Pack 6. The new components are already included in these operating systems.

See the "References" section of this article for information about Active Accessibility and where to download the Active Accessibility SDK.

#include <mshtml.h>
#include <atlbase.h>
#include <oleacc.h>
BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
{
 TCHAR buf[100];
 ::GetClassName( hwnd, (LPTSTR)&buf, 100 );
 if ( _tcscmp( buf, _T("Internet Explorer_Server") ) == 0 )
 {
  *(HWND*)lParam = hwnd;
  return FALSE;
 }
 else
  return TRUE;
};
//You can store the interface pointer in a member variable
//for easier access
void CDlg::OnGetDocInterface(HWND hWnd)
{
 CoInitialize( NULL );
 // Explicitly load MSAA so we know if it's installed
 HINSTANCE hInst = ::LoadLibrary( _T("OLEACC.DLL") );
 if ( hInst != NULL )
 {
  if ( hWnd != NULL )
  {
   HWND hWndChild=NULL;
   // Get 1st document window
   ::EnumChildWindows( hWnd, EnumChildProc, (LPARAM)&hWndChild );
   if ( hWndChild )
   {
    CComPtr<IHTMLDocument2> spDoc;
    LRESULT lRes;
   
    UINT nMsg = ::RegisterWindowMessage( _T("WM_HTML_GETOBJECT") );
    ::SendMessageTimeout( hWndChild, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes );
    LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInst, _T("ObjectFromLresult") );
    if ( pfObjectFromLresult != NULL )
    {
     HRESULT hr;
     hr = (*pfObjectFromLresult)( lRes, IID_IHTMLDocument, 0, (void**)&spDoc );
     if ( SUCCEEDED(hr) )
     {
      // Change background color to red
      spDoc->put_bgColor( CComVariant("red") );
     }
    }
   } // else document not ready
  } // else Internet Explorer is not running
  ::FreeLibrary( hInst );
 } // else Active Accessibility is not installed
 CoUninitialize();
}

NOTE: Before Internet Explorer 5.5, frames were implemented by hosting a new instance of Shdocvw.dll, and each frame had a separate window associated with it. Internet Explorer 5.5 implements native frames for better performance, and all frames are rendered by the same instance of Shdocvw.dll. Since there will not be a HWND for each frame for Internet Explorer 5.5 and later, the sample code described in this section will work to get to the document of the main window only. You can still get to each frame's document by using the frames collection of the main document.

Back to the top

REFERENCES

The SDK for developers and the RDK, which installs the Active Accessibility runtime components onto the operating system, can be downloaded from the following Microsoft Web site:

http://www.microsoft.com/downloads/details.aspx?FamilyID=9b14f6e1-888a-4f1d-b1a1-da08ee4077df&DisplayLang=en (http://www.microsoft.com/downloads/details.aspx?FamilyID=9b14f6e1-888a-4f1d-b1a1-da08ee4077df&DisplayLang=en)

For information about the Microsoft Active Accessibility support provided by the MSHTML component of Microsoft Internet Explorer, visit the following Web site:

http://msdn.microsoft.com/workshop/browser/accessibility/overview/overview.asp (http://msdn.microsoft.com/workshop/browser/accessibility/overview/overview.asp)

For more information, click the following article number to view the article in the Microsoft Knowledge Base:

176792 (http://support.microsoft.com/kb/176792/) How to connect to a running instance of Internet Explorer

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