版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
IE8TabBHO/Tab进程里面被加载,所以当debuggerIEIE8的进程模型结构(IEBlog)BHO控件/Tab进程。TabIETab进程被创建的时候,系统自动把调试器启动并且attach到新创建的进程。接下来讲解如何配置系统自动调试:1)HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ImageFileExecutionOptions下面创建一个iexplore.exe键。2)在iexplore.exe键里面创建一个字符串值(REG_SZ)"Debugger",并将内容设置成调试器的路径VisualStudio作为调试器,那么路径如下(VisualStudioJIT调试器一般在system32目录):"Debugger":C:\WINDOWS\system32\vsjitdebugger.exeWinDBGWinDBG.exe(WinDBGC:\Debuggers)"Debugger":C:\Debuggers\windbg.exeregedit的截图,看起来更加直观一些:VisualStudio设置:WinDBG调试IE8设置:) IE 编 程 精 选/bbs/printpage.asp?BoardID=6&ID=1002如何使用BHO定制你的InternetExplorer浏览器原文:微软公司DinoEsposito编译:朱先中原文出处:BrowserHelperObjects:TheBrowsertheWayYouWantIt
摘 自 :一、简介Web――Web浏览器控件转变成一个功能齐全的浏览器如InternetInternetExplorer该多好?BHO(BrowserHelper,以下皆简称BHO)正是用来实现此目的的。二、关于软件定制――事情――但它还是长时间以来的唯一的选择。Win32API的到来,进程间子类化不再被鼓励使用并愈发变得困难起来。当然,InternetExplorer浏览器和它的所要实现的。三、什么是BHO?从某种观点看,InternetExplorer同普通的Win32程序没有什么两样。借助于BHO,你可以写一个进程内COMBHO能够探测到GoBack、GoForward、DocumentCompleteBHO能够存取浏BHO位间谍(注意这是微软允许的合法工作。在进一步了解BHO对象依托于浏览器主窗口。实际上,这意味着一旦一个浏览器窗口产生,一个新的BHO任何BHO对象与浏览器实例的生命周期是一致的BHO仅存在于InternetExplorer4.0及以后版本中。MicrosoftWindows?WindowsWindowsorWindows4.0操作系统的话,也就一块运行了活动桌面外壳4.71,BHO也被Windows资源管理器所支持。BHO是一个COMInternetExplorer查询那个键并把该键下的所有对象预以加载。InternetExplorer浏览器初始化这一对象并要求某一接口功能ExplorerIUnknown指针到BHO对象。见图一:图一ie浏览器如何装入和初始化BHO对象,BHO场所(site)是用于实现通信的COM接口浏览器可能在注册表中发现一系列的CLSID,并由此为每个CLSID建立一个进程中实例。结InternetExplorer的COM特性,即使被装入到它的进程空间中于事(你的野心实现)也不一定会有多大帮助。用另一说法,BHO需要建立一个私有的基于COMBHO应该实现一个称为IObjectWithSite的接口。事实上,通过接口IobjectWithSite,InternetExplorer可以传递它的IUnknownBHO的接口,如IWebBrowser2、IDispatch和IConnectionPointContainer。另外一种分析BHO对象的途径与InternetExplorer外壳扩展有关。我们知道,一个WINDOWS外壳扩展即是一个进程内的COMWindows资源管理器执行某种――如显示上下文菜单。通过建立一个实现几个COM接口的COM模块,Windows资源管理器能够发现的方法注册BHO――BHO仍有许多共同的特点。如下表一:表一外壳扩展与BHO相近特性比较特性外壳扩展BHO对象加载者Windows资源管理器InternetExplorer(和外壳4.17及以上版本的Windows资源管理器)击活动作在某类文档上的用户动作(即单击右键)打开浏览器窗口何时卸载参考计数达到0的几秒之后导致它加载的窗口关闭时COM进程中DLLCOMDLLCOMCOMBHO的注册入口接口需求依赖于外壳扩展的类型IObjectWithSite如果你对SHELL扩展编程有兴趣的话,可以参考MSDNBHO的生存周期不仅仅为InternetExplorer4.71或者更高BHOWindows外壳版本号存于库文件shell32.dll中。表二不同版本的Windows外壳对于BHO的支持情况外壳版本安装的产品BHO的支持情况4.00WindowsNT4.0InternetExplorer4.0InternetExplorer4.0Windows9WindowsNT4.0带InternetExplorer4.0和活动桌面外壳更新InternetExplorer与Windows资源管理器Windows98InternetExplorer与Windows资源管理器5.00Windows2000InternetExplorer与Windows资源管理器BHO对象随着浏览器主窗口的显示而装入,随着浏览器主窗口的销毁而缷载。如果你打开多个浏览器窗口,多个BHO实例也一同产生。对象都被加载。举例来说,即使你只是想要见到HTMLexplorer.exe或iexplore.exeBHO"Openeachfolderinitsown对每一个文件夹以一个独立窗口打开BHO对象都要被加载。见图二。图二经过这样设置,你每次打开一个文件夹时,执行一个独立的explorer.exe实例,并装入已注册的BHO对象。""Windows资源管理器视图是单个的还是双视图形式。InternetExploreriexplore.exe浏InternetExplorerInternetExplorer每一个窗口在一个新的线程中被复制而不是创建一个新的进程,因此也就不需要重新载入BHO对象。BHO最有趣的地方是,它是极度动态的。每次WindowsInternetExplorer打开,装载器从注册表中读取已安装的BHOCLSID然后处理它们。如果你在打开的浏览器多个实例中间编辑注册表的话多个不同的BHO以把它内嵌在一个VisualBasicMFCInternetExplorer的强大的功能并且加上你想要的尽可能多的插件。五、关于IObjectWithSite接口即是一个DLL,它能够依附于InternetExplorer建的实例,在某些情况下也适用于Windows资源管理器。一般地,一个场所是一个中间对象,它位于容器对象与被包容对象之间。通过它,IoleClientSite,被包容对象要实现接口IOleObject。通过调用IOleObject容器对象使得被包容对象清楚地了解其HOST的环境。一旦容器对象成为InternetExplorer(或是具有WEB能力的Windows资源管理器容对象只需实现一个轻型的IObjectWithSite接口。该接口提供了以下方法:表三IObjectWithSite定义方法描述HRESULTSetSite(IUnknown*pUnkSite)接收ie浏览器的IUnknown.HRESULTGetSite(REFIIDriidvoid**ppvSite)从通过SetSite()并返回指定的接口,典型实现是查询前面保存的接口指针以进一步取得指定的接口。BHO一个函数时返回E_NOTIMPL行正确地编码。六、构造自己的BHO对象一个BHO对象就是一个进程中服务器ATLATLIObjectWithSite接口的足够好ATLCOM向导本地支持的已定义好的对象类型当中InternetExplorerBHOATLInternetExplorer上是一个简单对象也就是说,是一个支持IUnknown和自注册,还有接口IObjectWithSiteCOM服务器。如果你在ATL的类CViewSource,你将从向导中得到下列代码:class ATL_NO_VTABLE CViewSource : publicCComObjectRootEx<CComSingleThreadModel>,publicCComCoClass<CViewSource,&CLSID_ViewSource>, public IObjectWithSiteImpl<CViewSource>, publicIDispatchImpl<IViewSource&IID_IViewSource&LIBID_HTMLEDITLib>向导已经使类从接口IObjectWithSiteImpl继承,这是一个ATL模板类,它提供了接口IObjectWithSite的基本实现。一般情况下,没有必要重载成员函数GetSite()。取而代之的SetSite()ATL实际上仅仅把一个IUnknown接口指针存储在成员变量m_spUnkSite中。BHOBHO对象将依附于InternetHTMLHTML代码的任何改动立即反映在浏览器中。HTMLInternetExplorer共享整个桌面空间,见图三。图三BHO对象在使用中。它依附于InternetExplorer,并显示一个窗口来显示当前正浏览的网页源码。还允许你源码进行修改。InternetExplorer的浏览机制,其实它只不过是WebBrowser件的一个实例而已。这个例子可以分解为以下五步来实现:探测谁在装入这个对象,是InternetExplorer还是Windows获取接口IWebBrowser2以实现Web浏览器对象;捕捉Web浏览器的特定事件;存取当前文档对象,确定它是一份HTML管理对话框窗口以实现HTML源码的显示;DllMain()SetSite()WebBrowser置。请详细分析以下步骤。七、探测谁在调用这个对象BHOInternetExplorerWindows资源管理器(版本4.71或者更高)所加载。所以我专门设计了一个BHOHTML网页,因此这个BHO与资源管理器毫无关系。如果一个Dll不想被调用者一起加载,只需在DllMain()中实现了探明谁在调用该对象后返回FALSE即可。参看下面代码:if(dwReason==DLL_PROCESS_ATTACH){TCHAR返回调用者模块的名称,第一个参数应为NULL,详见msdn。GetModuleFileName(NULL,pszLoaderMAX_PATH);_tcslwr(pszLoader);if_T("explorer.exe")))return一旦知道了当前进程是Windows资源管理器,可立即退出。DLLInternetExplorer的执行文件个受害者就是regsvr32.exe(该程序用于自动注册对象。if(!_tcsstr(pszLoader_T("iexplore.exe")))你不能够再次注册该DLLregsvr32.exe试图装入DLL以激活函数DllRegisterServer()八、与Web浏览器取得联系SetSite()方法正是BHO允许发生一次的任务。当你用InternetExplorer打开一个URL时,你应该等待一系列的事IWebBrowser2(WebBrowser对象面用ATL灵敏指针加以封装:CComQIPtr< IWebBrowser2 , m_spWebBrowser2;CComQIPtr<IConnectionPointContainer ,&IID_IConnectionPointContainer>源代码部分如下所示:HRESULTCViewSource::SetSite(IUnknown*pUnkSite){//检索并存储IWebBrowser2指针m_spWebBrowser2=pUnkSite;if(m_spWebBrowser2==NULL)returnE_INVALIDARG;//检索并存储IConnectionPointerContainer指针m_spCPC=m_spWebBrowser2;if(m_spCPC==NULL)returnE_POINTER;检索并存储浏览器的句HWND.并且安装一个键盘钩子备后用RetrieveBrowserWindow();//为接受事件通知returnConnect();}IWebBrowser2也可以在事件刚刚发生时查询IConnectionPointContainer。这里,SetSite()检索了浏览器的句柄HWNHWND用于后面InternetExplorer窗口的移动或尺寸调整。这里的钩子用来实现热键功能,用户可以按动热键来显示/隐藏代码窗口。九、从InternetExplorer浏览器取得事件当你导向一个新的URL时,浏览器最需要完成的是两种事件:下载文档并为之准备HOST环境。也就是说,它必须初始化某对象并使该对象从外部可以利用。针对不同的文档类型或者装入一个已注册的MicrosoftActiveX?服务器来处理该文(如Word对.doc文件的处理)或者初始化一些内部组件来分析文档内容并生成和显示该文档。对于HTML网页就是这样,其内容由于DHTML 对象作用而变得可用。当文档全部下载结束,DownloadComplete事件被激活这并不是说这样利用对象模型就可以安全地管理文档的内容了。事实上,DocumentComplete事件仅指明一切已经结束,文档已准备好了(注意DocumentComplete事件仅在你第一次存取URL时到达,如果你执行了刷新动作,你仅仅收到一个DocumentComplete事件)。BHOIConnectionPointIDispatch指针来调用FindConnectionPoint――向连接点对象(正是通过这个连接点对象来取得要求的外向接口,此时是DIID_DWebBrowserEvent。下列代码显示了连接点的发生情况:HRESULTCViewSource::Connect(void){HRESULThr;CComPtr<IConnectionPoint>spCP;//为Web浏览器事件而接收(receive)连接点hr=m_spCPC->FindConnectionPoint(DIID_DWebBrowserEvent2&spCP);ifreturnhr;//IDispatch接口上的相应的函数。hr=spCP->Advise(reinterpret_cast<IDispatch*>(this),&m_dwCookie);returnhr;通过调用接口IConnectionPointAdvise()BHO告诉浏览器它对它产生的事件很感兴趣。由于COM事件处理机制,所有这些意味着BHO把IDispatch接口指针提供给浏览器。浏览器将回调IDispatchInvoke()方法,以事件ID值作为第一参数:HRESULTCViewSource::Invoke(DISPIDdispidMember,REFIIDriid,LCIDlcid,WORDDISPPARAMS*VARIANT*EXCEPINFO*pExcepInfo,UINT*puArgErr){if(dispidMember==DISPID_DOCUMENTCOMPLETE){OnDocumentComplete();m_bDocumentCompleted=true;}:}切记,当事件不再需要时,应该使之与浏览器分离。如果你忘记了做这件事情,BHO对象将被锁定,即使在你关闭浏览器窗口之后。很明显,实现分离的最佳时机是收到事件OnQuit时。十、存取文档对象BHO已经有一个参照指向InternetExplorerWeb器控件以接收所有它产生的事件。当网页被全部下载并正确初始化后,我们就可以通过DHTMLWeb浏览器的文档属性返回一个指向文档对象的IDispatch接口的指针:CComPtr<IDispatch> pDisp;HRESULT hr =m_spWebBrowser2->get_Document(&pDisp);get_Document()方法取得的仅仅是一个接IDispatch指针背后存在一个HTMLVB话,可以用下面代码:DimdocAsObjectSetdoc=WebBrowser1.DocumentIfTypeName(doc)="HTMLDocument"Then\'\'获取文档内容并予以显示Else\'\'DisabledisplaydialogEndIfget_Document()IDispatchInternetExplorerHTMLActiveX文档容器。这样一来,难以保证当前浏览对象就是一个HTML――IDispatch指针真正指向一个HTMLIHTMLDocument2接口一定成功。IHTMLDocument2接口包装了DHTML对象模型用来展现HTML码实现这些功能:CComPtr<IDispatch> pDisp;HRESULT hr =m_spWebBrowser2->get_Document(&pDisp);CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2>spHTML;spHTML=pDisp;if(spHTML){//显示else//disabletheCodeWindowcontrols}如果IHTMLDocument2spHTML指针将是NULL。HTML页把它所有的内容封装在标签<BODY>中,DHTML对象模型要求你取得一个指向Body对象的指针:CComPtr<IHTMLElement>m_pBody;hr=spHTML->get_body(&m_pBody);奇怪的是,DHTML<BODY><HEAD>。其内容被处理并存HTML原始文件中提取这部分的RAW部分取得的内容足够了<BODY>…<间的HTML代码部分,可以把outerHTML属性内容读取到一个BSTR变量中:BSTRbstrHTMLText;hr=m_pBody->get_outerHTML(&bstrHTMLText);UNICODE至ANSI转化和设置编辑框控件的问题。下面代码实现这些功能:HRESULT CViewSource::GetDocumentContent(){ USES_CONVERSION; // 获取WebBrowser 的文档对象 CComPtr<IDispatch> pDisp; HRESULT hr =m_spWebBrowser2->get_Document(&pDisp);if(FAILED(hr))returnhr;//确保我们取得的是一个IHTMLDocument2接口指针//让我们查询一下IHTMLDocument2接口(使用灵敏指针)CComQIPtr<IHTMLDocument2,&IID_IHTMLDocument2>spHTML;spHTML=pDisp; // 抽取文档源代码 if (spHTML) { // 取得BODY 对象 hr =spHTML->get_body(&m_pBody);if(FAILED(hr))returnhr;//取得HTML文本BSTRbstrHTMLText;hr=m_pBody->get_outerHTML(&bstrHTMLText);if(FAILED(hr))return//进行文本的Unicode到ANSI的转换LPTSTRpsz=TCHAR[SysStringLen(bstrHTMLText)];,OLE2T(bstrHTMLText));//相应的调整HWNDhwnd=m_dlgCode.GetDlgItem(IDC_TEXT);EnableWindow(hwnd,true);hwnd=m_dlgCode.GetDlgItem(IDC_APPLY);true);//设置代码窗口中的文本m_dlgCode.SetDlgItemText(IDC_TEXT,psz);delete[]psz;}else//文档不是一个HTML页{m_dlgCode.SetDlgItemText(IDC_TEXT,"");HWNDhwnd=m_dlgCode.GetDlgItem(IDC_TEXT); EnableWindow(hwnd , false); hwnd =m_dlgCode.GetDlgItem(IDC_APPLY);EnableWindow(hwnd,false);}returnS_OK;}因为我要运行这段代码来响应DocumentComplete事件通知,每个新的页自动地而且敏捷被处理DHTML对象模型使你能够随意修改网页的结构,但这一变化在按F5刷新后全部复原。你还要处理一下DownloadComplete 事件以刷新代码窗口(注意,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 冠心病患者出院指导
- 规章制度公示通知
- 小说大纲模版
- 二年级数学下册有余数的除法练习题
- 化工设备员工作总结
- 解析汉语中的“了,着,过”
- 机械加工技术要求
- 学校疫情处置领导小组及责任分工
- 软件系统功能说明文档-模板
- 我国类风湿关节炎用药市场分析
- 猪场粪污消纳协议书
- 高效空气源热泵采暖系统设计
- 温室气体培训课件
- 房屋买卖委托协议书
- GB/T 44949-2024智能热冲压成形生产线
- 房性心律失常的护理
- 老年大学教育服务流程
- (正式版)JB∕T 11108-2024 建筑施工机械与设备 筒式柴油打桩锤
- 滨州山东滨州市新闻传媒中心招聘事业单位人员控制总量备案管理工作人员65人笔试历年典型考题及考点附答案解析
- 霉菌毒素与脱毒素产品
- (正式版)JBT 11270-2024 立体仓库组合式钢结构货架技术规范
评论
0/150
提交评论