6

ブラウザヘルパーオブジェクト(BHO)として実装されたIE拡張機能があります。ページの他のスクリプトがローカルスクリプトファイルを動的にロードするためにそれを使用できるように、ページのウィンドウオブジェクトに追加するC++で記述されたユーティリティ関数があります。ただし、これらのローカルスクリプトファイルへの相対パスを解決するには、関数を呼び出すJavaScriptファイルのパスを決定する必要があります。

  • myfunc()C ++で記述され、ページのJavaScriptに公開されています
  • file:///path/to/some/javascript.js
  • (追加のスタックフレーム)

myfunc()トップフレームから、スクリプト呼び出しがfile:///path/to/some/javascript.jsにあるという情報を取得したいと思います。

私は最初、IActiveScriptDebugインターフェイスを使用してユーティリティ関数からスタックトレースを取得できると思っていました。ただし、インターフェイスまたは関連ドキュメントIActiveScriptからインターフェイスを取得することは不可能のようです( IE8の複数フレームJSの完全なコールスタックを参照)。IWebBrowser2

私が考えることができる唯一のことは、独自のスクリプトデバッガー実装を登録myfunc()し、デバッガーに侵入することです。ただし、これがデバッガーに侵入するかどうかについてユーザーにプロンプ​​トを表示せずに機能するかどうかについては懐疑的です。

このアプローチのより徹底的なテストを行う前に、これが機能する可能性があるかどうかについて誰かが決定的な情報を持っているかどうか、および/またはC++で記述された関数がスクリプトエンジンからスタックトレースを取得できるようにする代替アプローチを提案できるかどうかを確認したいと思いましたそれを呼び出しました。

4

2 に答える 2

1

ロードする各スクリプトには ID があり、myfunc() を呼び出すスクリプトの各メソッドは、この ID を myfunc() に渡すことができます。つまり、最初に myfunct() を変更し、最後にスクリプトと呼び出しを変更する必要があります。

于 2012-06-07T12:03:20.130 に答える
-1

この回答は、元の質問で説明した実際の問題をどのように解決したかを説明しています。実際に根拠のないことが判明した問題を解決する方法について仮定を立てていたので、質問の説明は良くありません。私が実際にやろうとしていたのは、現在実行中のスクリプトのパスを特定することです。これをより正確に反映するために、質問のタイトルを変更しました。

スクリプトは HTML ドキュメントがロードされたときに実行されるため、これは実際にはかなり簡単に実現できます。そのため、タグによって読み込まれる JavaScript を現在実行している場合script、そのscriptタグは常にドキュメントの最後のスクリプト タグになります (ドキュメントの残りの部分がまだ読み込まれていないため)。srcしたがって、この問題を解決するには、最後のスクリプト タグの属性の URL を取得し、それに基づいて相対パスを解決するだけで十分です。

もちろん、これは HTML ページに直接埋め込まれたスクリプトでは機能しませんが、とにかく悪い習慣 (IMO) であるため、これは非常に重要な制限のようには見えません。

于 2012-09-18T14:46:57.867 に答える