delphi – WebBrowser(MSIE) – 使用IOleCommandTarget的Exec捕获JS错误

前端之家收集整理的这篇文章主要介绍了delphi – WebBrowser(MSIE) – 使用IOleCommandTarget的Exec捕获JS错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要捕获MS IE activex控件中的脚本错误(称为WebBrowser).

我认为,这是由implementing the IOleCommandTarget interface in my application and listening for OLECMDID_SHOWSCRIPTERROR完成的.

我做了上面的事情,我知道它有效,因为我的Exec方法调用,但这是问题所在;它仅在nCmdID设置为$00000037(OLECMDID_PAGEACTIONBLOCKED)时调用一次,但从不$00000028(OLECMDID_SHOWSCRIPTERROR).

为了触发该错误,我一直在使用这段代码

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <Meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>TEST SCRIPT</title>
  6. </head><body>
  7. <script type="text/javascript">
  8. document.body.style.background='yellow';
  9. setTimeout(function(){
  10. document.body.style.background='red';
  11. causeERROR(); // purposefully undefined function
  12. document.body.style.background='green';
  13. },500);
  14. </script>
  15. </body>
  16. </html>

上面的代码显示一个黄色的页面,然后在几毫秒后,一个红色的页面,如果脚本继续执行(错误发生后),它应该是绿色的.

在变成红色后,我得到MSIE的脚本错误对话框,这很好.但是我的Exec方法没有被触发.

注意:上面的延迟错误是为了确保运行时错误,而不是页面加载错误,以防万一它有所不同.

我的IOleCommandTarget实现如下(Delphi):

  1. type
  2. TNulWBContainer = class(TWebBrowser,IUnknown,IOleClientSite,IDocHostUIHandler,IDispatch,IOleCommandTarget)
  3. protected
  4. { OTHER STUFF }
  5. {IOleCommandTarget Interface}
  6. function QueryStatus(CmdGroup: PGUID; cCmds: Cardinal;
  7. prgCmds: POleCmd; CmdText: POleCmdText): HResult; stdcall;
  8. function Exec(CmdGroup: PGUID; nCmdID,nCmdexecopt: DWORD;
  9. const vaIn: OleVariant; var vaOut: OleVariant): HResult; stdcall;
  10. end;
  11.  
  12. implementation
  13.  
  14. { OTHER STUFF }
  15.  
  16. function TNulWBContainer.QueryStatus(CmdGroup: PGUID; cCmds: Cardinal;
  17. prgCmds: POleCmd; CmdText: POleCmdText): HResult; stdcall;
  18. begin
  19. prgCmds.cmdf := OLECMDF_ENABLED;
  20. Result := S_OK; //inherited QueryStatus(CmdGroup,cCmds,prgCmds,CmdText);
  21. end;
  22.  
  23. function TNulWBContainer.Exec(CmdGroup: PGUID; nCmdID,nCmdexecopt: DWORD;
  24. const vaIn: OleVariant; var vaOut: OleVariant): HResult; stdcall;
  25. begin
  26. ShowMessage('nCmdID=$'+IntToHex(nCmdID,8));
  27. Result:=OLECMDERR_E_UNKNOWNGROUP;
  28. end;
  29.  
  30. 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
> http://www.codeproject.com/KB/shell/popupblocker.aspx
> http://www.tech-archive.net/Archive/VC/microsoft.public.vc.atl/2007-10/msg00158.html – 这有点神秘,我不明白(2),(4)和(5).

@H_403_30@

解决方法

这是多年来最愚蠢的虫子!不认真!

MS,你真的对此感到厌烦;)

我得到了它的工作,我的代码从一开始就是正确的(即两天前;))

正如文章所说,您需要取消选中禁用脚本调试(Internet Explorer).

但必须选中禁用脚本调试(其他)(在Internet选项>高级).

怪啊?我从这里得到了提示http://www.delphigroups.info/2/9/938468.html(2005-04-29 09:42:48 PM).

是的,那是6年前的事了.我很惊讶,不,惊讶,这样的事情是可能的,并没有在任何地方记录.

编辑:程序化修复:

  1. uses Registry;
  2.  
  3. // ...
  4.  
  5. with TRegistry.Create do
  6. try
  7. RootKey:=HKEY_CURRENT_USER;
  8. if OpenKey('\Software\Microsoft\Internet Explorer\Main',False) then begin
  9. WriteString('DisableScriptDebuggerIE','no');
  10. WriteString('Disable Script Debugger','yes');
  11. CloseKey;
  12. end;
  13. finally
  14. Free;
  15. end;
  16.  
  17. // ...
@H_403_30@ @H_403_30@

猜你在找的Delphi相关文章