我需要捕获MS IE activex控件中的脚本错误(称为WebBrowser)。
我做了上面的事情,我知道它的工作原理是因为调用了我的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&#34;禁用nnn&#34;的脚本调试。两个选项都关闭了。 MSIE是 v9.0.8112.16421 。
注意:我没有在Delphi下对此进行标记,因为那里的所有本地语言都可以很容易地翻译成Delphi,甚至是某些托管语言,如VB或C#。
相关链接:
答案 0 :(得分:1)
这是多年来最愚蠢的虫子!不认真!
MS,你真的很厌烦这个;)
我得到了它的工作,我的代码从一开始就是正确的(即,两天前;))
正如文章所述,您需要 Disable Script Debugging (Internet Explorer)
未选中。
但 Disable Script Debugging (Other)
(在互联网选项&gt;高级版中)。
是的,那是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;
// ...