Internet Explorer에서 스크립트(script) 오류(error)창 않뜨게 하기
개발 2007. 10. 29. 12:19저자 : hanburn
날짜 : 2007-10-26
이것은 네이버에서 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