轉(zhuǎn)帖|其它|編輯:郝浩|2011-08-18 15:17:08.000|閱讀 1915 次
概述:由于項(xiàng)目需求,最近轉(zhuǎn)戰(zhàn)客戶端,開始搞瀏覽器開發(fā)。眾所周知,現(xiàn)在在微軟平臺(tái)上開發(fā)瀏覽器,最常用的方法就是擴(kuò)展Webbrowser,但是首先要清楚的是,WebBrowser控件僅僅是對(duì)WebBrowser ActiveX 控件提供了托管包裝而已(詳細(xì)了解//msdn.microsoft.com/zh-cn/library/w290k23d(VS.80).aspx),要寫一個(gè)像點(diǎn)樣子的瀏覽器,很多方面還是要自己去擴(kuò)展的,否則開發(fā)出來的也只能是個(gè)樣子,沒多少實(shí)際功能。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
由于項(xiàng)目需求,最近轉(zhuǎn)戰(zhàn)客戶端,開始搞瀏覽器開發(fā)。眾所周知,現(xiàn)在在微軟平臺(tái)上開發(fā)瀏覽器,最常用的方法就是擴(kuò)展Webbrowser,但是首先要清楚的是,WebBrowser控件僅僅是對(duì)WebBrowser ActiveX 控件提供了托管包裝而已(詳細(xì)了解),要寫一個(gè)像點(diǎn)樣子的瀏覽器,很多方面還是要自己去擴(kuò)展的,否則開發(fā)出來的也只能是個(gè)樣子,沒多少實(shí)際功能。
本篇隨筆重點(diǎn)將介紹如何處理WebBrowser對(duì)JS的錯(cuò)誤處理問題。
可能有些朋友看到上句話會(huì)覺得,這問題不是很簡單嘛,設(shè)置一下 ScriptErrorsSuppressed屬性不就完了嘛,殊不知這樣做,像其他的譬 如網(wǎng)頁安全驗(yàn)證的彈出框,甚至很多其他網(wǎng)頁內(nèi)部彈出窗口也都被禁止掉了,如此當(dāng)然是行不通的。可能還會(huì)有一部分朋友會(huì)說,那可以通過WebBrowser 向網(wǎng)頁中注入JS錯(cuò)誤處理腳本,捕獲JS錯(cuò)誤,不是也可以嘛。那我會(huì)告訴你,這種方法在面對(duì)使用很多iframe的網(wǎng)站是也玩完。
那么接下來,我將介紹,如何更好的避免WebBrowser中的JS錯(cuò)誤。
避免錯(cuò)誤,首先要想到辦法去捕獲錯(cuò)誤,查遍了網(wǎng)上的很多資料,發(fā)現(xiàn)是要去實(shí)現(xiàn)IOleCommandTarget接口,調(diào)用接口中的Exec方法來捕獲異常,然后解決,當(dāng)然如果需要去調(diào)用IE的一些功能,也得需實(shí)現(xiàn)IObjectWithSite接口。
定義IOleCommandTarget接口、OLECMD類:
{
public enum OLECMDF
{
// Fields
OLECMDF_DEFHIDEONCTXTMENU = 0x20,
OLECMDF_ENABLED = 2,
OLECMDF_INVISIBLE = 0x10,
OLECMDF_LATCHED = 4,
OLECMDF_NINCHED = 8,
OLECMDF_SUPPORTED = 1
}
public enum OLECMDID
{
// Fields
OLECMDID_PAGESETUP = 8,
OLECMDID_PRINT = 6,
OLECMDID_PRINTPREVIEW = 7,
OLECMDID_PROPERTIES = 10,
OLECMDID_SAVEAS = 4,
OLECMDID_SHOWSCRIPTERROR = 40
}
public enum OLECMDEXECOPT
{
// Fields
OLECMDEXECOPT_DODEFAULT = 0,
OLECMDEXECOPT_DONTPROMPTUSER = 2,
OLECMDEXECOPT_PROMPTUSER = 1,
OLECMDEXECOPT_SHOWHELP = 3
}
[ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown),
Guid( "B722BCCB-4E68-101B-A2BC-00AA00404770"), ComVisible(true)]
public interface IOleCommandTarget
{
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int QueryStatus(ref Guid pguidCmdGroup, int cCmds,
[In, Out] NativeMethods.OLECMD prgCmds, [In, Out] IntPtr pCmdText);
[return: MarshalAs(UnmanagedType.I4)]
[PreserveSig]
int Exec(ref Guid pguidCmdGroup, int nCmdID, int nCmdexecopt,
[In, MarshalAs(UnmanagedType.LPArray)] object[] pvaIn, ref int pvaOut);
}
[StructLayout(LayoutKind.Sequential)]
public class OLECMD
{
[MarshalAs(UnmanagedType.U4)]
public int cmdID;
[MarshalAs(UnmanagedType.U4)]
public int cmdf;
public OLECMD()
{
}
}
public const int S_FALSE = 1;
public const int S_OK = 0;
public static readonly Guid CGID_DocHostCommandHandler =
new Guid( "f38bc242-b950-11d1-8918-00c04fc2c836");
public const int VARIANT_TRUE = -1;
public const int VARIANT_FALSE = 0;
public const int OLECMDERR_E_NOTSUPPORTED = -2147221244;
}
然后定義一個(gè)類ExtendedWebBrowserSite,去實(shí)現(xiàn)接口:
}
當(dāng)然這里主要是通過實(shí)現(xiàn)IOleCommandTarget.Exec方法去捕獲OLECMDID.OLECMDID_SHOWSCRIPTERROR消息,然后避免異常。
最后在你的擴(kuò)展的WebBrowser里面重載一下 CreateWebBrowserSiteBase方法,完成調(diào)用。
}
完成以上操作,就可以完全避免WebBrowser中的JS錯(cuò)誤發(fā)生。
由于時(shí)間有限,并沒有多少時(shí)間去詳細(xì)介紹,感興趣的朋友可以仔細(xì)去研究COM組件。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園