WebBrowser(MSIE) - 使用IOcCommandTarget的Exec捕获JS错误

时间:2011-03-27 16:23:26

标签: delphi debugging internet-explorer activex

我需要捕获MS IE activex控件中的脚本错误(称为WebBrowser)。

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

我做了上面的事情,我知道它的工作原理是因为调用了我的Exec方法,但问题出在这里;仅在nCmdID设置为$00000037OLECMDID_PAGEACTIONBLOCKED)时调用一次,但从不$00000028OLECMDID_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&#34;禁用nnn&#34;的脚本调试。两个选项都关闭了。 MSIE是 v9.0.8112.16421

注意:我没有在Delphi下对此进行标记,因为那里的所有本地语言都可以很容易地翻译成Delphi,甚至是某些托管语言,如VB或C#。


相关链接:

1 个答案:

答案 0 :(得分:1)

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

MS,你真的很厌烦这个;)

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

正如文章所述,您需要 Disable Script Debugging (Internet Explorer) 未选中

必须选中

Disable Script Debugging (Other) (在互联网选项&gt;高级版中)。

很奇怪吧?我从这里得到了提示: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('\Software\Microsoft\Internet Explorer\Main',False) then begin
        WriteString('DisableScriptDebuggerIE','no');
        WriteString('Disable Script Debugger','yes');
        CloseKey;
      end;
    finally
      Free;
    end;

// ...