IEコントロールでJavascriptなどを含むページを表示しているときにスクリプトエラーダイアログが表示されないようにするにはIOleCommandTarget::Exec()でOLECMDID_SHOWSCRIPTERRORがIEに処理されないようにすればいい。
IOleCommandTarget::Exec()を自前で処理するには、HTMLページの読み込みが終わった時にICustomDoc::SetUIHandler()を使い、IEコントロールに対してIDocHostUIHandlerを設定する。
1.Visual Studio 2008の「ファイル」メニューにある「新規」メニューから「プロジェクト」を選択する。
2.「新しいプロジェクト」の画面で「ATL/WTLアプリケーションウイザード」を選択する。ここではプロジェクト名を「HideScriptError」とした。
3.アプリケーションウイザードが開いたら、「ユーザーインターフェース機能」のタブにある「ビューウインドウの形式」で「HTML」ページを選択して「完了」ボタンを押す。
4.(以上の操作でアプリケーションウイザードにより自動的にひな形となるソースコードが自動生成される)
5.生成したソースコードのViewクラスを開き、以下のソースコードを追加する。
#pragma once
//■以下の宣言を3行追加
#define SINKID_COMTESTEVENTS 0
#include "Exdispid.h"
#include "DnpDocHostUIHandlerImpl.h"
class CHideScriptErrorView : public CWindowImpl<CHideScriptErrorView, CAxWindow>
,public CComObjectRootEx<CComSingleThreadModel> //■追加
,public IDnpDocHostUIHandlerImpl //■追加
,public IDispatchImpl<IDispatch> //■追加
,public IOleCommandTarget //■追加
,public IDispEventImpl<SINKID_COMTESTEVENTS, CHideScriptErrorView, &DIID_DWebBrowserEvents2> //■追加
{
//■メンバー変数を追加
CComPtr<IWebBrowser2> _pIWebBrowser2;
public:
DECLARE_WND_SUPERCLASS(NULL, CAxWindow::GetWndClassName())
BOOL PreTranslateMessage(MSG* pMsg)
{
if((pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST) &&
(pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST))
return FALSE;
// このメッセージを翻訳する機会をHTML ページに与える
return (BOOL)SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg);
}
//■以下3行を追加
BEGIN_SINK_MAP(CHideScriptErrorView)
SINK_ENTRY_EX(SINKID_COMTESTEVENTS, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
END_SINK_MAP()
//■以下5行を追加
BEGIN_COM_MAP(CHideScriptErrorView)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(IDocHostUIHandler)
COM_INTERFACE_ENTRY(IOleCommandTarget)
END_COM_MAP()
BEGIN_MSG_MAP(CHideScriptErrorView)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy) //■1行追加
END_MSG_MAP()
//■OnDocumentCompleteを追加
HRESULT _stdcall OnDocumentComplete(IDispatch* pDisp, VARIANT* URL)
{
//ドキュメントを読み込み終わった時点でUIHandlerを変更する
CComPtr<IDispatch> pIDispatch;
CComPtr<ICustomDoc> pICustomDoc;
_pIWebBrowser2->get_Document(&pIDispatch);
if(pIDispatch)
pIDispatch->QueryInterface(IID_ICustomDoc,(void **)&pICustomDoc);
if(pICustomDoc)
pICustomDoc->SetUIHandler(static_cast<IDocHostUIHandler*>(this));
return S_OK;
}
//■IOleCommandTargetの関数追加
STDMETHODIMP QueryStatus( const GUID* pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT* pCmdText )
{
return E_NOTIMPL;
}
//■IOleCommandTargetの関数追加
STDMETHODIMP Exec( const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG* pvaIn, VARIANTARG* pvaOut)
{
//コマンドがスクリプトエラーを示すものなら、エラー表示を無効にする
if(nCmdID == OLECMDID_SHOWSCRIPTERROR)
{
(*pvaOut).vt = VT_BOOL;
(*pvaOut).boolVal = VARIANT_TRUE;
return S_OK;
}
return E_NOTIMPL;
}
//■生成時処理用に関数を追加
HWND Create(HWND hWndParent, _U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
DWORD dwStyle = 0, DWORD dwExStyle = 0,
_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
{
HWND hWnd;
hWnd = __super::Create(hWndParent,rect,szWindowName,dwStyle,dwExStyle,MenuOrID,lpCreateParam);
if(hWnd == NULL)
return NULL;
_pIWebBrowser2 = NULL;
QueryControl(&_pIWebBrowser2);
if(_pIWebBrowser2 == NULL)
{
ATLASSERT(0);
return hWnd;
}
//IEとの接続
Advise(_pIWebBrowser2);
return hWnd;
}
//■IEからの切断処理を追加
LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
{
bHandled = FALSE;
if(_pIWebBrowser2)
Unadvise(_pIWebBrowser2);
_pIWebBrowser2 = NULL;
return 0;
}
};
6.「MainFrm.h」を開き、
CHideScriptErrorView m_view;という部分を
CComObject<CHideScriptErrorView> m_view;に変更する。
7.最後に「DnpDocHostUIHandlerImpl.h」というファイルを作成し、その内容を以下のようにする。
#pragma once
///
///\brief
/// IDocHostUIHandler実装補助用クラス///
///実処理はないがS_FALSEやS_OKを返す仮想関数もある
///
class IDnpDocHostUIHandlerImpl :
public IDocHostUIHandler
{
virtual HRESULT STDMETHODCALLTYPE ShowContextMenu(
/* [in] */ DWORD dwID,
/* [in] */ POINT *ppt,
/* [in] */ IUnknown *pcmdtReserved,
/* [in] */ IDispatch *pdispReserved)
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE GetHostInfo(
/* [out][in] */ DOCHOSTUIINFO *pInfo)
{
return S_FALSE;
}
virtual HRESULT STDMETHODCALLTYPE ShowUI(
/* [in] */ DWORD dwID,
/* [in] */ IOleInPlaceActiveObject *pActiveObject,
/* [in] */ IOleCommandTarget *pCommandTarget,
/* [in] */ IOleInPlaceFrame *pFrame,
/* [in] */ IOleInPlaceUIWindow *pDoc)
{
return S_FALSE;
}
virtual HRESULT STDMETHODCALLTYPE HideUI( void)
{
return S_FALSE;
}
virtual HRESULT STDMETHODCALLTYPE UpdateUI( void)
{
return S_FALSE;
}
virtual HRESULT STDMETHODCALLTYPE EnableModeless(
/* [in] */ BOOL fEnable)
{
return S_FALSE;
}
virtual HRESULT STDMETHODCALLTYPE OnDocWindowActivate(
/* [in] */ BOOL fActivate)
{
return S_FALSE;
}
virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivate(
/* [in] */ BOOL fActivate)
{
return S_FALSE;
}
virtual HRESULT STDMETHODCALLTYPE ResizeBorder(
/* [in] */ LPCRECT prcBorder,
/* [in] */ IOleInPlaceUIWindow *pUIWindow,
/* [in] */ BOOL fRameWindow)
{
return S_FALSE;
}
virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(
/* [in] */ LPMSG lpMsg,
/* [in] */ const GUID *pguidCmdGroup,
/* [in] */ DWORD nCmdID)
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE GetOptionKeyPath(
/* [out] */
__out LPOLESTR *pchKey,
/* [in] */ DWORD dw)
{
return S_FALSE;
}
virtual HRESULT STDMETHODCALLTYPE GetDropTarget(
/* [in] */ IDropTarget *pDropTarget,
/* [out] */ IDropTarget **ppDropTarget)
{
return S_FALSE;
}
virtual HRESULT STDMETHODCALLTYPE GetExternal(
/* [out] */ IDispatch **ppDispatch)
{
return E_NOTIMPL;
}
virtual HRESULT STDMETHODCALLTYPE TranslateUrl(
/* [in] */ DWORD dwTranslate,
/* [in] */
__in __nullterminated OLECHAR *pchURLIn,
/* [out] */
__out OLECHAR **ppchURLOut)
{
if(ppchURLOut)
*ppchURLOut = NULL;
return S_FALSE;
}
virtual HRESULT STDMETHODCALLTYPE FilterDataObject(
/* [in] */ IDataObject *pDO,
/* [out] */ IDataObject **ppDORet)
{
return S_FALSE;
}
};