delphi – WebBrowser(MSIE) – 使用IOleCommandTarget的Exec捕
我需要捕获MS IE activex控件中的脚本错误(称为WebBrowser).
我认为,这是由implementing the IOleCommandTarget interface in my application and listening for OLECMDID_SHOWSCRIPTERROR完成的. 我做了上面的事情,我知道它有效,因为我的Exec方法被调用,但这是问题所在;它仅在nCmdID设置为$00000037(OLECMDID_PAGEACTIONBLOCKED)时调用一次,但从不$00000028(OLECMDID_SHOWSCRIPTERROR). 为了触发该错误,我一直在使用这段代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>TEST SCRIPT</title> </head><body> <script type="text/javascript"> document.body.style.background='yellow'; setTimeout(function(){ document.body.style.background='red'; causeERROR(); // purposefully undefined function document.body.style.background='green'; },500); </script> </body> </html> 上面的代码显示一个黄色的页面,然后在几毫秒后,一个红色的页面,如果脚本继续执行(错误发生后),它应该是绿色的. 在变成红色后,我得到MSIE的脚本错误对话框,这很好.但是我的Exec方法没有被触发. 注意:上面的延迟错误是为了确保运行时错误,而不是页面加载错误,以防万一它有所不同. 我的IOleCommandTarget实现如下(Delphi): type TNulWBContainer = class(TWebBrowser,IUnknown,IOleClientSite,IDocHostUIHandler,IDispatch,IOleCommandTarget) protected { OTHER STUFF } {IOleCommandTarget Interface} function QueryStatus(CmdGroup: PGUID; cCmds: Cardinal; prgCmds: POleCmd; CmdText: POleCmdText): HResult; stdcall; function Exec(CmdGroup: PGUID; nCmdID,nCmdexecopt: DWORD; const vaIn: OleVariant; var vaOut: OleVariant): HResult; stdcall; end; implementation { OTHER STUFF } function TNulWBContainer.QueryStatus(CmdGroup: PGUID; cCmds: Cardinal; prgCmds: POleCmd; CmdText: POleCmdText): HResult; stdcall; begin prgCmds.cmdf := OLECMDF_ENABLED; Result := S_OK; //inherited QueryStatus(CmdGroup,cCmds,prgCmds,CmdText); end; function TNulWBContainer.Exec(CmdGroup: PGUID; nCmdID,nCmdexecopt: DWORD; const vaIn: OleVariant; var vaOut: OleVariant): HResult; stdcall; begin ShowMessage('nCmdID=$'+IntToHex(nCmdID,8)); Result:=OLECMDERR_E_UNKNOWNGROUP; end; end. 我在Windows 7 Ult 64bit上运行这些东西.我安装了MS Script Debugger,并且两个选项都关闭了MSIE的“禁用nnn脚本调试”. MSIE是v9.0.8112.16421. 注意:我没有在Delphi下标记这个,因为那里的所有本地语言都可以很容易地翻译成Delphi,甚至是一些托管语言,如VB或C#. 相关链接: > http://support.microsoft.com/kb/261003 解决方法
这是多年来最愚蠢的虫子!不认真!
MS,你真的对此感到厌烦;) 我得到了它的工作,我的代码从一开始就是正确的(即两天前;)) 正如文章所说,您需要取消选中禁用脚本调试(Internet Explorer). 但必须选中禁用脚本调试(其他)(在Internet选项>高级). 怪啊?我从这里得到了提示:http://www.delphigroups.info/2/9/938468.html(2005-04-29 09:42:48 PM). 是的,那是6年前的事了.我很惊讶,不,惊讶,这样的事情是可能的,并没有在任何地方记录. 编辑:程序化修复: uses Registry; // ... with TRegistry.Create do try RootKey:=HKEY_CURRENT_USER; if OpenKey('SoftwareMicrosoftInternet ExplorerMain',False) then begin WriteString('DisableScriptDebuggerIE','no'); WriteString('Disable Script Debugger','yes'); CloseKey; end; finally Free; end; // ... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |