文章編號: 317024 - 上次校閱: 2005年1月3日 - 版次: 3.0

指令碼錯誤通知並不會傳送給 WebBrowser 主控件的 Exec 方法

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

徵狀

當您在 Visual C++ 中撰寫 WebBrowser 控制項主應用程式時您可能會使用下列 「 Microsoft 知識庫 」 文件中資訊來產生通知的指令碼錯誤:
261003? (http://support.microsoft.com/kb/261003/ ) 如何為 WebBrowser 控制項主機處理指令碼錯誤
不過,此通知可能不一致: 在網際網路總管 5.5 及網際網路總管 6.0 主應用程式可能會收到通知,某些安裝上,而不是在其他人。或者,安裝網際網路總管 5.5 與 Microsoft Windows 平台上, 不可能會收到第一次通知,但所有的後續通知適當地觸發對 Exec 方法呼叫。

發生的原因

這種行為是經過設計的網際網路檔案總管 6.0 中。如果清除 停用指令碼偵錯] 核取方塊將不會啟動 OLECMDID_SHOWSCRIPTERROR 命令 ID (在 [工具] 功能表上按一下 [網際網路選項,] 然後按一下 [進階])。行為是網際網路總管 6.0 已解析的網際網路檔案總管 5.5 中有錯誤。

如需有關這個問題的詳細資訊,按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
263100? (http://support.microsoft.com/kb/263100/ ) OL2000: 超連結不會開啟您的網際網路瀏覽器的新執行個體

解決方案

雖然您可以以程式設計方式設定登錄設定 停用指令碼偵錯] 核取方塊背後,這會影響 Internet Explorer] 和 [不只是 WebBrowser 主機電腦上的所有其他 WebBrowser 主機的行為。幸運的是,您可以保證 OLECMDID_SHOWSCRIPTERROR 訊息引發不論組態的每一部電腦上所插入至目前的文件的指令碼基礎 onerror 事件處理常式。這可以從您的主機 DWebBrowser2::DocumentComplete() 事件處理常式來完成。

如其他有關如何接收 Microsoft 基礎類別 (MFC) 和使用中的樣板程式庫 (ATL) 中的事件的資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
247073? (http://support.microsoft.com/kb/247073/ ) CustWBC.exe: ATL HTML 控制項自訂 WebBrowser 控制項
範例應用程式示範如何從 MFC 應用程式接收事件的 Internet Explorer,請造訪下列 MSDN 網站:
http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/samples/internet/browser/MFCIEEvtSpy/default.asp (http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/samples/internet/browser/MFCIEEvtSpy/default.asp)
下列範例程式碼撰寫 MFC 對話方塊方塊應用程式 ; 主體可以剪下,並貼入,連同該巨集 ATL 或 MFC 的主機:
#define CHECK_HR(hr,label) \ 
if(FAILED(hr)) \ 
{	goto label; \ 
}

#define RRELEASE(ptr) \ 
if(ptr) \ 
{	ptr->Release(); \ 
	ptr = NULL; \ 
}

// Get the DOM associated with the WebBrowser that threw this event, and
// inject an onerror tag into the page in hopes of receiving an 
// OLECMDID_SHOWSCRIPTERROR message. (This is a bug in Internet Explorer 6.)
// NOTE: pBrowser is the IWebBrowser2 for the FRAME, IFRAME, or primary 
// that just finished loading our document. If you have a FRAMESET with 
// three FRAMEs, you will see this handler called four times: once for 
// each FRAME and once for the FRAMESET after all FRAMEs have loaded. 
// We're sinking each individual FRAME in this sample; to sink only the 
// topmost FRAME, test the IUnknown of our m_pBrowser against the IUnknown 
// of this method's pBrowser, and sink only when these two are equal. 
void CSimpleBrowserDlg::OnDocumentComplete(LPDISPATCH pBrowser, LPVARIANT url) 
{
	IWebBrowser2 *thisBrowser		= NULL;
	IDispatch *docDisp			= NULL;
	IHTMLDocument3 *doc		= NULL;
	IHTMLElement *elem			= NULL;
	HRESULT hr = S_OK;

	hr = pBrowser->QueryInterface(IID_IWebBrowser2, reinterpret_cast<void **>(&thisBrowser));
	CHECK_HR(hr, cleanup);
	hr = thisBrowser->get_Document(&docDisp);
	CHECK_HR(hr, cleanup);
	hr = docDisp->QueryInterface(IID_IHTMLDocument3, reinterpret_cast<void**>(&doc));
	CHECK_HR(hr, cleanup);
	RRELEASE(docDisp);

	// Get the documentElement for the document object, and then call 
	// IHTMLElement::insertAdjacentHTML() to add the onerror SCRIPT 
	// handler tag.
	hr = doc->get_documentElement(&elem);
	CHECK_HR(hr, cleanup);
	// NOTE: The &nbsp, or some other visible HTML, is required. Internet Explorer will not
	// parse and recognize the script block without some visual HTML to
	// accompany it.
	hr = elem->insertAdjacentHTML(L"afterBegin", L"&#xa0;<SCRIPT For='window' Event='onerror'>var noOp = null;</SCRIPT>");

	// Cleanup.
cleanup:
	RRELEASE(elem);
	RRELEASE(thisBrowser);
	RRELEASE(doc);
}
				

狀況說明

這種行為是經過設計規劃的。

其他相關資訊

如果要重現問題的步驟

  1. 在 ATL 或 MFC 應用程式中建立 WebBrowser 控制項主機。
  2. 您可以使用知識庫文件 (在本文 < 原因 > 一節中連結) 的 Q263100 您主機上實作 IOleCommandTarget 介面。MFC 使用者也可能會想要如秘訣,請參閱下列 「 知識庫 」 文件:
    141277? (http://support.microsoft.com/kb/141277/ ) 如何覆寫 MFC 應用程式中的介面
  3. 放置一個中斷點內部分您 Exec 方法,會攔截 OLECMDID_SHOWSCRIPTERROR 命令 ID。
  4. 將下列 HTML 檔案儲存到本機主機的根 Web 伺服器為 testError.htm
    <HTML>
    
    <SCRIPT>
    
    function load() {
    	/// obj1 is undefined, so this will produce a scripting error.
    	obj1.callMethod();
    }
    
    </SCRIPT>
    
    <BODY onload="load();">
    
    
    
    </BODY>
    
    </HTML>
    					
  5. 如果您還未做這樣的處理稍早,請啟動 Internet Explorer,按一下 [工具] 功能表上的 [網際網路選項]、 按一下 [進階],然後再按一下以清除 [停用指令碼偵錯] 核取方塊,在 [瀏覽] 類別。
  6. 啟動您 WebBrowser 主應用程式,並瀏覽到下列網站:
    http://localhost/testError.htm
    請注意絕對不會執行您回應 OLECMDID_SHOWSCRIPTERRORExec 實作的程式碼區塊。

這篇文章中的資訊適用於:
  • Microsoft Internet Explorer 5.5
  • Microsoft Internet Explorer (Programming) 6.0
關鍵字:?
kbmt kbnofix kbprb KB317024 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:317024? (http://support.microsoft.com/kb/317024/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
Retired KB Article依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。