'Script error'에 해당되는 글 1건

  1. 2007.10.29 Internet Explorer에서 스크립트(script) 오류(error)창 않뜨게 하기

Internet Explorer에서 스크립트(script) 오류(error)창 않뜨게 하기

개발 2007. 10. 29. 12:19

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

저자 : hanburn

날짜 : 2007-10-26

 

인터넷익스플로러(Internet Explorer, 이하 IE)로 웹서핑을 하다보면 페이지에 스크립트 오류(script error)가 발생시에 오류창이 뜨게 되어 있습니다. 스크립트 오류가 발생하는 경우는 서핑중인 페이지에서 사용한 스크립트의 문제로 페이지 자체의 오류라고 할 수 있습니다. 사소한 오류의 경우에 IE 7.0에서 확인한 결과 오류창이 뜨지 않는데, WebBrowser Control을 사용하여 프로그램에서 해당 페이지를 서핑할 경우에 오류창이 아래와 같이 표시가 되었습니다.
사용자 삽입 이미지

이것은 네이버에서 OpenAPI를 이용하여 CNN 뉴스를 듣게 만든 위젯에서(iCNN) 발생하였는데, ‘아니오를 누르면 프로그램은 문제없이 실행 되지만 실행할 때 마다 오류메시지가 보이니까 프로그램이 버그를 가지고 있는 것 같아서 수정이 필요하였습니다. (실제적인 원인은 cnn에서 제공하는 스크립트 문제입니다~ ㅋㅋ) 이문제를 해결하기 위해서 검색을 해보니, IE에서 스크립트 오류시에 나오는 메시지 창을 핸들링 할 수 있는 방법이 있었습니다.

 

(How to handle script errors as a WebBrowser control host)

참고 : http://support.microsoft.com/kb/261003

 

WebBrowser control에서 에러가 발생하면 컨테이너에서 IOleCommandTarget 인터페이스가 구현되어 있으면 IOleCommandTarget::Exec 메소드를 호출하게 되어 있는데, 이때 nCmdID CGID_DocHostCommandHandler로 전달 된다고 합니다. 따라서 구현시에 nCmdID를 체크하여 CGID_DocHostCommandHandler인 경우에 S_OK를 반환해주면 오류창이 않뜬다고 합니다.

 

그래서 IOleCommandTarget을 아래처럼 가볍게 구현을 해주었습니다. 재사용성을 위해서 템플릿 클래스로 만들었는데, 중요 부분만 발췌하면 아래와 같습니다.

 

virtual HRESULT STDMETHODCALLTYPE QueryStatus(const GUID __RPC_FAR *pguidCmdGroup, ULONG cCmds, OLECMD __RPC_FAR prgCmds[], OLECMDTEXT __RPC_FAR *pCmdText)

{

        T* pT = static_cast<T*>(this);

 

        return m_spDefaultOleCommandTarget->QueryStatus(pguidCmdGroup, cCmds, prgCmds, pCmdText); 

 

}

 

virtual HRESULT STDMETHODCALLTYPE Exec(const GUID __RPC_FAR *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANT __RPC_FAR *pvaIn, VARIANT __RPC_FAR *pvaOut)

{

        T* pT = static_cast<T*>(this);

        BOOL bCmdGroupFound = FALSE;

 

        if (nCmdID == OLECMDID_SHOWSCRIPTERROR)

        {

                // 요기가 중요

               (*pvaOut).vt = VT_BOOL;

               (*pvaOut).boolVal = VARIANT_TRUE;

                return S_OK;

        }

        return m_spDefaultOleCommandTarget->Exec(pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut);             

}

 

참고로 이 방법이 동작하기 위해서는 IE인터넷 옵션 -> 고급에서 아래그림처럼 스크립트 디버깅 사용안함에 체크가 되어 있어야 합니다. 기본으로는 이 항목에 체크가 되어 있으니 별 문제가 없는데, 혹시라도 작동이 않된다면 이옵션을 체크해 보아야 합니다.

사용자 삽입 이미지


그리고 검색하면서 IE programming쪽을 조금 보게 되었는데, IE가 생각보다 잘 만들어진 것 같습니다. (사용자 입장이 아닌, 개발자 입장에서) IE도 윈도우의 탐색기(shell)처럼 여러가지 확장가능하도록 다양한 인터페이스를 노출하고 있더군요. IE에서 보여지는 UI를 변경하고 싶을때는 IDocHostShowUI, IDocHostUIHandler 등을 구현해주면 다음과 같은 것들을 할 수 있습니다.

 

* 마우스 오른쪽 클릭시 뜨는 메뉴를 커스터 마이징 : IDocHostUIHandler::ShowContextMenu

* IE에서 띄우는 메시지 박스 커스터 마이징 : IDocHostShowUI::ShowMessage

 

위의 두 인터페이스를 구현시 다음을 참고

MFC : http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/samples/internet/browser/driller/default.asp (Driller(MFC))

ATL : http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/samples/internet/browser/atlbrowser/default.asp (ATLBrowser)

 

 

그리고 팝업창 띄우는 것을 막으려면 http://www.codeproject.com/atl/popupblocker.asp



: