【问题标题】:How can script source position determined from inside an automation call?如何从自动调用内部确定脚本源位置?
【发布时间】:2011-05-25 18:37:01
【问题描述】:

我有一个运行 JScript 的脚本主机。在某些情况下,我必须跟踪是否调用了我的暴露对象的方法以及调用它的位置。为此,我需要确定脚本引擎当前在我的对象方法中的位置。

它应该与调用我网站的 OnScriptError 时的信息相同:源代码行 source char 和我传递给 ParseScriptText 的 cookie。

是否可以在不产生错误的情况下获取此信息?

【问题讨论】:

  • 从网络上的参考资料看来,如果我向主机添加调试工具可能会有所帮助。问题是我发现的关于添加此功能的两个描述暗示了“进程调试管理器”COM 对象的实例化,如果安装了 Visual Studio 或 MS Script Debugger,则该对象仅存在于 Windows 中。我的用户很可能不会拥有其中任何一个。
  • 奇怪的是,我在网上找到了几个类似的问题,但没有任何答案。甚至不是“这是不可能的”类型的答案。我想知道怎么没人知道这件事......
  • 您使用的是哪个 COM 组件?您查看过文档吗?
  • 我在自己的脚本宿主中实现了 IActiveScriptSite、IActiveScriptSiteDebug 和 IActiveScriptSiteInterruptPoll。我使用的唯一与问题相关的外部 COM 对象是 JScript 引擎本身。

标签: delphi com automation activex windows-scripting


【解决方案1】:

您是否尝试过类似下面的代码?这应该为您提供完整的堆栈跟踪,其中包含函数名称和参数值,但没有行号。

不知道 ParseScriptText 是什么。

(来自https://github.com/emwendelin/Javascript-Stacktracehttp://eriwen.com/javascript/stacktrace-update/

other: function(curr) {
    var ANON = '{anonymous}', fnRE = /function\s*([\w\-$]+)?\s*\(/i,
        stack = [], fn, args, maxStackSize = 10;

    while (curr && stack.length < maxStackSize) {
        fn = fnRE.test(curr.toString()) ? RegExp.$1 || ANON : ANON;
        args = Array.prototype.slice.call(curr['arguments']);
        stack[stack.length] = fn + '(' + this.stringifyArguments(args) + ')';
        curr = curr.caller;
    }
    return stack;
},

【讨论】:

  • 这与浏览器中的 JavaScript 无关。这是关于托管在您自己的应用程序中的 Microsoft 的 JScript 引擎。阅读有关原始问题的 cmets。
  • 为什么这不适用于 JScript?您可以将此函数添加到代码中,稍后从 Delphi 调用它。
  • 我也想过,但问题是我无法确定执行点所在的代码块。我有不止一个 JScript 代码块,就像在 HTML 中一样。您以更复杂的形式提出的解决方案是当前的临时解决方案,但这不是我想要实现的 100%。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多